2012年2月4日 星期六

Minecraft 如何將 SMP Mod Port 到 bukkit

相同文章也發表於巴哈姆特

一般在 Minecraft Forum 看到的 SMP Mod大多是 for Vanilla 的 Mod
(Vanilla : 官方 Server),如果要能執行在 bukkit 上面,
是需要進行轉換的(轉換在這裡就稱為 Port)

為何 Vanilla Server 的 Mod 無法直接用在 bukkit 上面?
因為 Vanilla Server是經過混淆器包裝過的程式,也就是裡面的
class 檔案,都呈現 aa.class  wz.class 這類的名稱。

而雖然 bukkit 裡面也有官方 Server 的部分,但這些 class 名字是有
解譯過的,也就是會呈現最原始的情況。

再者, bukkit 有改過這些 class 的原始碼,所以在方法和變數名稱都
和原始的有所差異,所以在  decompile 的時候需要使用修改過的檔案來進行
Mapping。

首先,先了解要 port 一個 SMP Mod 所必需的東西:



  1. Vanilla Server
  2. ModLoaderMP for Vanilla Server
  3. MCP (Minecraft Coder Pack)
  4. craftbukkit server 
  5. ModLoaderMP for bukkit
  6. Mapping file for bukkit
1,2 取得容易,沒啥問題,因為有這些東西, Mod才能使用。
MCP 是製作 Mod 時必須的工具,用來編譯製作好的 Mod,這邊是用來 decompile
比較重要的就是 5,6  了,這兩個需要等別人釋出。

前言到此為止,接下來就正式介如何 Port 一個 Mod:

請先準備底下檔案,要注意到版本對應的問題

1. 最新版本的 MCP => 請到 MC Coder Pack 下載,找 release  (或者直接下載 v5.6)
2. 準備乾淨的官方 Server => 請到這裡下載 (下載 minecraft_server.jar )
3. 準備乾淨的 bukkit server => here (注意:這個教學是用 1.1 R1  的版本)
4. 下載 ModLoaderMP for 官方 Server 1.1 => here
5. 下載 ModLoaderMP for bukkt 1.1 =>For R1 #1818  For R3 #1846
6. 下載 Mapping file for bukkit 1.1 => here
7. 準備有基本 java 知識的頭腦或者基本 eclipse 使用的頭腦
8. 需要安裝 JDK 或者 Eclispe 等 java 開發工具

