前回からの続き
前回は、アイテム追加をしましたが、アイテムとして追加されただけで、食べられません!!!食品サンプルかっ!?
ということで、今回は「これは食べ物です!」という実装をします。
食べ物アイテムにした後は、これを自分のMOD用のインベントリを作って、そちらに入れてみます。
今回の作業後画面
開発
作業は次の3点。
①前回作ったアイテムに食べ物としての設定を追加する
②食べ物の特性を設定する
③アイテムグループを作成し、前回作ったアイテムを入れる
1.前回作ったアイテムを食べ物にする
前回、ModItemsのクラスにONIGIRIというアイテムを作りましたが、Item.Settingsにfood()メソッドを呼び出して食料にします。
FabricのWikiを見ると、foodメソッドは引数がFoodComponentとのこと。アイテムにfood()つけたあと、自作MOD用のFoodComponentsクラスを作って、ONIGIRIをnewする感じですな。きっと。
// 前回作ったアイテム追加の部分
- public static final Item ONIGIRI = register("onigiri", Item::new, new Item.Settings());
// 今回食料として追加しなおしたところ
// Itemに対して、FoodComponentを設定する
+ public static final Item ONIGIRI = register("onigiri",Item::new, new Item.Settings().food(ModFoodComponents.ONIGIRI));
2.食べ物の特性を追加する
先ほどModItemsで引数を「ModFoodComponentsクラスのONIGIRI」としているので、ModFoodComponentsクラスを新規作成し、ONIGIRIって名前のFoodComponentをインスタス化して、ONIGIRIの特性を設定していきます。作成する場所はModItemsと同じ階層に作成。
ちなみに、InteliJ IDEAを使ってる場合、SHIFTを2回クリックすると、↓みたいなのが出てきます。

非プロジェクト項目を含めるにチェックを付けて、虫眼鏡の検索のところで「FoodComponents」をクラスで検索すると……

FoodComponentsの設定が見れます。

例えば、パンだとnutrition(5).saturationModifier(0.6F) 満腹度5、満腹効率0.6Fですね。
では、とりあえずパンとおんなじくらいで、でも腹持ちいい感じにしてみます。
public class ModFoodComponents {
public static final FoodComponent ONIGIRI = new FoodComponent.Builder()
.alwaysEdible() // 空腹でなくても食べられる
.nutrition(5) // 満腹度(パンと同じ)
.saturationModifier(1.2f) // 満腹効率(パンの倍)
.build();
}
3.ModItemsクラスにアイテムグループ作成
前回、アイテム登録の時に、リエイティブタブの「食べ物を飲み物」のタブに入れたアイテムですが、今回このタブを自作MOD用に作成してそちらに入れます。ドキュメントにはすごい簡単と書いてある。とりあえずドキュメント見ながら、こういう感じ?と追加。
レジストリキーを設定して、アイテムグループを作成して、カスタムアイテムグループを登録して、カスタムアイテムグループにアイテムを追加。
public class ModItems {
// 前回作ったアイテム追加の部分
//public static final Item ONIGIRI = register("onigiri", Item::new, new Item.Settings());
// 今回食料として追加しなおしたところ
// Itemに対して、FoodComponentを設定する
public static final Item ONIGIRI = register("onigiri", Item::new, new Item.Settings().food(ModFoodComponents.ONIGIRI));
// レジストリキーを設定
public static final RegistryKey<ItemGroup> CUSTOM_ITEM_GROUP_KEY =
RegistryKey.of(Registries.ITEM_GROUP.getKey(), Identifier.of(PonmaruMod.MOD_ID, "item_group"));
// アイテムグループを作成
public static final ItemGroup CUSTOM_ITEM_GROUP = FabricItemGroup.builder()
.icon(() -> new ItemStack(ModItems.ONIGIRI))
.displayName(Text.translatable("item_group.ponmaru_mod"))
.build();
// カスタムアイテムグループを登録
public static final ItemGroup PONMARU_ITEM_GROUP = Registry.register(Registries.ITEM_GROUP, CUSTOM_ITEM_GROUP_KEY, CUSTOM_ITEM_GROUP);
public static void initialize() {
// ログに出力して、Modが正しく初期化されたことを確認する
PonmaruMod.LOGGER.info("ModItemsクラス:アイテムの登録 " + PonmaruMod.MOD_ID);
// 前回クリエイティブタブに追加(FOOD_AND_DRINKが「食べ物を飲み物」のタブ)
// ItemGroupEvents.modifyEntriesEvent(ItemGroups.FOOD_AND_DRINK)
// .register(entries -> {
// entries.add(ONIGIRI);
// });
// カスタムアイテムグループにアイテムを追加
ItemGroupEvents.modifyEntriesEvent(CUSTOM_ITEM_GROUP_KEY).
register(itemGroup -> {
itemGroup.add(ModItems.ONIGIRI);
});
}
}
いや、なんでやねんっ!!!
一応カスタムグループできたし2ページ目と表示はされてるけど、また表示バグっとるがな。泣きたい。

