用戶: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 斜槓命令

列舉名[編輯]

列舉名即列舉數據型別的參數的參數型別,他們都屬於非終結符。列舉名符號值是執行時生成的,因此這些值可能會因為遊戲或世界載入時初始化的命令不同而產生差異,比如,在同一個基岩引擎版本號的普通存檔、開啟了實驗性玩法的存檔和教育供應的存檔之間,同樣的列舉名對應的符號都將不同。零售構建的列舉名的型別如下,其中符號值僅給出了一種可能性,僅供參考。

可選項[編輯]

可選項由執行時生成。零售構建的可選項型別如下,其中符號值僅給出了一種可能性,僅供參考。

分解[編輯]

分解由執行時生成。零售構建的分解型別如下,其中符號值僅給出了一種可能性,僅供參考。

後綴[編輯]

後綴即後綴數據型別的參數的參數型別,他們屬於終結符,由執行時生成。零售構建的後綴的型別如下,其中符號值僅給出了一種可能性,僅供參考。

列舉值[編輯]

軟列舉[編輯]

軟列舉即軟列舉數據型別的參數的參數型別,他們屬於非終結符,由執行時生成。零售構建的軟列舉的型別如下,其中符號值僅給出了一種可能性,僅供參考。

命令規則[編輯]