Spica*

プログラミングの話。

Minecraftでカスタムアイテム作ってみる

ForgeのMod制作の続きをしてみる。以前のセットアップの記事はこっち

とりあえずアイテムを作る。

とりあえずアイテムを作るのは非常に簡単で、Mod初期化時に GameRegistry#registerItem() メソッドを使ってアイテムを登録すれば良いだけのようです。

ここでいうMod初期化時というのは、 preInit(FMLPreInitializationEvent event) が呼ばれるタイミングです。ハンドラの書き方とかはざっくりとセットアップの記事にも書いてます。

つまるところ、下記のように net.minecraft.item.Item を継承したクラスを新しく作っておき…

package com.example.examplemod;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;

public class GenericItem extends Item {

    public GenericItem() {
        // 色んな設定をする
        setMaxStackSize(64);
        setCreativeTab(CreativeTabs.tabMisc);
        setUnlocalizedName("genericItem");
    }

}

下記のように、Mod初期化時のハンドラで登録してあげると、もうそれだけでアイテムが一応出来上がる。

package com.example.examplemod;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.init.Blocks;

@Mod(modid = ExampleMod.MODID, name = ExampleMod.MODNAME, version = ExampleMod.VERSION)
public class ExampleMod {

    /** MODのID。小文字であること */
    public static final String MODID = "examplemod";
    /** MODの名前 */
    public static final String MODNAME = "Example Mod";
    /** MODのバージョン */
    public static final String VERSION = "1.0";

    @Mod.Instance(value = ExampleMod.MODID) //Tell Forge what instance to use.
    public static ExampleMod instance;
    private static GenericItem myItem;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        myItem = new GenericItem();

        GameRegistry.registerItem(myItem, "myItem");
    }

}

確認してみる

  • シングルプレイでワールドを生成する
    • チートモードをONにしておく
  • そのワールドでプレイ開始
  • /give @p <MODID>:<ITEMID> というコマンドを発行する
    • <MODID> は、コード内の MODID 変数に格納した名前。
    • <ITEMID> は、 #registerItem() の第二引数に指定した名前。
    • 例: /give @p examplemod:myItem

上記でアイテムが入手できる。下記のような感じ

f:id:esperia:20151230215952p:plain

ローカライズ(日本語化)する

アイテムの名前がなんか変な名前(item.genericItem.name)になっているのが分かります。 これを日本語名にするには、アイテム名を記述したファイルを作成します。

ファイルは、プロジェクト内のsrc/main/resources/assets/genericmod/langディレクトリの下に、 ja_JP.lang という名前で作ります。僕の環境では、 src/main/resources まではディレクトリが存在したので、そこから先のフォルダとファイルは自分で作りました。

他の言語にも対応させるには、同様のディレクトリに別の言語向けファイルを作ります。例えば、英語だと en_US.lang です。

IntelliJ IDEAでは下記のような表示になります。

f:id:esperia:20151231010136p:plain

で、そのファイルには下記のような記述をします。

英語(en_US.lang):

item.genericItem.name=Delicious Cookie

日本語(ja_JP.lang):

item.genericItem.name=おいしいクッキー

その状態で実行すると、下記のような表示になります。

英語:

f:id:esperia:20151231011259p:plain

日本語:

f:id:esperia:20151231011247p:plain

おおおお。ほとんどコード書いてないですが、実際の画面にアイテムとして出てくれるとかなり嬉しいですね!

参考