iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
1

https://ithelp.ithome.com.tw/upload/images/20190909/20115823FI9QCzBEz7.png

對遊戲操作有些基本了解後,有沒有發覺這個世界有點冷清?
(但假如你已經碰到一些對你"不友善"的生物 - 請盡快跑走,現在的你還不是對手,我們未來會透過模組再來跟這些生物好好玩玩.../images/emoticon/emoticon39.gif)

今天就來撰寫我們第一個模組 (Mod),因為是第一個,所以重點會先放在開發模組會需要知道的一些基本流程。下面我們來將所有打破方塊的動作都會出現一個回應訊息吧!

建立主檔案

請將IDE打開後,在src/main/java/com.example.examplemod套件下會看到Minecraft Forge提供的範例ExampleMod.java檔案,這裡的例子有點無聊,因此我今天不打算講解它,若你感興趣可以打開看看,若覺得礙眼要把它刪除也沒關係。

Minecraft Forge是透過監聽不同的事件(Event)發生來進行的,而每一個事件需要透過事件巴士(EventBus)在事件處理器(Event Handler)內進行註冊(register)才可以使用。
這邊對描述看不懂沒關係,後面我們以實際程式碼來說明,接著你在回頭來看這一段敘述會比較容易理解。

由於事件巴士註冊事件需要有一個統一的地方,因此我們需要一個**主檔案 (Main)**來放我們的事件巴士註冊動作。之後如果提到主檔案、Main Class都是在指這個檔案喔!

以下我們先建立主檔案來做為我們自定義的模組主程式。

  1. 請在"java"這一個目錄下按右鍵,建立新的Package名稱 (這裡用com.ithome.mymod為例)
    https://ithelp.ithome.com.tw/upload/images/20190909/20115823MH0DM7nT9q.png

    https://ithelp.ithome.com.tw/upload/images/20190909/20115823ZIrJOoMl5T.png

  2. 在剛剛建立的package名稱上,再建立名稱為Main的Class檔案
    https://ithelp.ithome.com.tw/upload/images/20190909/201158230CxdGX03S4.png

    https://ithelp.ithome.com.tw/upload/images/20190909/20115823eCbT8IF5Yj.png

  3. 在Main檔案內寫入下面的程式碼內容來定義模組名稱與初始化方法。第一次寫Java會需要注意下面程式碼的import部分。在Java中,我們需要透過這種import關鍵字來匯入我們需要的相依類別,才能在接下來撰寫程式碼的地方讓IDE能夠知道

    喔,這裡的Mod我不認識它,讓我找找import...找到import net.minecraftforge.fml.common.Mod了
    所以這裡的Mod是對應net.minecraftforge.fml.common下面的Mod類別

    Intellij有個快速Import Class的功能,只要在出現找不到Class錯誤的紅字底線程式碼處,按下Alt+Enter,會出現建議操作,再點選Import Class即可

    package com.ithome.mymod;
    
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.fml.common.Mod.EventHandler;
    import net.minecraftforge.fml.common.event.FMLInitializationEvent;
    
    // 透過註釋@Mod告訴Forge這個是模組的主要檔案
    @Mod(modid = Main.MODID, version = Main.VERSION)
    public class Main {
    
        // 作為辨識模組的唯一識別碼 (此值不可與其他模組名稱相同)
        public static final String MODID = "myFancyMods";
        // 模組版本號,後續可以更新
        public static final String VERSION = "1.0";
    
        // 告訴Forge這個是FML(Forge Mod Loader)事件處理的方法
        // 在這個方法裡可以處理不同的事件
        // FMLInitializationEvent : 這裡我們處理的是模組的初始化的事件
        @EventHandler
        public void init(FMLInitializationEvent event) {
    
        }
    }
    

建立處理事件