みんな大好きchatgptに聞いてみたら、デフォルトのリンゴにしたら表示できるかを聞かれたので試してみる。
- .icon(() -> new ItemStack(ModItems.ONIGIRI))
+ .icon(() -> new ItemStack(Items.APPL))

うむ、できますな……。アイテム登録する前に、アイテムグループが登録されると、.icon() のラムダがNULLのままItemStack が作られてしまうらしい。読み込みの順番がアイテム登録、アイテムグループ登録、の順になっていないことが原因らしい。トラック走るときアイテムグループちゃんが走るの早くて、アイテムくんを追い越した感じか?
はっ!!アイテムクラスに書くって説明だったけど、アイテムくんとアイテムグループちゃんを別クラスにして、メインで順に呼んだらいいのでは?そうすると徒競走ではなくリレーになるはず。
とりあえず実装。
……なんでや。アイテムグループもなくなってしまった。よし、最初から考えよう。よくみたら第3回で書いてたItem オブジェクトを返すとこ、まるっとないし。間違って消してるや~ん。書いててよかった備忘録。
アイテムクラスは、第3回にもどして、FoodComponentを設定した状態にして。
で、ModItemGroupsクラス作って
public class ModItemGroups {
// レジストリキーを設定
public static final RegistryKey<ItemGroup> PONMARU_GROUP_KEY =
RegistryKey.of(Registries.ITEM_GROUP.getKey(), Identifier.of(PonmaruMod.MOD_ID, "item_group"));
// カスタムアイテムグループを作成
public static final ItemGroup PONMARU_GROUP = FabricItemGroup.builder()
.icon(() -> new ItemStack(ModItems.ONIGIRI))
.displayName(Text.translatable("item_group.ponmaru_mod"))
.build();
// カスタムアイテムグループを登録
public static final ItemGroup PONMARU_ITEM_GROUP = Registry.register(Registries.ITEM_GROUP, PONMARU_GROUP_KEY, PONMARU_GROUP);
public static void registerItemGroups() {
// ログに出力して、ModItemGroupsクラスが正しく初期化されたことを確認する
PonmaruMod.LOGGER.info("ModItemGroupsクラス:アイテムグループの登録 " + PonmaruMod.MOD_ID);
// カスタムアイテムグループにアイテムを追加
ItemGroupEvents.modifyEntriesEvent(PONMARU_GROUP_KEY).
register(itemGroup -> {
itemGroup.add(ModItems.ONIGIRI);
});
}
}
メインでModItemsクラスを先に呼ぶ
@Override
public void onInitialize() {
ModItems.initialize(); // ModItemsクラスをロード
ModItemGroups.registerItemGroups(); // ModItemGroupsクラスをロード
}
とりあえず、本日はここまで。
参考URL


