[Java]MinecraftのModを作成しよう 1.16.1【基本ファイル】

（この記事は一連の解説記事の一つになります）

先頭記事：[入門編](https://qiita.com/koteko/items/8d32c8819e3f9e6a333a)
前の記事：[入門編](https://qiita.com/koteko/items/8d32c8819e3f9e6a333a)
次の記事：

# 基本ファイル
基本となるファイル類を設定していきます。[前回](https://qiita.com/koteko/items/8d32c8819e3f9e6a333a)でコピペしたファイル群があるので、これらを自分用に変更していきます。

## パッケージ名
[パッケージ命名規約](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8_(Java)#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E5%91%BD%E5%90%8D%E8%A6%8F%E7%B4%84)を読むと、所持するドメインを名前空間として用いることで、競合を避けることが求められるとのことです。しかしドメインを所持していないので、以下のようにしました。

```:変更前
D:\projects\mc_liveinwater\src\main\java
  └ com
      └ example
　         └ examplemod
　             └ ExampleMod.java
```

```:変更後
D:\projects\mc_liveinwater\src\main\java
  └ jp
     └ koteko
          └ liveinwater
              └ LiveInWater.java
```

## assetsフォルダ、dataフォルダ
テクスチャや効果音などのファイルを配置する `assets\liveinwater` フォルダ、レシピやドロップ表などのファイルを配置する`data\liveinwater`フォルダを作成しておきます。

```
D:\projects\mc_liveinwater\src\main\resources
   ├ assets
   │  └ liveinwater
   ├ data
   │  └ liveinwater
   ├ META-INF
   │   └ mods.toml
   └ pack.mcmeta
```

## pack.mcmeta
`pack.mcmeta` ファイルはリソースパックの詳細を記載するファイルです。
詳しくは[Wiki](https://w.atwiki.jp/minecraft/pages/1374.html#id_14c3aae1)を参照しましょう。1.15以降なので`pack_format`は5です。コメント行は不要なので削除します。

```:変更後
{
    "pack": {
        "description": "live in water Mod resources",
        "pack_format": 5
    }
}
```

## mods.toml
`mods.toml` ファイルはMod情報を記載するファイルです。
依存などの情報に加え、mod導入時の画面に表示される情報もここに含まれるため、必要に応じて変更しましょう。
長いですが、各項目の説明がコメントで書かれているだけなのでよく読んで適切に設定しましょう。`mandatory` は必須、 `optional` は任意項目です。

```toml:mods.toml
# This is an example mods.toml file. It contains the data relating to the loading mods.
# There are several mandatory fields (#mandatory), and many more that are optional (#optional).
# The overall format is standard TOML format, v0.5.0.
# Note that there are a couple of TOML lists in this file.
# Find more information on toml format here:  https://github.com/toml-lang/toml
# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml
modLoader="javafml" #mandatory
# A version range to match for said mod loader - for regular FML @Mod it will be the forge version
loaderVersion="[32,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions.
# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties.
# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here.
license="MIT License"
# A URL to refer people to when problems occur with this mod
#issueTrackerURL="http://my.issue.tracker/" #optional
# A list of mods - how many allowed here is determined by the individual mod loader
[[mods]] #mandatory
# The modid of the mod
modId="liveinwater" #mandatory
# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it
version="${file.jarVersion}" #mandatory
 # A display name for the mod
displayName="live in water Mod" #mandatory
# A URL to query for updates for this mod. See the JSON update specification <here>
#updateJSONURL="http://myurl.me/" #optional
# A URL for the "homepage" for this mod, displayed in the mod UI
#displayURL="http://example.com/" #optional
# A file name (in the root of the mod JAR) containing a logo for display
#logoFile="examplemod.png" #optional
# A text field displayed in the mod UI
#credits="Thanks for this example mod goes to Java" #optional
# A text field displayed in the mod UI
#authors="Love, Cheese and small house plants" #optional
# The description text for the mod (multi line!) (#mandatory)
description='''
live in water
 – deep, silent, sea.
'''
# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.
[[dependencies.liveinwater]] #optional
    # the modid of the dependency
    modId="forge" #mandatory
    # Does this dependency have to exist - if not, ordering below must be specified
    mandatory=true #mandatory
    # The version range of the dependency
    versionRange="[32,)" #mandatory
    # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory
    ordering="NONE"
    # Side this dependency is applied on - BOTH, CLIENT or SERVER
    side="BOTH"
# Here's another dependency
[[dependencies.liveinwater]]
    modId="minecraft"
    mandatory=true
    versionRange="[1.16.1]"
    ordering="NONE"
    side="BOTH"
```
`license`については、いずれ配布を考えるなら、コメントにある[参考ページ](https://choosealicense.com/)などをよく読み、きちんと設定するべきでしょう。(私は詳しくないので一旦 MIT License としておきました。)
そのほか必須でないものは適宜コメントアウトしました。

## メインファイル
`LiveInWater.java`(元は`ExampleMod.java`)がModのメインクラスとなります。明らかに使わなそうなものなど消してすっきりさせます。

```java:LiveInWater.java
package jp.koteko.liveinwater;

import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent;
import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Mod("liveinwater")
public class LiveInWater
{
    private static final Logger LOGGER = LogManager.getLogger();

    public LiveInWater() {
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::enqueueIMC);
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::processIMC);
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);

        MinecraftForge.EVENT_BUS.register(this);
    }

    private void setup(final FMLCommonSetupEvent event)
    {
        LOGGER.info("SETUP START");

        LOGGER.info("SETUP END");
    }

    private void doClientStuff(final FMLClientSetupEvent event) {
        // do something that can only be done on the client
    }

    private void enqueueIMC(final InterModEnqueueEvent event)
    {
        // some example code to dispatch IMC to another mod
    }

    private void processIMC(final InterModProcessEvent event)
    {
        // some example code to receive and process InterModComms from other mods
    }

    @SubscribeEvent
    public void onServerStarting(FMLServerStartingEvent event) {
        LOGGER.info("server starting");
    }
}
```
ファイル名(`LiveInWater.java`)とクラス名(`public class LiveInWater`)およびコンストラクタ(`public LiveInWater()`)が一致していることを確かめましょう。またmodIdの指定(`@Mod("liveinwater")`)が上で編集した`mods.toml` での指定と同じであるか確認しましょう。
このクラスが行っていることのイメージとしては、4つのライフサイクルをレールに乗せて、そのレールをForge上に挿入してやる感じです。これらの扱いはまだ詳しくないので一応4つ残しておきます。
また末尾の方にブロックを登録するコードがあったと思いますが、これは別にクラスを用意したほうがすっきりするのでこのファイル上では削除しました。

## 起動確認
最後に念のためゲームが起動することを確認しておきます。起動したらmodsを開いて情報が更新されていることを確認します。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256627/69180744-aa12-89cd-b044-7f3363f671fa.png)
`VERSION`がNONEですが、これは実際にModのjarファイルを構成するときに付与するので、ここではNONEになります。


# 参考
[Structuring Your Mod - Forge Documentation](https://mcforge.readthedocs.io/en/1.15.x/gettingstarted/structuring/)
[[Java]MinecraftのModを作成しよう 1.14.4【0. 基本ファイル】](https://qiita.com/koteko/items/0022f3819302aaa46b7d)
[Minecraft 1.14.4 Forge Modの作成 その2 【基本的なファイルの配置】](https://qiita.com/Hiroya_W/items/f54fb5b85b408c4e5a38)

# 次の記事