ChatGPTにMODを作ってもらおうと思います。前編はChatGPTに任せきりにして、後編で手直ししていこうと思います。結論から申し上げますとあまりうまくいきませんでした。
はじめに
ChatGPTを使ってUnityでゲームを作っている記事を読んだので、それならMineraftのMODも作れるではないかと思いました。
Forgeを導入する手順をすっ飛ばしている気がしますが、このように丁寧に教えてくれます。私はIntelliJの方が慣れているので、IntelliJでのやり方を聞いてみましょう。 このように説明してくれました。
実際に作ってみる
どんなMODを作るか、ChatGPTに訊いてみました。
自分で考えろと言われてしまいました。試しに、工業MODを作ってみましょう。 このように説明してくれました。
次に、コードを生成してもらいましょう。 ご丁寧に鉄のピッケルの作り方を解説してくれました。
質問を変えてみます。
急にそれっぽいコードを出してくれました。
見切れてしまったので、以下に載せておきます。
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;
}
}
}
レシピを登録する方法も教えてくれました。
動かない
しかしこのコード、動きません。
Forgeはバージョンによってクラス名やメソッド名がコロコロ変わるので、「こんなクラス無いよ」「@Override
書いてるのにオーバーライドしてないよ」などと怒られます。
手元に作ってあった最新の環境(1.18.1)だと例えばTileEntity
クラスなんかがありません。たまたま残っていた古い環境(1.10.2)だとBlockState
とかIBlockRender
とかが見つかりません。
赤字になっている箇所がConnot resolve symbolです(1.10.2の場合)。
@Override
を付けたメソッドが親クラス(Block
)に無いと言われています。
オーバーライドについては、@Override
を付けておくとオーバーライドできなかったとき(指定したメソッドが存在しないとき)にコンパイルエラーが出ます。付けなかった場合はオーバーライドできていてもいなくても通ってしまいます。
前編はこれにて終了です。後編ではこれを動くようにしていこうと思います。