User:Miemie Method/命令

来自Minecraft基岩版开发Wiki

命令(Command)是一种通过输入特定文本字符串而激活高级功能的系统,可以使游戏世界得以动态运行。命令可以通过多种形态参与模组的开发,例如在世界中可以通过命令方块组成逻辑系统,在附加包中可以通过函数批量执行命令和逐刻执行命令,在GameTest框架WebSocket模组中依照更高级的逻辑执行命令等。

使用方法[编辑]

在客户端中,命令通过Minecraft的聊天屏幕输入,通过按下T键、键唤出聊天屏幕。使用/键会同时输入命令必需的前缀斜杠(/),这是一个实用的快捷键。键可浏览之前输入的文本,包含所有之前执行的命令。在输入命令时按下Tab ↹键会循环显示当前可用的命令或参数。当光标在某些参数(比如一个ID)的对应位置时,在文本框上方会展示一个可用值的列表。如果这个参数已经输入了一半,这个列表则只会展示包含当前输入内容的值。

命令方块中,命令可以以前缀斜杠开头输入,但不是必须的。在命令方块中的命令通常还需要一个可选参数,如玩家名称。

命令也可以在多人服务器的控制台中输入,但是应加入前缀/。在英语中,以这种方式执行命令的服务器管理员被称为“ghosting”。

大多数命令只能在以下状况有效:

  • 在Minecraft多人游戏服务器游戏中,由管理员或命令方块使用。
  • 在其他的多人模式游戏中,由开启局域网并允许作弊的玩家,或托管多人游戏服务器的玩家使用。
  • 在单人模式中,创建世界时开启作弊。

权限级别为0的命令所有玩家均可用。详见命令权限级别

命令权限级别[编辑]

每种命令都具有一个命令权限级别(Command Permission Level),代表要执行该命令需要多大的权限。命令权限级别分别有0、​1、​2、​3、​45六种,如下表所示。

命令权限级别枚举
键名 描述
Any 0 任何人都可以执行,是一般玩家的默认权限级别。
GameMasters 1 游戏管理员(Game Master)可以执行。
Admin 2 超级管理员(Administrator)可以执行。
Host 3 托管主机的玩家可以执行,这通常包括已经在“玩家权限”屏幕中打开“管理员命令”的玩家。
Owner 4 游戏拥有者可以执行,这通常包括服务端控制台。
Internal 5 仅供内部执行。

在具体情况,权限级别遵循以下规律。

  • 命令方块命令方块矿车的可执行的命令权限级别为1
  • 服务器控制台可执行的命令权限级别为4
  • 函数附加包中的脚本可执行的命令权限级别为1
  • 对于玩家来说:
    • 如果该玩家在服务器中,且该玩家在“玩家权限”屏幕中的“操作员命令”开关已打开,那么他可执行的命令权限级别默认为1(可在server.properties中更改)。
    • 如果该玩家在单人游戏世界或局域网世界中,且该玩家在“玩家权限”屏幕中的“操作员命令”开关已打开,那么他可执行的命令权限级别默认为3
    • 否则,他可执行的命令权限级别为0

玩家权限级别[编辑]

每个玩家也有一个玩家权限级别(Player Permission Level),该权限级别可以通过暂停屏幕中的“玩家权限”屏幕控制。玩家的权限级别和命令的权限级别并不完全对应。例如在单人游戏世界中,身份为管理员的玩家权限级别为2,但是具备可以执行权限级别为3的命令的能力,这是因为其对应的“管理员命令”开关已打开;在服务端中,更是会根据server.properties获得执行不同的命令权限级别的能力;身份为访客或成员的玩家可执行的命令权限级别为0,因为其对应的“操作员命令”开关没有打开。玩家权限级别分别有0、​1、​23四种,如下表所示。

玩家权限级别枚举
键名 描述
Visitor 0 访客
Member 1 成员
Operator 2 管理员
Custom 3 自定义

命令旗标[编辑]

每种命令都具有一组命令旗标(Command Flag),用于注册命令的各种属性表现。命令旗标分别有用法旗标(Usage Flag)可见性旗标(Visibility Flag)同步旗标(Sync Flag)执行旗标(Excute Flag)类型旗标(Type Flag)作弊旗标(Cheat Flag)六种,他们的值分别如下。一种命令的最终命令旗标值由它所有的旗标值做位或运算得到。

