MinecraftのMODを作りたい~アイテム精錬編~

鉱石からインゴットへ!!

前回の鉱石ブロック作成リベンジ編で鉱石ブロックの作成を完遂しました。

で、鉱石ブロックだけでは目的となっている刀を作ることはできません。

バニラの世界でも、鉄インゴットと木の棒とを組み合わせて剣を作っています。

なので、玉鋼鉱石を玉鋼インゴットにするのが今回の目的!!

 

玉鋼鉱石をかまどに入れて精錬し、そして玉鋼インゴットが出来上がるようにしていくぞっ!!


~まずは玉鋼インゴットを作る~

では、まずは精錬した後に出来上がる玉鋼インゴットをアイテムとしてMineCraftに登録する。

鉱石ブロック作成リベンジ編で作成したメインクラスに書き加えた形になってます。

後々に紹介するアイテム精錬のコードもすでにありマス。


    //アイテムを登録するイベント。旧preinitのタイミングで発火する。
    @SubscribeEvent
    public void registerItems(RegistryEvent.Register event) {
        KatanaModBlocks.TamahaganeOre(event);
        KatanaModItems.TamahaganeIngot(event);
        KatanaModCrafts.OreToIngot();

    }

『KatanaModItems.TamahaganeIngot(event);』の部分がアイテム登録を呼び出すところ。

名前のまんまですな。


    //モデルを登録するイベント。SideOnlyによってクライアント側のみ呼ばれる。旧preinitのタイミングで発火する。
    @SubscribeEvent
    @SideOnly(Side.CLIENT)
    public void registerModels(ModelRegistryEvent event) {
        KatanaModBlocks.TamahaganeOreModel(event);
        KatanaModItems.TamahaganeIngotModel(event);
    }

こちらもアイテム登録と同じように、モデル登録を呼び出してるだけ。

『KatanaModItems.TamahaganeIngotModel(event);』の部分ですね。


~アイテムクラス~


    // 玉鋼インゴットをアイテムとして登録
    public static void TamahaganeIngot(RegistryEvent.Register event) {

        // アイテムのインスタンスを生成
        TAMAHAGANE_INGOT = new ItemTamahaganeIngot();

        // アイテムとして登録
        event.getRegistry().register(TAMAHAGANE_INGOT);
    }

アイテムとしての設定をしているクラスを呼び出しているインスタンス生成。

そしてそれをアイテムとして登録している。


    // 玉鋼インゴットにアイテムとしてのモデルを登録
    public static void TamahaganeIngotModel(ModelRegistryEvent event)
    {
            ModelLoader.setCustomModelResourceLocation(TAMAHAGANE_INGOT, 0,
                        new ModelResourceLocation(new ResourceLocation("katanamod", "tamahagane_ingot"), "inventory"));
    }>

アイテムとして登録した後に、アイテムに対してテクスチャを登録してます。

これで、指定したリソースファイルを読み込んでアイテムの見た目が登録されます。


~玉鋼インゴットクラス~


    public ItemTamahaganeIngot() {
        super();
        this.setRegistryName("katanamod", "tamahagane_ingot");
        this.setCreativeTab(CreativeTabs.MATERIALS);
        this.setUnlocalizedName("tamahagane_ingot");
        this.maxStackSize = 64;
    }

玉鋼インゴットにアイテムとしての設定をしてます。

「maxStackSize」は、1つの枠に持てるアイテムの数を決めています。

玉鋼インゴットを70個持っていたとしたら、【64】と【6】に分けられてインベントリに持つことになる。


~その他設定ファイル~


{
  "parent": "item/generated",
  "textures": {
    "layer0": "katanamod:items/tamahagane_ingot"
  },
  "display": {
    "thirdperson": {
      "rotation": [0, 90, -35],
      "translation": [0, 1.25, -3.5],
      "scale": [0.85, 0.85, 0.85]
    },
    "firstperson": {
      "rotation": [0, -135, 25],
      "translation": [0, 4, 2],
      "scale": [1.7, 1.7, 1.7]
    }
  }
}

登録したアイテムの設定を行う。

