iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 11
1

https://ithelp.ithome.com.tw/upload/images/20190925/201158234FmoGUEGNb.png

在Minecraft世界裡,有很多現存的指令可以使用。
比如/time可以更改世界裡的時間,/time set day可以從晚上直接變成白天;
/weather可以改變天氣,/weather thunder可以直接從晴天變成暴風雨;
/kill可以直接殺死實體,/kill @e[type=EntityScalePig]可以將我們的俄羅斯豬全部殺死;
/summon可以生成實體,/summon Giant ~ ~ ~可以在當前位置生成巨大殭屍。

其他還有很多內建的指令可以使用,但假如今天我們想要做自己的指令呢?比如說生成一群很熱的豬跑來跑去?

燃燒豬

  1. 我們先在com.ithome.mymod套件內建立BurningPigs類別。
    public class BurningPigs {
    }
    
  2. 接著我們需要註冊指令類別到FMLServerStartingEvent事件內。這個事件與FMLPreInitializationEventFMLInitializationEvent相同,是需要告訴Forge這個是處理各種事件的方法:
    @EventHandler
    public void registerCommands(FMLServerStartingEvent event) {
        event.registerServerCommand(new BurningPigs());
    }
    
  3. 這時候會出現錯誤說BurningPigs並沒有實作ICommand介面,但我們可以直接繼承CommandBase來減少程式碼複雜度。因此回到BurningPigs加上CommandBase介面與實作必須方法 (沒有特別寫註解的就是預設的方法內容,不用特別實作):
    public class BurningPigs implements CommandBase {
    
        // 定義所有允許的指令名稱
        private List<String> aliases = new ArrayList<String>();
        // 產生的燃燒豬數量
        private int numberOfPigs = 0;
    
        public BurningPigs() {
            // 我們在建構式內定義可以用的指令名稱
            aliases.add("burningpigs");
            aliases.add("bp");
        }
    
        @Override
        public String getName() {
            return null;
        }
    
        @Override
        public String getCommandUsage(ICommandSender sender) {
            // 提示使用者如何使用指令
            return "/burningpigs <number of pigs>";
        }
    
        @Override
        public List getAliases() {
            // 回傳指令列表
            return aliases;
        }
    
        @Override
        public void execute(ICommandSender sender, String[] args) {
            // 主要邏輯
            if(args == null || args.length != 1) {
                sendErrorMessage(sender, "only accept one argument!");
                return;
            }
            try {
                numberOfPigs = Integer.parseInt(args[0]);
            } catch (NumberFormatException e) {
                sendErrorMessage(sender, "The argument \"" + args[0] + "\" is not a valid number!");
                return;
            }
    
            // 執行指令的是玩家,這裡直接轉型
            EntityPlayer player = (EntityPlayer) sender;
    
            for(int i = 0 ; i < numberOfPigs ; i++) {
                EntityPig pig = new EntityPig(player.worldObj);
                pig.setLocationAndAngles(player.posX, player.posY, player.posZ, 0, 0);
                // 讓豬產生燃燒效果
                pig.setFire(10000);
                player.worldObj.spawnEntityInWorld(pig);
            }
        }
    
        private void sendErrorMessage(ICommandSender sender, String message) {
            // 自定義暗紅色視窗訊息
            sender.addChatMessage(new ChatComponentText(
                    EnumChatFormatting.DARK_RED + message
            ));
        }
    }
    
  4. 存檔進入遊戲 (記得要開啟作弊模式)後,按下/T按鍵開以訊息視窗,然後輸入/burningpigs 50/bp 50,欣賞這群活蹦亂跳的豬豬們吧!

題外話:今天我們介紹另一種可以"使用"Minecraft模組的方式 - 這個在很多現有公開的模組都會提供類似的方式來供玩家可以快速使用。實際上,在Minecraft世界還有另一種叫做指令方塊的東西,是一種可以在多人玩家中避免直接在訊息視窗中使用指令,但卻可以有類似效果的東西。由這部分的功能比較屬於如何玩模組,而這個系列的目的是如何設計模組,關於指令的篇幅就不會說的很深,主要會用來作為我們快速使用模組的一種方式。


上一篇
[Day10] 讓我們可以跳得更高
下一篇
[Day12] 羅馬競技場是一鍵造成的 (上)
系列文
[Minecraft - 當個創世神] 從玩遊戲到設計遊戲30

尚未有邦友留言

立即登入留言