模組的入口 === 好不容易建立起開發環境了 打開遊戲居然是Example Mod,實在太可惡啦!(╬゚ ◣ ゚) ~~我們要讓它消失在這世界上~~ 在本章節你會了解 --- - 撰寫模組的入口類別 - 修改mod.toml - 修改pack.mcmeta - 如何執行Server並用Client進入地圖 - 如何獲得自己模組編譯後的jar檔 - 如何設定runClient用自己的Minecraft帳號登入 撰寫模組的入口類別 --- 首先,刪掉src/main/java下的com資料夾 根據你在[前一篇中build.gradle](https://hackmd.io/@immortalmice/SkKzBry_L)設定Group的值,重新建立你的資料夾結構 以這邊設定的Group為例 ```java= group = 'com.github.immortalmice.modtutorialim' ``` 你的src資料夾就應該要變成這個樣子(\`3´) ![圖1-2-1 src資料夾結構](https://i.imgur.com/BM2qegE.jpg) 那我們就先來寫下一個最簡單的模組入口吧(⁰▿⁰) > src/main/java/com/immortalmice/modtutorialim/ModTutorialIM.java ```java= package com.immortalmice.modtutorialim; import net.minecraftforge.fml.common.Mod; @Mod(ModTutorialIM.MODID) public class ModTutorialIM{ public static final String MODID = "modtutorialim"; public static final String NAME = "Immortalmice's Mod Tutorial"; public ModTutorialIM(){ } } ``` 來看其中重點的幾行 1. ```java= @Mod(ModTutorialIM.MODID) ``` 這邊用到的是Forge提供的net.minecraftforge.fml.common.Mod 用這個註解標記上的類別,會被Forge當作模組入口並嘗試載入 傳入的東西毫無意外的就是你的modid了(ㄏ ̄▽ ̄)ㄏ ㄟ( ̄▽ ̄ㄟ) 2. ```java= public static final String MODID = "modtutorialim"; public static final String NAME = "Immortalmice's Mod Tutorial"; ``` 先來宣告一些模組重要資訊的常數,這不是必須,但如果有會很棒,特別是modid 一來,別人來看你的程式碼的時候,他打開你的這個模組入口類別,馬上就可以看到這些重要資訊 二來,當你在其他程式碼片段要用到這些資訊的時候,這個地方提供了一個統一管理的方法 比如說如果你要傳modid給Forge的方法,你可以寫 ```java= SomeClass.someMethod(ModTutorialIM.MODID, /* Other parameter */); ``` 而不是直接寫 ```java= SomeClass.someMethod("modtutorialim", /* Other parameter */); ``` 這是所謂DRY(Don't Repeat Yourself)的程式開發原則,這邊不再贅述 前面的@Mod中傳入的modid就是用這種方式達成的(灬ºωº灬) 修改mod.toml --- 再來,你需要修改src/main/resources/META-INF下的mod.toml 裡面有很多行都是註解(由#開頭的),給你一些範例還有欄位的意思 我們需要修改一下一些欄位 1. ```java= modId="modtutorialim" ``` 恩,不解釋,乖乖填上你的modid吧( \^ω^) 這個modid應該要和你剛剛在程式碼中@Mod註解傳入的值一模一樣,否則載入模組會失敗 2. ```java= version="${version}" ``` 顧名思義,就是你模組的版本,這邊應該要是1.15.2-0.0.1.0 但是還記得我們之前在[build.gradle](https://hackmd.io/@immortalmice/SkKzBry_L)中設定的version欄位嗎? 試想一下,你每一次為你的模組更新版本號的時候,都要改過build.gradle和這個mod.toml 太麻煩了,而且這也違背了DRY原則 因此我們為build.gradle新增一段程式碼,幫我們自動嵌入 這段程式碼由[Cadiboo's Projects](https://cadiboo.github.io/tutorials/1.15.1/forge/)提供 ```java= // Process resources on build processResources { // This will ensure that this task is redone when the versions change. inputs.property 'version', project.version // Replace stuff in mods.toml, nothing else from(sourceSets.main.resources.srcDirs) { include 'META-INF/mods.toml' // Replace version expand 'version':project.version } // Copy everything else except the mods.toml from(sourceSets.main.resources.srcDirs) { exclude 'META-INF/mods.toml' } } ``` 這樣一來,Gradle就會幫你把mods.toml中的${version}給替換成build.gradle裡寫的值了 3. ```java= displayName="Immortalmice's Mod Tutorial" ``` 就是你模組的顯示名稱拉,沒有大小寫限制,也可以有空格 Freeeeeeee ━(゚∀゚)━ 4. ```java= description=''' Just a mod used in making MinecraftForge 1.15.2 modding tutorial ''' ``` 為你的模組寫下介紹吧,沒有大小寫限制,可以有空格,更可以換行 Freeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee ━(゚∀゚)━( ゚∀)━( ゚)━( )━( )━(゚)━(∀゚)━(゚∀゚)━ 5. ```java= [[dependencies.modtutorialim]] ``` 往下看,你應該會看到兩行`[[dependencies.examplemod]]` 把其中的`examplemod`改成你的modid吧 Dependencies就是你的模組所依賴的 理所當然的,MinecraftForge和Minecraft都是執行我們模組必備的東西 因此這兩段就分別是告知我們需要有這兩個東西 如果你的模組還有其他的Dependencies,也請在這裡新增 6. updateJSONURL、displayURL、logoFile、credits、authors 這五個欄位是選擇性項目 各自的用途都有註解說明,可以自行修改,如果沒有或不需要,可以 **整行** 刪掉 請不要留空字串,執行時他會嘗試解析這個空字串,然後就失敗,然後就你知道的(゚3゚)~♪ 最後,把多餘的註解刪掉,並給上一些縮牌來排版之後,就大功告成了 這邊給予一個範例 > src/main/resources/META-INF/mod.toml ```java= modLoader="javafml" loaderVersion="[31,)" issueTrackerURL="https://github.com/immortalmice/MinecraftForge1.15.2-ModdingTutorial/issues" [[mods]] modId="modtutorialim" version="${version}" displayName="Immortalmice's Mod Tutorial" description=''' Just a mod used in making MinecraftForge 1.15.2 modding tutorial ''' credits="Thanks for pudding, the best thing in this world." authors="Immortalmice" [[dependencies.modtutorialim]] modId="forge" mandatory=true versionRange="[31,)" ordering="NONE" side="BOTH" [[dependencies.modtutorialim]] modId="minecraft" mandatory=true versionRange="[1.15.2]" ordering="NONE" side="BOTH" ``` 修改pack.mcmeta --- 再來,來修改一下src/main/resources下的pack.mcmeta 很簡單的,只要修改description(→ܫ←) \_comment看過後就可以刪了,它是告訴你pack_format的5代表什麼意思 最後大概會像這樣 ```json= { "pack": { "description": "Immortalmice's Mod Tutorial resources", "pack_format": 5 } } ``` 如何執行Server並用Client登入 --- 那麼,一切都完成了,在Eclipse將專案重新整理後,在執行一次runClient吧 如果沒有意外,你應該可以正常啟動遊戲,並且在Mod頁面中看到你剛剛寫的所有東西(〃∀〃) ![圖1-2-2 遊戲內Mod頁面](https://i.imgur.com/NEiVM6Q.jpg) 當然,也別忘了執行runServer來看看吧 記得,你必須要同意[eula](https://account.mojang.com/documents/minecraft_eula)條例,eula.txt這個東西現在在run資料夾底下 如果你同意條例,那就改成true ```java= eula=true ``` 如果不同意...恩,我想你可能要思考一下Minecraft對你而言是什麼樣的遊戲 畢竟不同意代表你無法擁有使用Minecraft(包含購買、下載、遊玩)(°ཀ°) 如果runServer成功執行並提供服務了 你可以用剛才runClient的客戶端進行localhost登入 ![圖1-2-3 遊戲內多人連線頁面](https://i.imgur.com/o1vusAA.jpg) 請注意,預設的server.properties中的online-mode是true 而runClient中使用登入的是一個叫Dev的預設非正版驗證帳號(◞‸◟) (這是當然的,Forge不會知道你的帳號是啥) 你可以選擇把online-mode改為false,或看本頁最後的小節了解如何在用你的帳號在runClient中登入 如何獲得自己模組編譯後的jar檔 --- 好了,我們現在可以在開發環境執行測試了 那如果我要發布我的模組怎麼辦?我的jar檔在哪?(|||゚д゚) 很簡單,打開你的Gradle Tasks 選擇build下的build執行(繞口令?(((゚д゚))) ![圖1-2-4 Gradle build Task](https://i.imgur.com/7jkwrU4.jpg) 執行完之後,打開build/libs資料夾 裡面躺著就是你珍貴的jar檔啦! 如何設定runClient用自己的Minecraft帳號登入 --- 打開Run Configuration,選擇runClient,打開Arugument ![圖1-2-5 runClient的Argument頁面](https://i.imgur.com/vvqH9Zj.jpg) 在Program Arugument用以下格式這邊打上你的帳密 ![圖1-2-6 Program Arugument輸入](https://i.imgur.com/Uqop8sQ.jpg) 如果你很機敏,你應該已經察覺到事情不對勁了 **就算這樣子我可以用自己帳號登入好了,我這不是把我的帳密用 "明碼" 寫在這裡嗎?** Yes!沒錯,讓我來告訴你另一個更可怕的事實吧。 按下Apply後Close,現在打開你的runClient.launch看看 ![圖1-2-7 runClient.launch內容](https://i.imgur.com/5I3f3jd.jpg) **欸欸欸欸,M鼠你坑我,我的密碼被用明碼存在檔案裡了啦!** ╯-____-)╯~═╩════╩═ Yes!請注意,就如同你的擔心一樣 若想要用自己的帳號在開發環境中登入,會有用明碼儲存帳密造成的風險存在 **因此如果你想用這方法,請保護好你的runClient.launch檔案不要洩漏給別人**┬─┬ ノ( ' - 'ノ) 如果你是用git的朋友,你可以看一下Forge幫你寫的.gitignore 你會看到有一行 ``` *.launch ``` 是的,如果你沒修改.gitignore,你的launch檔是不會被上傳的 但如果你要用這方法,**強烈建議一定要親自去.gitignore看一下**(╯°▽°)╯ ┻━┻ 你說,只有這個方法嗎,我一定要用明碼寫下我的帳密才能用自己的帳號測試模組嗎? 恩,當然有其他方法,只是稍微麻煩一些 還記得上一節中講的build task後獲得的jar檔嗎? 你可以把這jar檔拿去加入在你已安裝Forge的Minecraft上 用這樣的方式你就可以不用用明碼儲存你的帳密,但是可以用你的帳號測試模組了(。A。) *PS.如何安裝Forge並加入模組,這邊就不做說明,如果不知道請自行查詢* Anyway,如果你設定好了Program Argument,執行後你應該就會用你的Minecraft帳號登入了 ![圖1-2-8 成功用自己帳號登入](https://i.imgur.com/Hjcj9el.png) ~~M鼠Skin萌萌達~~(*´∀\`)~♥ --- *本頁面撰寫於2020/04/29,目前最後更新日期為2020/04/29* *若上述時間與你閱讀的時間相距過遠,請自行斟酌是否採用本頁面的資訊* *完整的程式碼可以到本教學文的[Github Repo](https://github.com/immortalmice/MinecraftForge1.15.2-ModdingTutorial)中查看*