別に読まなくていい前置き
こんにちは、私です。この間マイクラで使うMOD選定をしていたのですが、いい感じのMODがなかったので、ここは自分でMODを作ってウハウハしていきたいと思います。途中で遊んだりもしますが、この記事はその過程も含めてのメモです。
なお、プログラミング知識が不足しているがゆえに、表記が不明瞭でしたり、あからさまな間違いのある可能性がありますが、ご了承ください。
本編
まず公式ガイドに従って環境構築を終えました。
Minecraft JE 1.21
Fabric loader 0.16.9
Java 21
Intellij IDEA Community Edition 2024.2.3
アイテムを追加してみる
ディレクトリ構成はこんな感じです。MOD名がTemplateModとデフォルトのままなので分かりにくい所があるかもしれません。
TemplateMod.java
package io.github.scratch221171.init;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.component.type.FoodComponent;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroups;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.Identifier;
import static io.github.scratch221171.TemplateMod.MOD_ID;
public class item {
public static Item register(Item item, String id) {
// Create the identifier for the item.
Identifier itemID = Identifier.of(MOD_ID, id);
// Register the item.
Item registeredItem = Registry.register(Registries.ITEM, itemID, item);
// Return the registered item!
return registeredItem;
}
public static void Init() {
final Item SUSPICIOUS_SUBSTANCE = register(new Item(new Item.Settings().food(new FoodComponent.Builder().nutrition(5).saturationModifier(5).build())), "suspicious_substance");
ItemGroupEvents.modifyEntriesEvent(ItemGroups.INGREDIENTS).register((itemGroup) -> itemGroup.add(SUSPICIOUS_SUBSTANCE));
}
}
item.java
package io.github.scratch221171.init;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.component.type.FoodComponent;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroups;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.Identifier;
import static io.github.scratch221171.TemplateMod.MOD_ID;
public class item {
public static Item register(Item item, String id) {
//アイテムの識別ID
Identifier itemID = Identifier.of(MOD_ID, id);
//登録
Item registeredItem = Registry.register(Registries.ITEM, itemID, item);
//戻り値
return registeredItem;
}
public static void Init() {
final Item SUSPICIOUS_SUBSTANCE = register(new Item(new Item.Settings().food(new FoodComponent.Builder().nutrition(5).saturationModifier(5).build())), "suspicious_substance");
ItemGroupEvents.modifyEntriesEvent(ItemGroups.INGREDIENTS).register((itemGroup) -> itemGroup.add(SUSPICIOUS_SUBSTANCE));
}
}
ちゃんとモデル、テクスチャ、アイテム名が反映されていますね。公式ガイドでは英語(en_us
)のみでしたがja_jp
を使えば日本語に対応することができるみたいです。
クラフトレシピはresources/data/(mod-id)/recipe/(item).json
で指定できます。詳しい書き方はこちらを参照のこと。Recipe JSON Generatorを使うと便利。クラフトレシピは作業台だけでなく鍛冶台なども指定できるようです。
食べ物にも指定できるみたいなのでやってみましょう。Initメソッドのアイテムを追加する部分をいじってみます。
public static void Init() {
final Item SUSPICIOUS_SUBSTANCE = register(new Item(new Item.Settings().food(new FoodComponent.Builder().nutrition(5).build())), "suspicious_substance");
ItemGroupEvents.modifyEntriesEvent(ItemGroups.INGREDIENTS).register((itemGroup) -> itemGroup.add(SUSPICIOUS_SUBSTANCE));
}
ちゃんと食べられて、満腹度も回復しますね。エフェクトとかも追加できるみたいです。
Hot swapping
調べてみるとどうやらIntellijにはHot swappingなる機能があるそうです。デバッグモードでマイクラを起動すれば、再起動せずメソッド内を変更を反映できるとのことです。ウィンドウ上部のビルド(B)
>プロジェクトの再ビルド(R)
をクリックすると、確認が出てきて変更できるらしいです。
私の場合、アイテムの満腹度の数値をいじってもHot swappingで変更できませんでしたが、初期化するときのメソッドの中にありますし、そもそもメソッドが呼ばれなかった可能性もあるので、後々別の要素を追加したときにまた試してみたいと思います。
ツール・防具を追加してみる
アイテムを追加したらもちろん次は装備を追加しますよね。ということで早速やってみましょう。
TestMaterial.java
package io.github.scratch221171;
import io.github.scratch221171.init.item;
//ここを忘れるとエラー吐く
import net.minecraft.block.Block;
import net.minecraft.item.ToolMaterial;
import net.minecraft.recipe.Ingredient;
import net.minecraft.registry.tag.BlockTags;
import net.minecraft.registry.tag.TagKey;
public class TestMaterial implements ToolMaterial {
@Override
public int getDurability() {
return 455;
}
@Override
public float getMiningSpeedMultiplier() {
return 5.0F;
}
@Override
public float getAttackDamage() {
return 1.5F;
}
@Override
public TagKey<Block> getInverseTag() {
return BlockTags.INCORRECT_FOR_IRON_TOOL;
}
@Override
public int getEnchantability() {
return 22;
}
@Override
public Ingredient getRepairIngredient() {
return Ingredient.ofItems(item.SUSPICIOUS_SUBSTANCE);
}
public static final TestMaterial INSTANCE = new TestMaterial();
}
そうすると、最後のgetRepairIngredient()
でitem.SUSPICIOUS_SUBSTANCE
の所がシンボルを解決できないとかなんとか言われました。これはitemクラスで変数SUSPICIOUS_SUBSTANCE
を定義する場所を間違えていたみたいなので、訂正しておきます。
-public static void Init() {
- final Item SUSPICIOUS_SUBSTANCE = register(new Item(new Item.Settings().food(new FoodComponent.Builder().nutrition(5).saturationModifier(5).build())), "suspicious_substance");
-
- ItemGroupEvents.modifyEntriesEvent(ItemGroups.INGREDIENTS).register((itemGroup) -> itemGroup.add(SUSPICIOUS_SUBSTANCE));
-}
+public static final Item SUSPICIOUS_SUBSTANCE = register(new Item(new +Item.Settings().food(new FoodComponent.Builder().nutrition(5).build())), "suspicious_substance");
+
+public static void Init() {
+ ItemGroupEvents.modifyEntriesEvent(ItemGroups.INGREDIENTS).register((itemGroup) -> itemGroup.add(item.SUSPICIOUS_SUBSTANCE));
+}