2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

本郷学園マイコン部Advent Calendar 2024

Day 25

気分でマイクラMOD制作

Last updated at Posted at 2024-12-24
別に読まなくていい前置き

こんにちは、私です。この間マイクラで使うMOD選定をしていたのですが、いい感じのMODがなかったので、ここは自分でMODを作ってウハウハしていきたいと思います。途中で遊んだりもしますが、この記事はその過程も含めてのメモです。

なお、プログラミング知識が不足しているがゆえに、表記が不明瞭でしたり、あからさまな間違いのある可能性がありますが、ご了承ください。

本編

まず公式ガイドに従って環境構築を終えました。

環境
Minecraft JE 1.21
Fabric loader 0.16.9
Java 21
Intellij IDEA Community Edition 2024.2.3

アイテムを追加してみる

ディレクトリ構成はこんな感じです。MOD名がTemplateModとデフォルトのままなので分かりにくい所があるかもしれません。

image.png

TemplateMod.java
TemplateMod
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
item
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を使えば日本語に対応することができるみたいです。

image.pngimage.png

クラフトレシピはresources/data/(mod-id)/recipe/(item).jsonで指定できます。詳しい書き方はこちらを参照のこと。Recipe JSON Generatorを使うと便利。クラフトレシピは作業台だけでなく鍛冶台なども指定できるようです。

食べ物にも指定できるみたいなのでやってみましょう。Initメソッドのアイテムを追加する部分をいじってみます。

item
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
TestMaterial
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));
+}
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?