超長的文章名稱啊! 實在過久沒有寫篇記錄,由於過幾天後就要向一所國中生教其中有 Minecraft 模組為開發主題的資訊冬令營,順便把課程中其中一個很簡單的小範例拿出來記錄。

我遊玩這款遊戲是從 1.2.5 之前的,從沒想過會開發模組,結果第一次獻給一個冬令營教學了www。

開發環境

由於環境是 Java 的,所以也不用太苛求是哪一個作業系統,不過是要安裝好 jdk8 就是了。 所需基本環境為

Java (JDK) Version: JDK8  
Eclipse  

MDK 安裝

其實叫 SDK 也可以,可能別人覺得可愛,稱作 Minecraft Development Kit,由於市面上應該有很多種外掛開發、安裝工具,在這裡我是使用 Minecraft Forge

請到 Minecraft Forge 官網 下載,其中的版本就是對應 Minecraft 的版本,這裡使用 Mineraft 1.8.9。

由於這個網站設計實在有點雞肋,不想多吐槽,請選擇 MDK ,然後你需要等待一個超像 adf.ly 之類那種要等待 5 秒讓你看廣告,才會出現 skip ad 的按鈕,請你點下去 (怒。

下載完後,是一個 .zip 檔案,把裡面拉到一個資料夾,然後用 cmd 在那個資料夾輸入:

gradlew setupDecompWorkspace eclipse  

如果你噴錯了,像這樣:

由於我是跑在 Mac 上的 Parallels,似乎 gc 噴錯

> GC overhead limit exceeded

那麼你可以參考這篇討論串: 連結

並且,使用以下的 shell 應該可以解決。

gradlew -Dorg.gradle.jvmargs=-Xmx10240m setupDecompWorkspace && gradlew eclipse  

-Dorg.gradle.jvmargs=-Xmx1200m

或者,你可能沒有設定 JAVA_HOME (JDK PATH) ,請參考這篇文章: 連結

好了之後,你可以打開 eclipse ,然後把 workspace 設定在你這個 minecraft forge 資料夾下有一個 eclipse 資料夾中。

開啟 workspace 就可以了。

插件開發架構

Minecraft 有很多需要依靠事件處理的東西,比方說: 爆炸、銷毀物體、撿起物體、礦車碰撞、TNT被點燃、開門...etc,你可以上 Minecraft forge 查到這些事件。

因此,只要設定好哪個事件觸發後要發生什麼事,你就可以自由控制整個遊戲。

建立自己的模組空間

首先,在 eclipse 工作區,你可以在專案資料夾右鍵->New->Package

package 可以命名為: org.xxxx.xxxx (自己定義)。
建立好後,你已經把你的模組開好一個屬於自己模組空間了。

向 Minecraft Forge 登記你有要用到的程式碼

接下來,還需要建立一個叫 Main 的 Class,在你剛剛建立的 package -> 右鍵 -> New -> Class 請在 Name 那邊打下 Main,接著按下 Finish (我這裡已經有了,不能重複建立所以 Finish 沒顯示,請見諒)。

然後把以下複製貼上到 Main 這個 Class 的 package 關鍵字底下換行:

import net.minecraft.util.ChatComponentText;  
import net.minecraft.util.EnumChatFormatting;  
import net.minecraftforge.common.MinecraftForge;  
import net.minecraftforge.event.world.BlockEvent.BreakEvent;  
import net.minecraftforge.fml.common.Mod;  
import net.minecraftforge.fml.common.Mod.EventHandler;  
import net.minecraftforge.fml.common.event.FMLInitializationEvent;  
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

@Mod(modid= Main.MODID, version = Main.VERSION)
public class Main {  
    public static final String MODID = "custom"; //模組名稱
    public static final String VERSION = "1.0"; //模組版本

    @EventHandler
    public void init(FMLInitializationEvent event){ //一開始就會讀取的函式
        MinecraftForge.EVENT_BUS.register(new BlockBreakExplosion());  //告訴模組我用了哪些程式

    }
}

剛剛這件事是為了登記有哪些要在遊戲用的模組,很可愛的稱作 Event Bus (事件公車)。

銷毀物體後爆炸的事件

我需要使用銷毀物體事件,來觸發一個爆炸,所以找到了一個叫 BreakEvent 的參數。

所以要建立一個只要銷毀一個方塊,就會產生大爆炸的程式,請在你剛剛自訂的 package -> 右鍵 -> New -> Class,並且命名為: BlockBreakExplosion

並且在 Class 檔案的 package 關鍵字換行後貼上:

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 BlockBreakMessage {

    @SubscribeEvent
    public void boom(BreakEvent event){
event.world.createExplosion(event.getPlayer(),event.pos.getX(), event.pos.getY(), event.pos.getZ(), 50, true);  
    }

}

好吧,上面的程式是在使用者座標產生一個爆炸,爆炸的威力是 50 個平方方塊那麼多 (你可以自己修改 50 數字)。

執行遊戲試玩

你可以跑遊戲,我這裡開 GOD 模式好像會 crash,所以如果上帝模式會讓程式壞掉,就用生存模式吧。