こちらはPCゲーム「Minecraft」のMod作製の解説記事です。
Minecraft.1.12.2、
Forge-1.12.2-14.23.2.2611での解説になります。
ここではMinecraft-1.15.2のMod開発での「アイテムの追加」の方法を解説します。
この記事を書いている私自身が元々はJavaを勉強したことが無い状態からMod作製を始めたので、説明内容などはプロのプログラマーの人が見たら「既に知っている」事や「当たり前」の事などもあると思います。この記事は私の様にJavaに初めて触れる人や、これからMod作製に挑戦したい人やMod作製の初心者の人の為に書いているものなので、専門用語を使う時と使わない時があります。また、記載内容に誤りや私自身の理解が誤っている可能性がある事をご了承ください。
アイテムの追加
アイテム登録用のクラスを作る
アイテムを追加する為に必要なレジストリ登録用のクラスを作成する。効果の無いアイテム(素材用)の追加だけなら、このクラスだけで完結させる事も出来る。
@Mod.EventBusSubscriber(modid = Golemist.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public final class GolemistItems {
public static final Item PUMPKIN_ROD = registerItem(new PumpkinRodItem(noStackNoDurability(new Item.Properties())),
LibraryItemNames.PUMPKIN_ROD);
public static final ToolBase WOODEN_STICK = registerItem(new ToolBase(setDefault(new Item.Properties()),
GolemItemTier.WOOD,
ToolType.STICK),
LibraryItemNames.WOODEN_STICK);
public static final Item TEST_ITEM = new Item(setDefault(new Item.Properties())).setRegistryName("test_item");
private static <T extends Item> T registerItem(T item, String name) {
item.setRegistryName(name);
return item;
}
private static Item.Properties setDefault(Item.Properties properties) {
properties.group(Golemist.CREATIVE_TAB);
return properties;
}
private static Item.Properties noStackNoDurability(Item.Properties properties) {
properties.maxStackSize(1);
return setDefault(properties);
}
private static Item.Properties setStackSize(Item.Properties properties, int size) {
properties.maxStackSize(size);
return setDefault(properties);
}
@SubscribeEvent
public static void registerItems(RegistryEvent.Register<Item> event) {
try {
for (Field field : GolemistItems.class.getDeclaredFields()) {
Object obj = field.get(null);
if (obj instanceof Item && ((Item) obj).getRegistryName() != null) {
event.getRegistry().register((Item) obj);
}
else if (obj instanceof Item[]) {
for (Item item : (Item[]) obj) {
event.getRegistry().register((item));
}
}
}
} catch (IllegalAccessException exception) {
throw new RuntimeException(exception);
}
}
}
上に載せたコードが私が自作しているModでのアイテム登録用クラスで、見やすくするために他のアイテムの登録は消してある。
クラスの初めに記述している「public static final Item PUMPKIN_ROD =」が登録したいアイテムの登録内容を作成している。newでアイテムのインスタンスを生成し、その中でItem.Propertiesのインスタンスを生成し、アイテムの登録名とを引数として「registerItem」という同クラス内のメソッドに渡す。「registerItem」に渡す「Item.Properties」の設定に同クラス内のメソッド「noStackNoDurability」を使用している。
この「noStackNoDurability」と他の2つ「setStackSize」「setDefault」を使い分けてプロパティを設定している。Item.Propertiesの設定はそれぞれのアイテムクラスのコンストラクタで個別に設定する事も可能だが、私の場合はレジストリ登録をするこのクラスで他のアイテムと比較をし易くする為や、プロパティの設定漏れを防ぐ目的でここで設定する事にしている。
・setDefault(Modのクリエイティブタブへの登録のみ)
・noStackNoDurability(setDefault + 耐久値無しのスタック数1)
・setStackSize(setDefault + スタック数の設定)
「public static final ToolBase WOODEN_STICK =」はツールの登録で、ここで詳しくは書かないが、コンストラクタでツールの素材とツールのタイプを設定するだけで、攻撃力、採掘速度、耐久値などのツールに必要なプロパティが設定されるようにしてある。このクラスの解説は別の記事に記載する予定。Javaに慣れている人でツールを作りたい人は「Items」クラスのレジストリ登録の記述で「SwordItem」などの部分を見ると分かるかも知れない。
ツールの登録の部分を消さずに記載したのは、私のようにJavaを勉強中の人が登録の方法を自身の好みや目的にあったものを見つけられたらと思ったから。
それぞれのアイテムクラス内のコンストラクタでItem.Propertiesのインスタンスを生成するメリットと思ったのはレジストリ登録クラスでの記述が減るので、登録の記述が見易くなる。新しく作ったアイテムクラスをレジストリ登録をする際にもコピペで済むものが多くなると思う。
私のModの場合はゴーレム用の装備やツールなどの通常のアイテムとは違い攻撃力や耐久値などを持つアイテムの追加があり、それの攻撃力などは個別設定では無く、ツールの素材やツールのタイプで自動的に計算されるようにコンストラクタで記述している為、レジストリ登録クラスでItem.Propertiesのインスタンスを生成している。他にもルーン文字などの追加も行うので、個別のアイテムクラスでは無くツール類のように、1つのクラスでプロパティの内容の違った複数のアイテムを作成するので、上記の方法を選択した。また、何の効果も持たないレシピ用の素材アイテムなどを登録するする際にsetDefault()などのメソッドを使用する事で、登録の記述量は少なくて済む。そういったアイテムは個別のクラスを作る必要も無いので、メソッドを使いまわしやすい。3つ目の記述「public static final Item TEST_ITEM = 」がそれである。
アイテムの登録名を設定する際に呼び出している「LibraryItemNames」クラスはアイテムの登録名を定数で記述したクラスで、記述ミスを防ぐ為に使用している。なので、そういったものが不要な人は”アイテム名”で記述しても問題は無い。ちなみに「LibraryItemNames」での記述は、
public static final String PUMPKIN_ROD = “pumpkin_rod”;
「public static void registerItems」ではこのクラス内のフィールド(登録するアイテム)の数だけfor文で登録を繰り返すメソッドである。メソッドの注釈に「@SubscribeEvent 」を記述している事と、クラスの注釈に「@Mod.EventBusSubscriber(modid = Golemist.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)」を記述すると、Modの読み込み時に自動的に呼び出してくれるので、他のクラスなどからレジストリ登録メソッドを呼び出さなくても良くなる。
後はアイテムを描画するモデルとテクスチャを用意するだけで単純なアイテムは完成となる。
モデルはsrc/main/resources/assets/ModのID/models/item内で、テクスチャは「src/main/resources/assets/ModのID/textures/item」に入れる必要がある。用意したテクスチャをそのまま描画するだけのアイテムであれば、Minecraft本体のmodelのjsonファイルをコピーして、ファイル名や記述内のテクスチャ名をなどの参照を書き換えるだけで良い。
※アイテムクラスでの記述などは少しずつ追記していく予定ですが、「こういった部分を知りたい」などの要望があれば、優先して追記したいと思っています。私が理解して説明できるようになっている部分に限定されますが、気になる方はコメントにて要望や質問をして頂ければと思います。