おそらく、それぞれの数字はX軸・Y軸・Z軸の数値だと思う。

 

~parent~

親となるjsonを取得する。通常アイテムなら基本チュートリアル通りでよい。
バニラのjsonを取りたい場合は”item/<アイテム名>”を渡す。

 

~textures~

テクスチャを指定する。基本は”layer0″のみで良い。
 指定方法は<modid>:items/<テクスチャ名>。テクスチャ名も小文字にしたほうが良い。
これで指定したパスのテクスチャをアイテムのものとして読み込める。

 

~display~

表示の大きさ、場所等を調整する。
“thirdperson”(二人称・三人称視点)と”firstperson”(一人称視点)でそれぞれ指定できる。
•rotation …… 角度
•translation …… 位置
•scale …… 大きさ

の三要素を変更できる。

こちらはインベントリのアイテムにマウスカーソルを合わせたりしたときに表示されるアイテム名を指定している。

先日までは、なぜか日本語名が適用されないなーと思ってたけど、どうやらlangファイルの名前が間違っていたようす。

詳しい理由は調べ切れてないけれど、「ja_JP.lang」を全て小文字にして「ja_jp.lang」としたら日本語で表示された。

ちなみにこれが玉鋼インゴットとして用意したテクスチャ。

バニラの鉄インゴットのテクスチャを少しいじっただけである。


~玉鋼インゴットの実装完了!~

インベントリないにテクスチャも貼り付けられて登録されてるし、名前も日本語で表示されてます。

そして、フィールドにアイテムを放り投げてもテクスチャが反映されてますね、大成功!!


~鉱石からインゴットへ~


    //アイテムを登録するイベント。旧preinitのタイミングで発火する。
    @SubscribeEvent
    public void registerItems(RegistryEvent.Register event) {
        KatanaModBlocks.TamahaganeOre(event);
        KatanaModItems.TamahaganeIngot(event);
        KatanaModCrafts.OreToIngot();

    }

上のほうでも出しました、メインクラスの部分。

『KatanaModCrafts.OreToIngot();』の部分で鉱石からインゴットにする処理を呼んでます。


~クラフトクラス~


        // 鉱石を精錬してインゴットを作成する
        public static void OreToIngot() {

                // 玉鋼鉱石→玉鋼インゴット
                GameRegistry.addSmelting(KatanaModBlocks.TAMAHAGANE_ORE,
                                new ItemStack(KatanaModItems.TAMAHAGANE_INGOT), 10);
        }

「Smelting」の意味が精錬なので、【addSmelting】がアイテム精錬のコードってことですね。

第1引数に精錬元となるアイテムの定義を指定。

第2引数に精錬後にできるアイテムの定義を指定。

第3引数には精錬後のアイテムを回収したときに取得できる経験値量を指定します。

 

なので、書いている通りに玉鋼鉱石を元に玉鋼インゴットを作り出し、回収すると10の経験値が入るということ。

ちなみに、レベルが0の状態で鉱石を1個精錬して回収してみたところ、18分割されているゲージのうち2.5溜まりました。

 

ってことでアイテム精錬の処理は以上!!たったこれだけでアイテム変化させることが出来る。

やっぱり手間がかかるのは新たなブロックやアイテムを登録するところなんですねぇ。


~結果発表!!~

かまどの左側上枠に玉鋼鉱石をセットし、下枠には燃料となるアイテムをセット。

それによって精錬が開始されて、一定時間経過すると玉鋼鉱石が玉鋼インゴットとなって右側に出来上がります。

そして、インゴットの数が64個になると精錬が停止します。

これは1スタックを64個としたからですね。

試しに「maxStackSize」を32としてみたら、精錬も32個で停止してました。

 

ということで、今回はここまで!!

次回は、クラフトテーブルを使ったアイテムのクラフティングにチャレンジしようかと思います。

アイテムとアイテムを組み合わせて別のアイテムを作る、MineCraftの真髄ですね!!

 

以上、MineCraftのバージョンは1.12.2でお送りしました。

 

 

以下は参考にしたサイト

 

MOD製作者のためのソース講座 by 鎮守府MOD製作者・鮎滝渉【Minecraft JE版】