對遊戲操作有些基本了解後,有沒有發覺這個世界有點冷清?
(但假如你已經碰到一些對你"不友善"的生物 - 請盡快跑走,現在的你還不是對手,我們未來會透過模組再來跟這些生物好好玩玩...)
今天就來撰寫我們第一個模組 (Mod),因為是第一個,所以重點會先放在開發模組會需要知道的一些基本流程。下面我們來將所有打破方塊的動作都會出現一個回應訊息吧!
請將IDE打開後,在src/main/java/com.example.examplemod套件下會看到Minecraft Forge提供的範例ExampleMod.java檔案,這裡的例子有點無聊,因此我今天不打算講解它,若你感興趣可以打開看看,若覺得礙眼要把它刪除也沒關係。
Minecraft Forge是透過監聽不同的事件(Event)發生來進行的,而每一個事件需要透過事件巴士(EventBus)在事件處理器(Event Handler)內進行註冊(register)才可以使用。
這邊對描述看不懂沒關係,後面我們以實際程式碼來說明,接著你在回頭來看這一段敘述會比較容易理解。
由於事件巴士註冊事件需要有一個統一的地方,因此我們需要一個**主檔案 (Main)**來放我們的事件巴士註冊動作。之後如果提到主檔案、Main Class都是在指這個檔案喔!
以下我們先建立主檔案來做為我們自定義的模組主程式。
請在"java"這一個目錄下按右鍵,建立新的Package名稱 (這裡用com.ithome.mymod為例)
在剛剛建立的package名稱上,再建立名稱為Main的Class檔案
在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) {
}
}
有了主檔案後,就可以開始建立我們第一個事件了。
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去監聽與處理相對應的動作。
import net.minecraftforge.common.MinecraftForge
才不會出現錯誤)
public void init(FMLInitializationEvent event) {
// 透過事件巴士註冊事件
MinecraftForge.EVENT_BUS.register(new BreakBlockEvent());
}
在進入遊戲測試之前,讓我們簡單回顧一下撰寫模組的流程:
點擊昨天說的Minecraft Client啟動遊戲,請先到模組選項內確認我們自定義的模組確實有載入
你可以在遊戲內隨意打破任何方塊,應該會在左下角處看到打破方塊訊息跳出,好好享受終於不是孤單一人的感覺吧!
小功能:在Forge內有相當多的事件可以使用,這裡提供一個快速查找Event的方法:
a. 將滑鼠游標停在"BreakEvent"文字下,鍵入Ctrl + H
b. 右側會彈出這個Class的繼承結構,在上上層的"Event"點選反白後,再鍵入一次Ctrl + H
c. 如下圖,就可以快速了解目前這個版本有哪些Event可以使用囉!
@SubscribeEvent
@EventHandler
@Override
@OnlyIn
這些小老鼠開頭的東西是甚麼啊?
在Minecraft Forge的開發中,@
開頭的"Java註釋"是用來標註該類別或方法要做些什麼事情,例如:
@SubscribeEvent
: 讓事件處理器知道這是一個要處理的事件類別
不知道這樣有回答道你的問題嗎?