---
# System prepended metadata

title: 模組的入口

---

模組的入口
===

好不容易建立起開發環境了
打開遊戲居然是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)中查看*