用法旗标枚举
键名 描述
Normal 0x0 正常用法
Test 0x1 测试用法
可见性旗标枚举
键名 描述
Visible 0x0 可见
HiddenFromCommandBlockOrigin 0x2 以命令方块为起点不可见
HiddenFromPlayerOrigin 0x4 以玩家为起点不可见
Hidden 0x6 皆不可见
同步旗标枚举
键名 描述
Synced 0x0 同步执行
Local 0x8 本地执行
执行旗标枚举
键名 描述
Allowed 0x0 允许执行
Disallowed 0x10 禁止执行
类型旗标枚举
键名 描述
None 0x0 无类型
Message 0x20 消息类型
作弊旗标枚举
键名 描述
Cheat 0x0 作弊命令
NotCheat 0x40 非作弊命令

其中,命令旗标有几个值的注意的点。

  • 用法旗标为Test的命令又被称为开发者命令,他们在游戏内表现为蓝色字体的命令。
  • 可见性旗标并不真正意味着可见或不可见。例如,就算一个命令没有HiddenFromCommandBlockOrigin旗标,但是他的权限级别大于1,那么依旧无法被命令方块执行。在游戏内显示的效果和具有HiddenFromCommandBlockOrigin旗标是相同的。
  • 作弊旗标为Cheat的命令只有在设置中开启作弊后才能够可见和执行,该操作会禁用世界的成就的获取。

命令起点[编辑]

命令起点(Command Origin)即一个命令执行的起点。根据起点的不同,命令的执行效果可能也会发生差异。不同的起点具备执行不同权限级别的命令的能力,同时不同的起点能够执行的命令类型也有差异。

命令起点类型[编辑]

不同的命令起点类型代表着不同的命令来源。命令起点具有多种类型,如下表所示。

命令起点类型枚举
键名 描述
Player 0 玩家
CommandBlock 1 命令方块
MinecartCommandBlock 2 命令方块矿车
DevConsole 3 开发控制台
Test 4 测试
AutomationPlayer 5 自操玩家
ClientAutomation 6 客户端自操
DedicatedServer 7 专用服务器
Entity 8 实体
Virtual 9 虚拟
GameArgument 10 游戏参数
EntityServer 11 实体服务端
Precompiled 12 预编译
GameMasterEntityServer 13 游戏管理员实体服务端
Scripting 14 脚本

命令起点系统[编辑]

命令起点系统用于处理复杂的命令起点。以下是当前游戏内具备的命令起点系统。

命令起点系统枚举
键名 描述
AnimationTimelineSystem 0 动画时间轴系统

命令重载[编辑]

命令重载(Command Overload)是代表一个命令的一种用法的抽象概念。每一种命令都具备一个或多个重载,而每一个重载则代表该命令的“一种执行方式”。以/help为例,该命令具有两种重载,分别是/help [command: CommandName]/help <page: int>。在玩家在聊天栏中输入命令时,不同的命令重载将分别列举在屏幕上的自动补全候选中供玩家参考。当玩家输入一个合法的命令时,游戏引擎会自动选择合适的命令重载所代表的执行逻辑(一个特定的函数)来执行玩家的命令。

每一种命令重载都有不同的命令参数表。依旧以/help为例,/help [command: CommandName]重载具有CommandName类型的枚举参数command,而/help <page: int>重载则具有int类型的基本参数page。不同的命令重载之间互不干扰,可以粗略地认为是“不同的命令”。

事实上,重载是一个抽象概念,所以并不能通过具体的显式特点来看到。不过,正如上面所示,每一个重载都可以写作一个命令描述(Command Description)的形式。/help [command: CommandName]/help <page: int>就分别是/help命令两种重载的描述。在命令描述中由空格分开的每一部分称作该描述的一个描述符(Descriptor)。如[command: CommandName]<page: int>就分别是两个描述符。描述符通常代表着一个命令参数

命令参数[编辑]

命令参数(Command Parameter)是大部分命令重载都具有的一种属性,其对应着玩家或其他命令起点在输入命令时的一个实参。/help <page: int>重载具有一个参数page,则执行命令/help 1时实参1就是参数page的执行取值。

语义类型[编辑]

命令参数根据语义可以分为三种类型,分别是必需参数(Required Argument)可选参数(Optional Argument)字面参数(Literal Argument)。三种参数在重载的描述上具备不同的语义特征。

必需参数[编辑]

必需参数是在当前重载内必须输入的参数,如果缺少该参数将会报命令错误。必需参数的描述符使用尖括号作为字面量,显示为<name: type>,其中name是参数名,type参数类型

