教程:制作一個指令
專家級教程,需要Java知識:基礎語法,面向對象,異常處理
版本:1.12.2 Forge
就像絕大多數(shù)MC的內(nèi)容,寫一個指令只需要兩步:
1,寫出它的類;
2,注冊給Forge。
正如物品需要繼承Item,指令需要繼承CommandBase,具體一點的話是net.minecraft.command.CommandBase。
首先示范一下我理想境mod里的跨維度傳送指令。
這里面每個是干什么的,我們后面再說。如果你復制后發(fā)現(xiàn)execute函數(shù)里有若干報錯,那也不用急,因為那函數(shù)里面的內(nèi)容只是示例,大可以都刪了。
如果你想?yún)⒖家幌略娴钠渌噶睿灰碔Command接口的繼承列表就行了。
先說注冊指令的方式。由于我的這個指令是跨維度傳送,是一個實際影響數(shù)據(jù)的操作,所以他要在服務端執(zhí)行。我把它在FMLServerStartingEvent里注冊,具體來說,就是在我的注冊管理類里加入:
當然了,光這么寫沒有用,因為這段代碼不監(jiān)聽事件。我需要在主類里加入
這樣就注冊完成了。
那么,為什么注冊一個指令我給分在兩個地方呢?因為我不希望主類的內(nèi)容過多。隨著指令種類的增多,要注冊的指令的代碼會一排排地變多,而我不希望全都堆到主類里,所以主類只調(diào)用一個接口,具體的指令列表我都放到注冊管理類里。任何一個等效的寫法都是可以的,不必像我這樣拆分。這是規(guī)范上的問題,不是語法或邏輯上的問題。
有了上面的本體類,和注冊它的代碼,這個指令就能用了。

說回本體類的書寫。繼承CommandBase后,語法會要求你至少覆寫三個東西:getName、getUsage、execute。
getName,就是這個指令的名字。比如time指令的time,gamerule指令的gamerule。
getUsage,就是這個指令在你打錯了,或者打help的時候出現(xiàn)的那個用法。一般是告訴你這個指令有幾個參數(shù)用的,具體的格式可以參考原版的指令。
execute,就是實際執(zhí)行指令。這里面也要處理報錯。
我們都聽過那個關于程序酒吧的笑話(測試員進酒吧,買了一杯酒,然后不付錢,然后進去又出來,然后把老板打了一頓,滿意地出來了。結果顧客進來點了一份炒飯,酒吧炸了。),這里正是體現(xiàn)它的地方。
Server參數(shù)給了你服務器引用,sender是指令發(fā)送者,args是參數(shù)列表(arguments)的意思。
sender這個參數(shù)要注意,它并不一定是玩家。我們都知道,紅石可以導通命令方塊觸發(fā)指令。因此,如果你想把sender轉化為玩家或者生物,務必在轉化前用 instanceof 檢查類型。如果你的指令不適用于方塊,記得給玩家提示,以免玩家對著毫無反應的指令一臉懵逼,然后罵這mod有bug。
你要清楚地告訴玩家,這是玩家輸入錯誤了,而不是mod出bug了。
args也要注意。比如你想制作一個升級指令,參數(shù)是等級的值,那么你需要把String轉化為數(shù)字。一切參數(shù)都是字符串String,玩家輸入 level 3 那也是作為字符串的"3",而不是int類型的3。要想獲得int,那就得Integer.parseInt。然后,既然有parse了,你就要考慮玩家輸入的不合規(guī)范的情況。比如一個“l(fā)evel <整數(shù)>”的指令,玩家可以輸入“l(fā)evel asdasd”,這時候你就要告訴玩家,你輸入錯了,這個參數(shù)接受的是整數(shù)。我寫的時候一般是和HarryTalks一樣,直接給玩家發(fā)送消息,原版的方式更多是拋出異常,總之都是能用的。

上面的都搞定,一個合格的指令就誕生了。順便講幾個其他需要注意的地方,從合格走向優(yōu)秀。

getAliases。返回本指令的縮寫列表。舉例來說,創(chuàng)世神的schematic指令,可以縮寫為schem。我做得更加過分,我的tpdim指令也接受“chuansong”,這個拼音寫法。我見過太多英語不好的玩家朋友了,他們記不住這些英語的縮寫的。它的示例用法可以參考上面我給出的例子。
getRequiredPermissionLevel 這個返回所需要的權限等級。如果你的指令效果很大,一般都不會允許玩家隨意使用,尤其是在服務器上更要注意,不要讓玩家因為濫用指令對服務器造成破壞。具體這個數(shù)字定為幾合適,可以參考原版的各個指令的權限值。除了在代碼里慢慢找之外,也可以翻閱wiki:
https://minecraft.fandom.com/zh/wiki/%E5%91%BD%E4%BB%A4#%E6%9D%83%E9%99%90%E7%AD%89%E7%BA%A7
我希望這個鏈接能活下來。如果有一天wiki都沒了,也就別做什么mc了,去干點別的吧。