提醒:
ModLoaderMP for bukkit 要找對應的版本號,例如 bukkit-R3(#1846) 有專屬的
ModLoaderMP,可以到 MC Port Central 置頂文裡面找相對應的檔案。

至於 Mapping file 的話,基本上小更改是不會更動的,但還是建議先去確認一下

是否有新的版本出現。

請切記, Vanilla 和 bukkit 兩個 Server 所安裝的 ModLoaderMP 都要是各自相對應的版本
最後 7 如果沒辦法找到或者借到的話,會比較辛苦一點點:3

到這邊你應該會有這些檔案:
mcp56.zip
minecraft_server.jar
craftbukkit-1.1-R1.jar
ModLoaderMp 1.1 v2.1 Server.zip (這是 for 官方的)
modloadermp-b1.1R1.zip(這是 for bukkit 的)
mappings_bukkit_1.1.tar.gz

最後當然是準備你需要 port 的 Mod  啦,這邊就已 Backpack 為例子
所以還會有一個 Backpack_SERVER_1-1-0_v2-2.zip

接著準備開始要進行 Porting 了~~
先給大家參考原文資料,如果看不懂我所說的,可以參考原文
(Original tutorial by krnlyng 那邊)
另外上述這些檔案在 porting 的時候,建議都先有個備分會比較好。

對於任何步驟有問題歡迎提出來討論

DEMO 影片
原本後面打算放到 bukkit  裡面 run 的,但後來還是算了


【Step 1】
將 mcp 解壓縮到一個目錄,底下稱作 mcp/
PS : 每 Port 一個新的 Mod ,請準備另一個 mcp/ 資料才不會混到


【Step 2】
mappings_bukkit_1.1.tar.gz 裡面的三個 .csv 檔案,解壓縮到
mcp/conf/ 底下,取代原本的檔案




【Step 3】
用 WinRAR  或者 7-zip 開啟 minecraft_server.jar 並將 ModLoaderMP(for 官方)
以及要安裝的模組(Backpack_SERVER_1-1-0_v2-2.zip) 給安裝好,安裝方式就是
也用 WinRAR 或 7-zip 打開這兩個檔案,把裡面的東西都覆蓋掉原本 minecraft_server.jar
裡面的檔案。




【Step 4】
修改過的 minecraft_server.jar 放到 mcp/jars/ 裡面





【Step 5】
執行 mcp/ 底下的 decompile.bat ,中途出現甚麼訊息都不用管他
(ERROR 還是甚麼的 都不要理他)
等到「按任意鍵繼續」的字樣出現表示完成
這時會看到在 mcp/ 底下多出了一個 src/ 的目錄



【Step 6】
mcp/src/ 裡面(實際上應該是 mcp/src/minecraft_server/net/minecraft/src/)
裡面會有一堆 .java 的檔案
找出這個 Mod 所屬的檔案,這邊的例子,就是找出:
BackpackInventory.java
BackpackItem.java
BackpackUtils.java
mod_Backpack.java
這四個檔案。
將這幾個檔案複製出來(假設我複製到一個叫做 porting/ 的目錄)



PS: 如果你要 Port 的 Mod 有動到原本 server  內的檔案,請想辦法找出來
並參考後面的敘述(Step A)


【Step 7】
複製 craftbukkit-1.1-R1.jar 到 porting/ 底下,並且對這個 craftbukkit-1.1-R1.jar
安裝 ModLoaderMP for bukkit,安裝方式應該不用再贅述了吧
(這邊先把安裝好 ModLoaderMP 的 bukkit  檔案稱為 craftbukkit-1.1-Moded.jar)



【Step 8】
把 porting/ 底下的所有 .java  檔案中,所有的 net.minecraft.src 取代成
net.minecraft.server




【Step 9】
在 porting/ 底下建立一個 compile.bat 的檔案,並用文字文件開啟他,輸入:
javac -cp craftbukkit-1.1-Moded.jar -d ./ *.java
並存檔




【Step 10】
這邊是最困難的部分,通常一個 Mod 在做完上述動作後,在編譯上會出問題。
現在請執行 compile.bat 這個檔案,並查看是否有錯誤訊息出現
如果有請想辦法修正,如果沒有就恭喜你了
以這個 Mod 為例子,第一次編譯的時候出現這個錯誤:

這個表示BackpackInventory.java 沒有實作一個叫做 getContents() 的方法,去查IInvetory.java 後得知,要這樣修改,在這個BackpackInventory.java 加入:


第二次編譯又出現問題:

(為什麼知道要這樣改.... 就是靠知識和經驗了)
找到檔案中的 43 , 90 行,IOException 改成 Exception:


最後編譯就成功了:


【Step 11】
如果編譯成功,會在 porting/ 底下看到一個 net 的資料夾,這整個資料夾就是
port 成功的 Mod。
至於要怎麼用我想大家應該就知道了。



【Step 12】
將 port  好的 Mod 安裝到你的 bukkit 上面,看看是否會有問題
如果沒問題,就恭喜你成功了~




如果用到底下步驟,那成功率就會降低了
因為底下步驟需要的技能等級稍微高一點點

【Step A】
如果你要 port 的 Mod 裡面有類似 aa.class , wz.class 這種檔案的話
就表示有動到 Server 本身的檔案 (給學過 java 的人:程式被混淆器包裝過)
如果有的話,要先找出這些的原是檔名是甚麼,在 decompile 後必須
也要找到他。

【Step B】
找到檔案後,也要找出和原本的檔案哪裡不同( 指 code 的部分)

【Step C】
確認 ModLoader for bukkit 是否也有動到這些檔案
﹝Yes﹞一併把 ModLoader for bukkit 的那個檔案 decompiler
把 code 有修改過的地方改寫進去,一併編譯
﹝No﹞直接抓出來放到 porting/ 底下待編譯

4 則留言:

  1. 請問 SiegeCraft MOD 可以移植嗎

    回覆刪除
    回覆
    1. 任何 mod 都可以移植,只是需要修證的 bug 多不多
      以及要得到原作者同意

      刪除
    2. 請問要移植的mod不是放在mods資料夾中的,要怎麼做?

      刪除
    3. 這部分我需要先說明一下:

      一定要解出來放進 bukkit.jar 裡面的 mod
      表示有修改過這裡面的 class,不純粹只是新增
      一些檔案,這個你必須想辦法找出哪裡不同
      整合進去後再處理。過程上基本都相同喔。

      刪除