使用者: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 斜槓指令

列舉名[編輯]

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

可選項[編輯]

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

分解[編輯]

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

後綴[編輯]

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

列舉值[編輯]

軟列舉[編輯]

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

指令規則[編輯]