有了主檔案後,就可以開始建立我們第一個事件了。

  1. 請一樣在com.ithome.mymod的套件下建立BreakBlockEvent的Class檔案
    https://ithelp.ithome.com.tw/upload/images/20190909/201158232u44WoLhJT.png
  2. 在BreakBlockEvent檔案內寫入打破方塊訊息的sendMessage方法
     package com.ithome.mymod;
    
     import net.minecraft.util.ChatComponentText;
     import net.minecraft.util.EnumChatFormatting;
     import net.minecraftforge.event.world.BlockEvent.BreakEvent;
     import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    
     public class BreakBlockEvent {
    
         // 透過註釋來告訴Forge這個方法是一個事件處理器(EventHandler)可以處理的事件
         // BreakEvent是一個事件(定義在BlockEvent下),這裡我們要處理打破方塊這個事件發生時的動作
         @SubscribeEvent
         public void sendMessage(BreakEvent event) {
             // 取得打破方塊的玩家資訊
             event.getPlayer()
                     // 加入一個訊息到聊天視窗中
                     .addChatComponentMessage(
                             // 定義訊息內容為:淺紫色 + 文字
                             new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "Congratulations! You broke a block!")
                     );
         }
     }
    

註冊事件

有了主程式與事件後,接下來就是要將兩者連結。在前面有說,一個事件是透過事件處理器來處理,而事件處理器內可以註冊我們的事件,讓Forge去監聽與處理相對應的動作。

  1. 回到Main主程式,在init方法內註冊我們剛剛寫的事件類別 (這裡要注意MinecraftForge這個類別需要透過import net.minecraftforge.common.MinecraftForge才不會出現錯誤)
     public void init(FMLInitializationEvent event) {
         // 透過事件巴士註冊事件
         MinecraftForge.EVENT_BUS.register(new BreakBlockEvent());
     }
    
  2. 至此就完成我們第一個事件的開發囉!

測試模組

在進入遊戲測試之前,讓我們簡單回顧一下撰寫模組的流程:

  1. 建立模組主程式(一個模組應該有一個主程式)以及定義唯一識別名稱modid
  2. 定義初始事件處理方法,並在方法加入註釋 @EventHandler 讓Forge可以識別
  3. 建立事件類別與要處理的事件方法
  4. 在方法上加入註釋 @SubscribeEvent 讓事件處理器知道這是一個要處理的事件類別
  5. 在初始事件處理方法內透過事件巴士(EVENT_BUS)註冊(register)事件類別

點擊昨天說的Minecraft Client啟動遊戲,請先到模組選項內確認我們自定義的模組確實有載入
https://ithelp.ithome.com.tw/upload/images/20190909/201158233ZjioOmTLT.png

https://ithelp.ithome.com.tw/upload/images/20190909/20115823WeIlPL7wMQ.png

你可以在遊戲內隨意打破任何方塊,應該會在左下角處看到打破方塊訊息跳出,好好享受終於不是孤單一人的感覺吧!

小功能:在Forge內有相當多的事件可以使用,這裡提供一個快速查找Event的方法:
a. 將滑鼠游標停在"BreakEvent"文字下,鍵入Ctrl + H
b. 右側會彈出這個Class的繼承結構,在上上層的"Event"點選反白後,再鍵入一次Ctrl + H
c. 如下圖,就可以快速了解目前這個版本有哪些Event可以使用囉!
https://ithelp.ithome.com.tw/upload/images/20190909/20115823AlJVlJUPkG.png


上一篇
[Day2] 歡迎來到孤島
下一篇
[Day4] 成為爆破礦工
系列文
[Minecraft - 當個創世神] 從玩遊戲到設計遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
a31916909
iT邦新手 5 級 ‧ 2020-11-25 20:38:28

@SubscribeEvent
@EventHandler
@Override
@OnlyIn
這些小老鼠開頭的東西是甚麼啊?

在Minecraft Forge的開發中,@開頭的"Java註釋"是用來標註該類別或方法要做些什麼事情,例如:

@SubscribeEvent: 讓事件處理器知道這是一個要處理的事件類別

不知道這樣有回答道你的問題嗎?

我要留言

立即登入留言