可选参数[编辑]

可选参数是当前重载内可以填写也可以忽略的参数,一般位于当前重载的末尾。可选参数的描述符使用方括号作为字面量,显示为[name: type],其中name是参数名,type参数类型

字面参数[编辑]

字面参数是最终的实参按照该参数的“原样”填写的参数,其描述符就是最终实参应该填写的字符串本身。比如/event entity <target: target> <eventName: string>中,第一个参数entity便是一个字面参数。字面参数也分别必需和可选两种,当字面参数为必需且为单个字面选项时,字面参数两侧不会显示任何括号,否则,字面参数将依照必需参数和可选参数的规律显示尖括号或方括号。当有多个字面选项时,选项之间用|连接,例如记分板命令的某一重载/scoreboard objectives setdisplay <list|sidebar> [objective: string] [ascending|descending]中的<list|sidebar>[ascending|descending]参数。

数据类型[编辑]

命令参数数据类型(Command Parameter Data Type)是命令参数的根本分类依据,每个命令参数都有它的数据类型。命令的参数根据数据类型可以分为基本参数(Basic Parameter)枚举参数(Enum Parameter)软枚举参数(Soft Enum Parameter)后缀参数(Postfix Parameter)。其中详细的数据类型信息如下表所示。

命令参数数据类型枚举
键名 描述
Basic 0 基本。基本参数意味着参数类型是集中基本参数类型之一,这包括intfloatvaluewildcard intoperatortargetfilepathequipment slotsstringx y zmessagetextjsonblock statescommand等类型。
Enum 1 枚举。枚举参数的参数类型为固定的某一枚举类型,如重载/gamemode <gameMode: GameMode> [player: target]中参数gameMode的类型GameMode字面参数一般都为枚举数据类型。虽然游戏内的命令描述上并不会显示字面参数的参数类型,但字面参数一般也都有自己的隐藏参数类型。
SoftEnum 2 软枚举。软枚举参数的参数类型为固定的某一软枚举类型。虽然其在命令描述中统一显示为string,但其并不是基本数据类型。
Postfix 3 后缀。后缀参数的参数类型为固定的某一后缀值,即该参数的末尾必须具备的那个值。目前唯一的后缀参数是重载/xp <amount: int>L [player: target]中的参数<amount: int>L。它的参数类型为l。虽然后缀参数的类型在其命令描述中统一显示为int,但其并不是基本数据类型。

参数类型[编辑]

命令参数类型(Command Parameter Type)是一个命令的参数在其重载的描述符中位于冒号后面的部分。字面参数虽然从命令描述中看不到参数类型,但是其也具备隐藏的参数类型。软枚举后缀参数虽然分别显示为stringint,但其真正的参数类型另有其名。

参数的类型是度量一个参数的接受值是否合法的重要判断依据。只有输入正确的参数类型的数据,一个命令才能够被游戏引擎正确解析。因此,了解每种参数类型都分别接受什么样式的值显得尤为重要。

命令符号[编辑]

命令符号(Command Symbol)是担任着命令解析过程中不可或缺的一部分的一种中间变量,其中所有参数类型都各自依托于一种命令符号而存在。几乎每种命令符号都对应着一个真正的原生符号。该原生符号用于解析该命令符号所承载的值。每种命令符号都有一个符号值,命令符号根据其值的掩码的不同分为多种类型。命令符号的掩码类型如下。

命令符号掩码类型
符号掩码类型 掩码 描述 实际符号码
Terminal 0x000000 终结符 0x000000
NonTerminal 0x100000 非终结符 0x100000
Enum 0x200000 枚举名 0x300000
Optional 0x400000 可选项 0x500000
Factorization 0x800000 分解 0x900000
Postfix 0x1000000 后缀 0x1000000
EnumValue 0x2000000 枚举值 0x2000000
SoftEnum 0x4000000 软枚举名 0x4100000

由于命令符号承载着命令语法分词的功能,因此命令符号也包括了所有的终结符和非终结符,其中命令参数的值也根据命令规则会被分解成终结符和非终结符的组合,并用于解析。EnumOptionalFactorizationSoftEnum类型的符号都是非终结符,因此在自身掩码的基础上也带有常规非终结符NonTerminal的掩码。同理,由于PostfixEnumValue也被视为终结符,所以其也带有常规终结符Terminal的掩码。

每种符号也都有一个符号字符串,用于引擎在某些地方显示该符号的语义信息。

常规终结符[编辑]

