ChatGPTにMinecraftのMODを作ってもらう(前編)

ChatGPTにMODを作ってもらおうと思います。前編はChatGPTに任せきりにして、[後編](https://qiita.com/zawanume/items/ef74181a393aafd5b698)で手直ししていこうと思います。結論から申し上げますとあまりうまくいきませんでした。

# はじめに
ChatGPTを使ってUnityでゲームを作っている記事を読んだので、それならMineraftのMODも作れるではないかと思いました。
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/337a7c89-efae-4c07-369c-e2e58c24bfe9.png" width=75%">
</div>
Forgeを導入する手順をすっ飛ばしている気がしますが、このように丁寧に教えてくれます。<br>
私はIntelliJの方が慣れているので、IntelliJでのやり方を聞いてみましょう。
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/d90059b6-3399-2e21-a2af-8da33e0101c5.png" width="75%">
</div>
このように説明してくれました。

# 実際に作ってみる
どんなMODを作るか、ChatGPTに訊いてみました。
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/b24becd3-2382-09d0-43e8-d2f04f7e3773.png" width="75%">
</div>
自分で考えろと言われてしまいました。<br>
試しに、工業MODを作ってみましょう。
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/a7b387d5-1dd2-e3cc-898d-7834a7ff92c8.png" width="75%">
</div>
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/69daa72b-6197-7179-36a2-ff3282cd2d14.png" width="75%">
</div>
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/59320b0c-6e14-fc6e-4f98-efff9eeeb801.png" width="75%">
</div>
このように説明してくれました。<br>
次に、コードを生成してもらいましょう。
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/f4107683-c14e-120a-ffad-97c89a11c99f.png" width="75%">
</div>
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/cf6123c4-b517-f828-a289-734556688ca6.png" width="75%">
</div>
ご丁寧に鉄のピッケルの作り方を解説してくれました。<br>
質問を変えてみます。
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/b321c0a6-e602-43f0-4ae1-0c837b711d71.png" width="75%">
</div>
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/f71fdada-fd14-90de-44cc-2ab6582b3646.png" width="75%">
</div>

急にそれっぽいコードを出してくれました。
見切れてしまったので、以下に載せておきます。

```java:IronGenerator.java
public class IronGenerator extends Block {
    public IronGenerator() {
        super(Properties.create(Material.IRON)
            .hardnessAndResistance(5.0f, 6.0f)
            .sound(SoundType.METAL));
        setRegistryName("iron_generator");
    }

    @Override
    public boolean hasTileEntity(BlockState state) {
        return true;
    }

    @Nullable
    @Override
    public TileEntity createTileEntity(BlockState state, IBlockReader world) {
        return new IronGeneratorTileEntity();
    }

    public class IronGeneratorTileEntity extends TileEntity {
        private int fuelAmount = 0;
        private int electricityAmount = 0;
        private int maxFuelAmount = 1000;
        private int maxElectricityAmount = 10000;
    
        @Override
        public void tick() {
            if (!world.isRemote) {
                if (fuelAmount > 0) {
                    fuelAmount--;
                    electricityAmount += 100;
                    if (electricityAmount > maxElectricityAmount) {
                        electricityAmount = maxElectricityAmount;
                    }
                }
            }
        }
    
        public int getFuelAmount() {
            return fuelAmount;
        }
    
        public int getElectricityAmount() {
            return electricityAmount;
        }
    
        public int getMaxFuelAmount() {
            return maxFuelAmount;
        }
    
        public int getMaxElectricityAmount() {
            return maxElectricityAmount;
        }
    
        public boolean isBurning() {
            return fuelAmount > 0;
        }
    
        public boolean isFull() {
            return electricityAmount >= maxElectricityAmount;
        }
    
        public void setFuelAmount(int fuelAmount) {
            this.fuelAmount = fuelAmount;
        }
    
        public void setElectricityAmount(int electricityAmount) {
            this.electricityAmount = electricityAmount;
        }
    }
}
```

レシピを登録する方法も教えてくれました。
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/f80d730a-b4b3-f34a-9105-c0a5056d430f.png" width="75%">
</div>
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/5bb8ec69-7415-9ceb-e91f-4b634a66ed54.png" width="75%">
</div>

# 動かない
しかしこのコード、動きません。
Forgeはバージョンによってクラス名やメソッド名がコロコロ変わるので、「こんなクラス無いよ」「`@Override`書いてるのにオーバーライドしてないよ」などと怒られます。
手元に作ってあった最新の環境(1.18.1)だと例えば`TileEntity`クラスなんかがありません。たまたま残っていた古い環境(1.10.2)だと`BlockState`とか`IBlockRender`とかが見つかりません。
赤字になっている箇所がConnot resolve symbolです(1.10.2の場合)。
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/98577942-8841-68f6-c51c-0812658f5578.png" width="75%">
</div>

`@Override`を付けたメソッドが親クラス(`Block`)に無いと言われています。
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/2ff2959a-6f1b-a981-1214-0896201bcaa6.png" width="75%">
</div>

オーバーライドについては、`@Override`を付けておくとオーバーライドできなかったとき(指定したメソッドが存在しないとき)にコンパイルエラーが出ます。付けなかった場合はオーバーライドできていてもいなくても通ってしまいます。<br><br>

前編はこれにて終了です。[後編](https://qiita.com/zawanume/items/ef74181a393aafd5b698)ではこれを動くようにしていこうと思います。