Minecraft Modding

コードが書きたい。

食べ物を追加するMod その2 食べ物を追加する(本編)

目次

これから何する

前記事から引き続き食べ物を追加していきます。今回がいわば本編、食べ物を追加します。記事は3回くらいに分けて書く予定の2回目です。

開発環境
食べ物を定義する

まずはjavaソースフォルダ配下にportionmod.itemパッケージを追加し、パッケージにPortionクラスを追加します 。

Portion.java

package portionmod.item;

import net.minecraft.item.ItemFood;
import portionmod.PortionMod;

/***
 * アイテムとしてのポーションの機能を定義します。
 * 
 * @author atsushi
 *
 */
public class Portion extends ItemFood {
    public Portion() {
        super(
                4,      // 満腹度回復量
                1.2F,   // 隠し満腹度(腹持ち)
                false   // 狼の餌か?
        );
        
        /*
         *  Minecraftへの登録名
* en_US.lang内に表示名が見つからない場合はこの名前が表示されます */ setRegistryName(PortionMod.MODID, "portion"); // 言語ファイルから一致する値をアイテム名として表示します setUnlocalizedName(PortionMod.MODID + ".portion"); // 満腹でも食べます setAlwaysEdible(); } }

 

食べ物にテクスチャを関連付ける

初めにテクスチャを指定する為モデルを定義します。
まずはresourcesソースフォルダ配下にportionmod.models.itemパッケージを追加し、パッケージにportion.jsonを追加します。

portion.json

{
"parent": "item/generated",
"textures": {
"layer0": "portionmod:items/portion"
}
}

 

次にテクスチャですね。
resourcesソースフォルダ配下にportionmod.textures.itemsパッケージを追加し、パッケージにportion.pngを追加します。
テクスチャのサイズは正方形であれば大丈夫そうです。

 

食べ物をゲームへ登録する

定義したアイテムをゲーム内へ反映させるためにはアイテムの登録とモデル及びテクスチャを読み込む必要があります。
まずはportionmodパッケージにModItemsクラスを追加し、次のように定義します。

ModItems.java

package portionmod;

import net.minecraft.item.Item;
import portionmod.item.Portion;

/***
* このModで追加されるアイテムを保持します。
* 
* @author atsushi
*
*/
public class ModItems {
    public static Item PORTION = new Portion();
}

 

次に追加した食べ物をゲームへ登録します。

CommonProxy.java

package portionmod.proxy;

import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import portionmod.ModItems;
import portionmod.PortionMod;

/***
 * クライアントとサーバー共通でアイテム、ブロック、ツールの読み込みます。
 * 
 * @author atsushi
 *
 */
@Mod.EventBusSubscriber
public class CommonProxy {

    // なんか処理がある(省略)

    /***
     * Modで追加したいアイテムを読み込みます。
     * 勿論アイテムのクラスは自分で定義する必要があります。
     * 
     * @param event
     */
    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register event) {
        PortionMod.logger.info("CommonProxy.registerItems");
        // 自作したアイテム(食べ物)のPortionを登録します
        event.getRegistry().register(ModItems.PORTION);
    }
}

 

モデルを読み込みます。

package portionmod.proxy;

import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import portionmod.ModItems;
import portionmod.PortionMod;

/***
 * クライアント側でリソースを読み込みます。
 * 
 * @author atsushi
 *
 */
@Mod.EventBusSubscriber(Side.CLIENT)
public class ClientProxy extends CommonProxy {
    @Override
    public void preInit(FMLPreInitializationEvent event) {
        super.preInit(event);
        PortionMod.logger.info("ClientProxy.preInit");
    }

    /***
     * ブロックやアイテムのモデル(テクスチャは何を使うとかテクスチャの向きとか定義したファイル)を読み込みます。
     * 
     * @param event
     */
    @SubscribeEvent
    public static void registerModels(ModelRegistryEvent event) {
        PortionMod.logger.info("ClientProxy.registerModels");
        
        // Portionのモデルを読み込みます
        ModelLoader.setCustomModelResourceLocation(
                ModItems.PORTION,   // Portionのインスタンス
                0,                  // メタデータ
                new ModelResourceLocation( // モデル定義ファイルのパス
                        new ResourceLocation(PortionMod.MODID, "portion"), "inventory"));
    }
}

 

食べ物にゲーム内で表示する名称を設定する

resourcesソースフォルダのassets.portionmod.langパッケージに次のファイルを追加します。

en_US.lang

item.portionmod.portion.name=Portion

ja_JP.lang

item.portionmod.portion.name=ポーション

実際にMinecraftを起動し、言語設定を変えてアイテム名が期待通り表示されるか確認してみると良いでしょう。

 

食べ物のレシピを追加する

それでは最後にレシピですが、1.12ではレシピ登録にクラスは不要となり、JSONのみで定義することが可能になりました。
resourcesソースフォルダ配下にassets.portionmod.recipesパッケージを追加し、パッケージにportion.jsonを追加します。実際はファイル名に制限はありませんが、便宜上ファイル名はアイテム名に合わせます。

{
  "type": "minecraft:crafting_shapeless",
  "ingredients": [
    {
      "item": "minecraft:dirt",
      "data": 0
    }
  ],
  "result": {
    "item": "portionmod:portion",
    "count": 1
  }
}

 

今回の例では不定形レシピの追加方法になります。定形レシピはまだ勉強中です。
ingredientsの子要素のdataはメタデータのことで、土ブロックなど一部のアイテムやブロックではメタデータにより状態が変化するものが存在します。今回の土ブロックの場合、通常の土ブロックの他粗い土、ポドゾルが存在します。

 

Github

以上で新食べ物ポーションを追加出来ました。GitHub上から確認出来ます。
まずは今回の差分。

github.com

 

そして変更後の構成。

PortionMod

github.com