常规终结符在命令系统中也作为分词类型而存在,一般用于和非终结符一起组合成为新的非终结符,从而被引擎解析。常规终结符的类型如下。

常规终结符/分词类型枚举
键名 符号 符号字符串 描述
Error 0x0 error 技术性分词,错误
Integer 0x1 integer 一个非负整数
NInteger 0x2 ninteger 一个负整数
Identifier 0x3 identifier 一个标识符
Selector 0x4 selector 一个选择器
Slash 0x5 / 一个斜杠
Value 0x6 value 一个浮点数
RValue 0x7 rvalue 一个相对浮点数
LValue 0x8 lvalue 一个局部浮点数
Equals 0x9 = 一个等号
Comma 0xA , 一个逗号
Colon 0xB : 一个冒号
Not 0xC ! 一个非号
Asterisk 0xD * 一个星号
Hash 0xE # 一个哈希号
OpenBracket 0xF [ 一个左方括号
CloseBracket 0x10 ] 一个右方括号
OpenBrace 0x11 { 一个左花括号
CloseBrace 0x12 } 一个右花括号
String 0x13 string 一个字符串
Range 0x14 .. 一个范围号
LessThan 0x15 >[原文如此] <,一个小于号
GreaterThan 0x16 <[原文如此] >,一个大于号
PlusEquals 0x17 += 一个加等号
MinusEquals 0x18 -= 一个减等号
TimesEquals 0x19 *= 一个乘等号
DivideEquals 0x1A /= 一个除等号
ModEquals 0x1B %= 一个模等号
GreaterThanLessThan 0x1C >< 一个交换号
CmdFilePath[需要验证] 0x1D cmdFilePath 一个文件路径
Unknown 0x1E unknown 技术性分词,未知
End 0x1F end 技术性分词,结束枚举

常规非终结符[编辑]

常规非终结符是命令中最一般的非终结符。常规非终结符中的某一部分也作为基本数据类型的参数所使用的命令符号而直接解析,反过来看,所有基本数据类型的参数也全部都使用常规非终结符来解析。常规非终结符的类型如下。

