うまげーむさん

ゲームの情報を主に投稿します。

【マインクラフト Modding】1.15対応 自作MODの作り方 #4 アイテム、クリエイティブタブの追加

このシリーズのまとめはこちら:

umagame.hatenablog.jp

こんばんは。

記事の内容にはまったく関係ないですが、試しに初めてはてなブログの予約投稿機能を使ってみました。

ちゃんとできてるかな?

はじめに

今回はアイテムを作ります。

土に関するModなので土9個をならべて圧縮できるようにします。

レシピは後々作るとして、今回はそのアイテムを作っていきます。

前回の記事:

umagame.hatenablog.jp

タブを作る

クラス作成

アイテムを作る前に、先にこのMod専用のクリエイティブのタブを作っておきます。

前回のように新規→クラスで、新しくクラスを作ります。

パッケージはinitにします。

initとはInitializationの略で、直訳で初期化という意味です。

まあ新しいアイテムとかの要素を入れるパッケージだと思っといてください。

f:id:Umagame:20200313212145p:plain

 クリエイティブのタブのクラスは1.15だとItemGroupという名前のクラスになっているみたいです。

なのでこのItemGroupクラスをスーパークラスとして継承します。

package com.umagame.dirtmod.init;

public class DirtModTab extends ItemGroup{
}

豆電球のアイコンをクリックしてimportしても、まだ豆電球が表示されていると思います。

これはコンストラクタとメソッドを追加しないといけないためです。

まあこれも豆電球をクリックしてできます。

f:id:Umagame:20200314085503p:plain

f:id:Umagame:20200314085512p:plain

「'~~~.java'の新規JUnitテスト・ケースを作成」と一番上に表示されますが、これは関係ないです。

アイコン、IDを設定

まずアイコンを設定するために、createIconメソッドの戻り値を設定しておきます。

方法は簡単で、新しくItemStackでインスタンスを作り、それを戻り値として設定します。

今回は土ブロックをアイコンにしたいので、Blocksというクラスのフィールドを使います。(アイテムの場合はItems)

@Override
public ItemStack createIcon() {
    ItemStack itemStack = new ItemStack(Blocks.DIRT);
    return itemStack;
}

このとき、アイコンに自作のアイテムを設定したい方は、このあと説明するやり方でアイテムを追加し、それをBlocks.DIRTのところに入れましょう。

次にIDの設定ですが、既にコンストラクタに引数があり、中にsuperがあると思います。

これはいらないので引数を削除し、superのかっこの中にIDを入れます。

こんな感じ。

public DirtModTab() {
    super("dirtmod");
}

なので、最終的にこうなります。

package com.umagame.dirtmod.init;

import net.minecraft.block.Blocks;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;

public class DirtModTab extends ItemGroup{

    public DirtModTab() {
        super("dirtmod");
    }
    @Override
    public ItemStack createIcon() {
        ItemStack itemStack = new ItemStack(Blocks.DIRT);
        return itemStack;
    }
}

とりあえずクラスはできたので、メインクラスにインスタンスを作っておきます。

@Mod(DirtMod.MOD_ID)
public class DirtMod {
    public static final String MOD_ID = "dirtmod";
    
    public static final ItemGroup DIRTMOD_TAB = new DirtModTab();
}

これで試しに起動してみると、ちゃんと追加されていました。(名前はまだIDのままですが)

f:id:Umagame:20200314112039p:plain

アイテムの追加

アイテムのクラス

それではいよいよアイテムの追加に入ります。

まず、アイテムのクラスを作ります。

圧縮された土なので直訳でCompressedDirtです。

f:id:Umagame:20200314164126p:plain

(パッケージ名についてですが、昔はマインクラフトの内部データにあわせてitemsにしていましたが、いつからかitemになっていたのでこうします)

クラスを作ったら、Itemクラスを継承します。

package com.umagame.dirtmod.item;

import net.minecraft.item.Item;

public class ItemCompressedDirt extends Item{
    
}

 これもさっきと同じようにコンストラクタが必要なので、豆電球をクリックして追加します。

public class ItemCompressedDirt extends Item{
    public ItemCompressedDirt(Properties properties) {
        super(properties);
    }
}

そしてこのPropertiesですが、これはアイテムのスタックできる数や、対応するクリエイティブタブを設定できます。

今回はスタック数は64でいいので、クリエイティブタブの設定だけします。

コンストラクタの引数を消して、Propertiesクラスのgroupメソッドでタブを設定します。

