Minecraft 1.14.4 Forge Modの作成 その2 【基本的なファイルの配置】

# はじめに
Minecraft 1.12.2の時に比べて書き方が大きく変わっている印象を受けました。
基本的なファイルを配置し、MinecraftがModを読み込むところまで進めます。

![2019-09-16_14.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/4471f038-889f-37cc-c4c7-a5087c227f33.png)

2019/10/29 下記例外が発生するため、pack.mcmetaの修正

```
Caused by: com.google.gson.stream.MalformedJsonException: Expected name at line 5 column 6 path $.pack.pack_format
```

# 💻開発環境
ここでは環境は以下のようにします。

- Windows 10
- JDK 8u211
- Minecraft 1.14.4
- Minecraft Forge 1.14.4 (28.1.0)
- IntelliJ IDEA 2019.1.4

# パッケージの作成
まずはパッケージ(フォルダ)を作成しておきます。
パッケージの名前の付け方には一般的な決め方があります。

- GroupId: 組織名のこと。一般的にはドメインを逆から書く形式
- ArtifactId: プロジェクトの名前

これに従って名前を決めた時、パッケージを作成すると以下のようになります。

| 項目       | 値         |
|------------|------------|
| GroupId    | jp.yuyu  |
| ArtifactId | biwako_mod |

```
C:\Users\HIRO\IdeaProjects\biwako_mod
└─src
    └─main
        ├─java
        │  └─jp
        │      └─yuyu
        │          └─biwako_mod
        └─resources
            └─assets
                └─biwako_mod
```

# pack.mcmeta
リソースパックの詳細を記載するファイルです。
前回落としてきたMdk、`forge-1.14.4-28.1.0-mdk.zip`の中にサンプルが入っているのでそれを参考に書いてみます。
`resources`フォルダ内にファイルを作成します。

>1.7以前は"pack_format": 1に、1.8以降からは"pack_format": 2,に、1.11以降から1.12までは"pack_format": 3に,1.13以降は"pack_format":4にする必要があります。

[リソースパック/作り方 - Minecraft Japan Wiki - アットウィキ](https://w.atwiki.jp/minecraft/pages/1374.html)より

今回はMinecraft 1.14.4なので、`"pack_format":4`になります。

```
└─resources
    │  *pack.mcmeta
    │
    └─assets
        └─biwako_mod
```

```json:pack.mcmeta
{
    "pack": {
        "description": "Biwako Mod resources",
        "pack_format": 4
    }
}
```

# mods.toml
Mod情報を記載するファイルです。
Minecraft 1.12.2では`mcmod.info`だったものですね。

同様に`forge-1.14.4-28.1.0-mdk.zip`の中にサンプルが入っているのでそれを参考に書いてみます。

`resources/META-INF`フォルダを作成してその中に`mods.toml`を配置します。
また、ロゴファイルは`resources`フォルダ内に配置して、そのファイルパスを指定することにします。


```
└─resources
    │  pack.mcmeta
    │  *logo.png
    │
    ├─assets
    │  └─biwako_mod
    │
    └─*META-INF
            *mods.toml
```

```toml:mods.moml
# 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="[28,)" #mandatory (28 is current forge version)
# A list of mods - how many allowed here is determined by the individual mod loader
[[mods]] #mandatory
# The modid of the mod
modId="biwako_mod" #mandatory
# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it
version="1.0.0"
# A display name for the mod
displayName="Biwako Mod" #mandatory
# A URL for the "homepage" for this mod, displayed in the mod UI
displayURL="https://github.com/Hiroya-W/biwakoMC" #optional
# A file name (in the root of the mod JAR) containing a logo for display
logoFile="logo.png" #optional
# A text field displayed in the mod UI
authors="Hiroya_W" #optional
# The description text for the mod (multi line!) (#mandatory)
description='''
Biwako is the largest lake in Japan.
'''
# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.
[[dependencies.biwako_mod]] #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="[28,)" #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.biwako_mod]]
    modId="minecraft"
    mandatory=true
    versionRange="[1.14.4]"
    ordering="NONE"
    side="BOTH"
```

# メインクラス
## 作成
`BiwakoMod.java`を以下の位置に配置します。

```
└─src
    └─main
        ├─java
        │  └─jp
        │      └─yuyu
        │          └─biwako_mod
        │                  *BiwakoMod.java
```

## ひな型
- `@Mod`アノテーションには`MOD_ID`名のみ記述する。
なので、1.12.2での`MOD_NAME`、`MOD_VERSION`は`mods.toml`のみで管理するのだと思う。
- `@Mod`アノテーションのあるクラスのコンストラクタで、初期化処理のリスナを登録する
- `setup`メソッドが1.12.2の`preInit`メソッドに相当する。
- `doClientStuff`はクライアント側でのみ実行する初期化処理を記述する。
1.12.2の`ClientProxy`に相当する。

詳しくは[【Forge】1.13.2での自作したEntityとEntityRenderの登録方法](https://qiita.com/noriokun4649/items/49523ecc546acde7a8ca)に詳しく書かれていました。

そして、おそろくこれがメインクラスのひな型になる。

```java:BiwakoMod.java
package jp.yuyu.biwako_mod;

import net.minecraft.block.Block;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegistryEvent;
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.javafmlmod.FMLJavaModLoadingContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;


// The value here should match an entry in the META-INF/mods.toml file
@Mod(BiwakoMod.MOD_ID)
public class BiwakoMod
{
    public static final String MOD_ID = "biwako_mod";

    // Directly reference a log4j logger.
    private static final Logger LOGGER = LogManager.getLogger();

    public BiwakoMod() {
        // Register the setup method for modloading
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
        // Register the doClientStuff method for modloading
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);
        // Register ourselves for server and other game events we are interested in
        MinecraftForge.EVENT_BUS.register(this);
    }

    private void setup(final FMLCommonSetupEvent event)
    {
        // some preinit code
        LOGGER.info("HELLO FROM PREINIT");
    }

    private void doClientStuff(final FMLClientSetupEvent event) {
        // do something that can only be done on the client
        LOGGER.info("HELLO FROM Client Setup");
    }

    // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD
    // Event bus for receiving Registry Events)
    @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD)
    public static class RegistryEvents {
        @SubscribeEvent
        public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) {
            // register a new block here
            LOGGER.info("HELLO from Register Block");
        }
    }
}
```

# Minecraftの起動

![2019-09-16_14.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/4471f038-889f-37cc-c4c7-a5087c227f33.png)

---
[Github](https://github.com/Hiroya-W/biwakoMC/tree/1.14.4)にてプロジェクトを公開しています。