常规非终结符枚举
键名 对应的参数类型 符号 符号字符串 描述
Epsilon 0x100000 eps 空字
Int 0x100001 int int INT 整数
Float[需要验证] 0x100002 FLOAT 浮点数
Val 0x100003 float float VAL 数值
RVal 0x100004 value RelativeFloat RVAL 相对数值
WildcardInt 0x100005 wildcard int CommandWildcardInt WILDCARDINT 通配符整数
Operator 0x100006 operator CommandOperator OPERATOR 运算符
Selection 0x100007 target CommandSelector<Actor>
CommandSelector<Player>
SELECTION 选择器
StandAloneSelection[需要验证] 0x100008 STANDALONESELECTION 孤立选择器
WildcardSelection 0x100009 target WildcardCommandSelector<Actor> WILDCARDSELECTION 通配符选择器
NonIdSelector 0x10000A NONIDSELECTION 空选择器
ScoresArg 0x10000B SCORESARG 单个分数参数
ScoresArgs 0x10000C SCORESARGS 分数参数的集合
ScoreSelectParam 0x10000D SCORESELECTPARAM 分数选择参数
ScoreSelector 0x10000E SCORESELECTOR 分数选择器
TagSelector 0x10000F TAGSELECTOR 标签选择器
FilePath 0x100010 filepath CommandFilePath PATHCOMMAND 文件路径
FilePathVal 0x100011 PATHCOMMANDVAL 文件路径值
FilePathCont 0x100012 PATHCOMMANDCONT 文件路径计数
IntegerRangeVal 0x100013 INTEGERRANGEVAL 整数范围值
IntegerRangePostVal 0x100014 INTEGERRANGEPOSTVAL 整数范围后值
IntegerRange 0x100015 INTEGERRANGE 整数范围
FullIntegerRange 0x100016 CommandIntegerRange FULLINTEGERRANGE 完整整数范围
SelArgs 0x100017 SELARGS 选择参数的集合
Args 0x100018 ARGS 参数的集合
Arg 0x100019 ARG 单个单数
MArg 0x10001A MARG 游戏模式参数
MValue 0x10001B MVALUE 游戏模式参数值
NameArg 0x10001C NAMEARG 名称参数
TypeArg 0x10001D TYPEARG 类型参数
FamilyArg[需要验证] 0x10001E FAMILYARG 族参数
TagArg 0x10001F TAGARG 标签参数
HasItemElement[需要验证] 0x100020 HASITEMELEMENT 具备物品元素
HasItemElements[需要验证] 0x100021 HASITEMELEMENTS 具备物品元素的集合
HasItemArg[需要验证] 0x100022 HASITEMARG 具备物品参数
HasItemArgs[需要验证] 0x100023 HASITEMARGS 具备物品参数的集合
HasItemSelector[需要验证] 0x100024 HASITEMSELECTOR 具备物品选择器
EquipmentSlotEnum[需要验证] 0x100025 equipment slots EQUIPMENTSLOTENUM 装备槽位枚举
Id 0x100026 string std::string ID 字符串
IdCont 0x100027 IDCONT 字符串计数
CoordXInt 0x100028 COORD_X_INT 整数X坐标
CoordYInt 0x100029 COORD_Y_INT 整数Y坐标
CoordZInt 0x10002A COORD_Z_INT 整数Z坐标
CoordXFloat 0x10002B COORD_X_FLOAT 浮点数X坐标
CoordYFloat 0x10002C COORD_Y_FLOAT 浮点数Y坐标
CoordZFloat 0x10002D COORD_Z_FLOAT 浮点数Z坐标
Position 0x10002E x y z CommandPosition POSITION 整数坐标组
PositionFloat 0x10002F x y z CommandPositionFloat POSITION_FLOAT 浮点数坐标组
MessageExp 0x100030 MESSAGEEXP 实验性消息
Message 0x100031 MESSAGE 消息
MessageRoot 0x100032 message CommandMessage MESSAGE_ROOT 消息根
PostSelector 0x100033 POSTSELECTOR 后选择器
RawText 0x100034 text CommandRawText RAWTEXT 原始文本
RawTextCont 0x100035 RAWTEXTCONT 原始文本计数
JsonValue 0x100036 JSON_VALUE JSON值
JsonField 0x100037 JSON_FIELD JSON字段
JsonObject 0x100038 json Json::Value JSON_OBJECT JSON对象
JsonObjectFields 0x100039 JSON_OBJECT_FIELDS JSON对象字段
JsonObjectCont 0x10003A JSON_OBJECT_CONT JSON对象计数
JsonArray 0x10003B JSON_ARRAY JSON数组
JsonArrayValues 0x10003C JSON_ARRAY_VALUES JOSN数组值的集合
JsonArrayCont 0x10003D JSON_ARRAY_CONT JSON数组计数
BlockState[需要验证] 0x10003E BLOCK_STATE 方块状态
BlockStateKey[需要验证] 0x10003F BLOCK_STATE_KEY 方块状态键名
BlockStateValue[需要验证] 0x100040 BLOCK_STATE_VALUE 方块状态值
BlockStateValues[需要验证] 0x100041 BLOCK_STATE_VALUES 方块状态值的集合
BlockStateArray[需要验证] 0x100042 block states std::vector<BlockStateCommandParam> BLOCK_STATE_ARRAY 方块状态数组
BlockStateArrayCount[需要验证] 0x100043 BLOCK_STATE_ARRAY_CONT 方块状态数组计数
Command 0x100044 COMMAND 无斜杠命令
SlashCommand 0x100045 command std::unique_ptr<Command> SLASHCOMMAND 斜杠命令

枚举名[编辑]

枚举名即枚举数据类型的参数的参数类型,他们都属于非终结符。枚举名符号值是运行时生成的,因此这些值可能会因为游戏或世界加载时初始化的命令不同而产生差异,比如,在同一个基岩引擎版本号的普通存档、开启了实验性玩法的存档和教育供应的存档之间,同样的枚举名对应的符号都将不同。零售构建的枚举名的类型如下,其中符号值仅给出了一种可能性,仅供参考。

可选项[编辑]

可选项由运行时生成。零售构建的可选项类型如下,其中符号值仅给出了一种可能性,仅供参考。

分解[编辑]

分解由运行时生成。零售构建的分解类型如下,其中符号值仅给出了一种可能性,仅供参考。

后缀[编辑]

后缀即后缀数据类型的参数的参数类型,他们属于终结符,由运行时生成。零售构建的后缀的类型如下,其中符号值仅给出了一种可能性,仅供参考。

枚举值[编辑]

软枚举[编辑]

软枚举即软枚举数据类型的参数的参数类型,他们属于非终结符,由运行时生成。零售构建的软枚举的类型如下,其中符号值仅给出了一种可能性,仅供参考。

命令规则[编辑]