public class ItemCompressedDirt extends Item{
    public ItemCompressedDirt() {
        super(new Properties().group(DirtMod.DIRTMOD_TAB));
    }
}

あと、このアイテムのID(レジストリーネーム)を設定する必要があります。

なのでIDを設定するsetRegisrtyNameを追加して、最終的にこんな感じになります。

package com.umagame.dirtmod.item;

import com.umagame.dirtmod.main.DirtMod;

import net.minecraft.item.Item;

public class ItemCompressedDirt extends Item{
    public ItemCompressedDirt() {
        super(new Properties().group(DirtMod.DIRTMOD_TAB));
        this.setRegistryName("compressed_dirt");
    }
}

アイテムのクラスはこれでOKです。

アイテムの登録

アイテムの設定はこれでいいのですが、次はこれをゲームに登録しなければいけません。

なのでアイテムを登録する用のクラスをinitパッケージに作ります。

名前はDirtModItemsにします。

f:id:Umagame:20200314165912p:plain

実はこの登録の仕組みが自分でもあんまりわかってないので、参考にしている海外のMod製作者(ChampionAsh5357氏)のコードをそのまま使います。

package com.umagame.dirtmod.init;

import com.umagame.dirtmod.item.ItemCompressedDirt;
import com.umagame.dirtmod.main.DirtMod;

import net.minecraft.item.Item;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
import net.minecraftforge.registries.ObjectHolder;

@ObjectHolder(DirtMod.MOD_ID)
public class DirtModItems {
    @Mod.EventBusSubscriber(modid = DirtMod.MOD_ID, bus = Bus.MOD)
    public static class Register {
        @SubscribeEvent
        public static void registerItems(final RegistryEvent.Register<Item> event) {
            final Item[] item = {
                    new ItemCompressedDirt()
            };
            
            event.getRegistry().registerAll(item);
        }
    }
}

とりあえず皆さんは、@ObjectHolder、@EventBusSubscriberのModIDと、

final Item[] item内のインスタンスを変えて、他の部分はコピペしてください。

これで起動してみると、テクスチャがないアイテムが追加されています。

f:id:Umagame:20200314171029p:plain

テクスチャの用意

ここまで来たらあともう少しです。

まずは、アイテム用のテクスチャを用意しましょう。

バニラのものをそのまま使ってもいいです。

今回は土と雪玉のテクスチャを使って、こんな感じに作りました。

f:id:Umagame:20200314171953p:plain

このテクスチャを、「アイテムのID.png」という名前にしておいてください。(今回の場合compressed_dirt.png

そうしたらこれをsrc/main/resources/assets/ModのID/textures/itemに入れてください。

f:id:Umagame:20200314173133p:plain

モデルの設定

次にモデルのファイルを作ります。

ModのID/models/itemに、アイテムのID.jsonという名前でファイルを作り、開きます。

f:id:Umagame:20200314173403p:plain

ここに、このように書きます。

{
    "parent": "item/generated",
    "textures": {
        "layer0": "ModのID:item/アイテムのID"
    }
}

今回の場合はこんな感じ。

{
    "parent": "item/generated",
    "textures": {
        "layer0": "dirtmod:item/compressed_dirt"
    }
}

モデルのファイルはこれでOKです。

名前の設定

最後に、ゲーム内で表示される名前を設定します。

今回は英語と日本語を用意します。

ModのID/langに、en_us.jsonとja_jp.jsonを作ります。

f:id:Umagame:20200314174124p:plain

タブとアイテムの名前を設定するので、このように書きます。

{
    "itemGroup.ModのID": "タブの名前",
    "item.ModのID.アイテムのID": "アイテムの名前"
}

なので今回はen_usに

{
    "itemGroup.dirtmod": "DirtMod",
    "item.dirtmod.compressed_dirt": "Compressed Dirt"
}

と書いて、ja_jpに

{
    "itemGroup.dirtmod": "DirtMod",
    "item.dirtmod.compressed_dirt": "圧縮された土"
}

と書きました。

ですが、このとき日本語のほうはEclipseでも開いて確認してください。

文字化けしている可能性があるので。

f:id:Umagame:20200314175154p:plain

今回は文字化けしてませんでした

これで終わりです。

起動して、テクスチャ、名前が反映されていることを確認してみてください。

f:id:Umagame:20200314175449p:plain

f:id:Umagame:20200314175503p:plain

さいごに

お疲れさまでした。

次回:

umagame.hatenablog.jp

ではでは~~~~~~~~~~~~