LoginSignup
6
4

More than 3 years have passed since last update.

Minecraft Forge 1.15.2 で Mod にオリジナル武器を追加する

Last updated at Posted at 2020-02-23

概要

  • Minecraft Forge を使用して Mod にオリジナルの武器を追加する
  • 今回は剣タイプ (SwordItem クラスのインスタンス) の武器を3つ追加した

環境

  • Minecraft Forge 1.15.2-31.1.0
  • ビルド環境: macOS Catalina + Java 8 (AdoptOpenJDK) + Gradle

ソースコード

ファイル一覧

├── build.gradle
└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           └── bukimod
        │               ├── BukiItemTier.java
        │               ├── BukiMod.java
        │               └── BukiModRegister.java
        └── resources
            ├── META-INF
            │   └── mods.toml
            ├── assets
            │   └── bukimod
            │       ├── lang
            │       │   ├── en_us.json
            │       │   └── ja_jp.json
            │       ├── models
            │       │   └── item
            │       │       ├── maigo_ita.json
            │       │       └── murasama_blade.json
            │       └── textures
            │           └── items
            │               ├── maigo_icon.png
            │               └── murasama_blade.png
            └── pack.mcmeta

今回は build.gradle, pack.mcmeta, mods.toml には必要最低限の記述程度のみしている。
参考: Minecraft Mod 開発環境構築 (IntelliJ IDEA + Minecraft Forge 1.15.2) + Hello World Mod 作成 - Qiita

src/main/java/com/example/bukimod/BukiMod.java

MOD メインクラス。@Mod アノテーションを付けて MOD であることを示す。
今回は特に処理をせず MOD 内で使用する値を定義している。

package com.example.bukimod;

import net.minecraftforge.fml.common.Mod;

/**
 * Buki Mod.
 */
@Mod(BukiMod.MOD_ID)
public class BukiMod {

  /** MODのID */
  public static final String MOD_ID = "bukimod";

  /** ムラサマ・ブレードのID (アイテムを一意に識別するために必要) */
  public static final String ITEM_ID_MURASAMA_BLADE = "murasama_blade";

  /** 迷子板のID (アイテムを一意に識別するために必要) */
  public static final String ITEM_ID_MAIGO_ITA = "maigo_ita";

  /** ひのきのぼうのID (アイテムを一意に識別するために必要) */
  public static final String ITEM_ID_HINOKINO_BOU = "hinokino_bou";
}

src/main/java/com/example/bukimod/BukiItemTier.java

IItemTier インターフェースを実装したクラスまたは列挙型を用意する。今回は列挙型で実装した。

IItemTier は以前のバージョンでツール・マテリアル (Item.ToolMaterial クラス) と呼ばれていたものの後継であるようだ。

IItemTier インターフェースの各メソッドでは耐久度や攻撃力を返すようにしている。

IItemTier#getAttackDamage で返す値がそのまま攻撃力になるのではなく、武器のオブジェクトを生成する際にも別途攻撃力を指定しており、最終的な攻撃力はそれらの複数の値から算出されている。

package com.example.bukimod;

import net.minecraft.item.IItemTier;
import net.minecraft.item.Items;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.tags.ItemTags;
import net.minecraft.util.LazyValue;

import java.util.function.Supplier;

/**
 * IItemTier インターフェースの実装列挙型。
 */
public enum BukiItemTier implements IItemTier {

  /**
   * 鋼。
   * harvestLevel: 2
   * maxUses: 9999
   * efficiency: 6.0F
   * attackDamage: 2.0F
   * enchantability: 14
   * repairMaterial: Ingredient.fromItems(Items.IRON_INGOT)
   */
  HAGENE(2, 9999, 6.0F, 2.0F, 14, () -> {
    return Ingredient.fromItems(Items.IRON_INGOT);
  }),

  /**
   * ベニヤ。
   */
  VENEER(1, 1, 1.0F, 1.0F, 1, () -> {
    return Ingredient.fromTag(ItemTags.PLANKS);
  });

  private final int harvestLevel;
  private final int maxUses;
  private final float efficiency;
  private final float attackDamage;
  private final int enchantability;
  private final LazyValue<Ingredient> repairMaterial;

  BukiItemTier(int harvestLevel, int maxUses, float efficiency, float attackDamage, int enchantability, Supplier<Ingredient> repairMaterial) {
    this.harvestLevel = harvestLevel;
    this.maxUses = maxUses;
    this.efficiency = efficiency;
    this.attackDamage = attackDamage;
    this.enchantability = enchantability;
    this.repairMaterial = new LazyValue<>(repairMaterial);
  }

  @Override
  public int getHarvestLevel() {
    return harvestLevel;
  }

  @Override
  public int getMaxUses() {
    return maxUses;
  }

  @Override
  public float getEfficiency() {
    return efficiency;
  }

  @Override
  public float getAttackDamage() {
    return attackDamage;
  }

  @Override
  public int getEnchantability() {
    return enchantability;
  }

  @Override
  public Ingredient getRepairMaterial() {
    return repairMaterial.getValue();
  }
}

src/main/java/com/example/bukimod/BukiModRegister.java

アイテム登録クラス。Minecraft Forge からアイテム登録のイベント発行時に呼び出される。

今回は3つのオリジナル武器を登録している。
3つとも剣タイプの武器で SwordItem クラスのインスタンスを使用している。
SwordItem クラスは以前のバージョンで存在していた ItemSword クラスの後継であるようだ。

package com.example.bukimod;

import net.minecraft.item.IItemTier;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemTier;
import net.minecraft.item.SwordItem;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.registries.IForgeRegistry;

/**
 * アイテム登録クラス。
 */
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) // システム内部で MOD を導入する際のイベントを受け取るためのアノテーション
public class BukiModRegister {

  /**
   * システム内部でアイテム登録イベントが発生した時に呼び出されるメソッド。
   */
  @SubscribeEvent
  public static void onItemsRegistry(final RegistryEvent.Register<Item> event) {
    IForgeRegistry<Item> registry = event.getRegistry();
    registry.registerAll(
      createMurasamaBlade(), // ムラサマ・ブレードを登録する
      createMaigoIta(), // 迷子板を登録する
      createHinokinoBou()); // ひのきのぼうを登録する
  }

  /**
   * ムラサマ・ブレードを生成する。
   */
  private static Item createMurasamaBlade() {

    // ムラサマ・ブレードのオブジェクトを生成
    IItemTier tier = BukiItemTier.HAGENE; // 鋼
    int attackDamage = 9999; // 攻撃力
    float attackSpeed = 99.0f; // 攻撃速度
    Item.Properties builder = new Item.Properties().group(ItemGroup.COMBAT); // Combat 戦闘タブに置く
    Item murasamaBlade = new SwordItem(tier, attackDamage, attackSpeed, builder);

    // 一意になる名称をアイテムに設定
    String namespace = BukiMod.MOD_ID;
    String path = BukiMod.ITEM_ID_MURASAMA_BLADE;
    murasamaBlade.setRegistryName(new ResourceLocation(namespace, path));

    return murasamaBlade;
  }

  /**
   * 迷子板を生成する。
   */
  private static Item createMaigoIta() {

    // 迷子板のオブジェクトを生成
    IItemTier tier = BukiItemTier.VENEER; // ベニヤ
    int attackDamage = 1; // 攻撃力
    float attackSpeed = 1.0f; // 攻撃速度
    Item.Properties builder = new Item.Properties().group(ItemGroup.MISC); // Miscellaneous その他タブに置く
    Item maigoIta = new SwordItem(tier, attackDamage, attackSpeed, builder);

    // 一意になる名称をアイテムに設定
    String namespace = BukiMod.MOD_ID;
    String path = BukiMod.ITEM_ID_MAIGO_ITA;
    maigoIta.setRegistryName(new ResourceLocation(namespace, path));

    return maigoIta;
  }

  /**
   * ひのきのぼうを生成する。
   */
  private static Item createHinokinoBou() {

    // ひのきのぼうのオブジェクトを生成
    IItemTier tier = ItemTier.WOOD; // 木
    int attackDamage = 1; // 攻撃力
    float attackSpeed = 1.0f; // 攻撃速度
    Item.Properties builder = new Item.Properties().group(ItemGroup.MISC); // Miscellaneous その他タブに置く
    Item hinokinoBou = new SwordItem(tier, attackDamage, attackSpeed, builder);

    // 一意になる名称をアイテムに設定
    String namespace = BukiMod.MOD_ID;
    String path = BukiMod.ITEM_ID_HINOKINO_BOU;
    hinokinoBou.setRegistryName(new ResourceLocation(namespace, path));

    return hinokinoBou;
  }
}

武器の名前は有名RPGなどから借りてきた。

「村正」、「手裏剣」、「聖なる鎧」 全部手に入れた? 『ウィザードリィ』の楽しさはアイテム収集にもアリ! - AKIBA PC Hotline!

実際の村正は徳川家に祟る妖刀として知られているが、最初のAppleII版では「MURASAMA BLADE」となっていたのは、ファンの間では有名なトリビアである。

「ひのきのぼう」に込めたドラクエ精神 堀井雄二が語ったこだわり

今とは考えられない開発条件の中、最弱のアイテムだと「一目でわかる」名前が「ひのきのぼう」だったのです。

src/main/resources/assets/bukimod/lang/*.json

en_us.json にはアイテムの名称を記述する (英語環境用であり、言語用ファイルを定義していない環境用でもある)。
「item.MODのID.アイテムID: アイテム名称」のフォーマットとなる。

{
  "item.bukimod.murasama_blade":  "Murasama Blade",
  "item.bukimod.maigo_ita":  "Maigo Ita"
}

ja_jp.json にはアイテムの名称を記述する(日本語環境用)。

{
  "item.bukimod.murasama_blade":  "ムラサマ・ブレード",
  "item.bukimod.maigo_ita":  "迷子板"
}

src/main/resources/assets/bukimod/models/item/*.json

アイテムのモデル情報ファイル。アイテムの描画情報などを記述する。

murasama_blade.json で murasama_blade.png を使うように指定。

{
  "parent": "item/generated",
  "textures": {
    "layer0": "bukimod:items/murasama_blade"
  }
}

maigo_ita.json で maigo_icon.png を使うように指定。

{
  "parent": "item/generated",
  "textures": {
    "layer0": "bukimod:items/maigo_icon"
  }
}

モデル - Minecraft Wiki

layer#: アイテムのパスで指定する。parentで "item/generated" としたときのみ有効で、インベントリに表示するアイコンを指定する。通常は1つだけだがスポーンエッグのように複数のlayerを持つものもある。この数はアイテムごとに決まっている。

src/main/resources/assets/bukimod/textures/items/*.png

アイテムのテクスチャ画像。

murasama_blade.png 背景透過 PNG 画像。
2100 x 2100 ピクセル。こんなに大きい画像を使う必要はないはず。

murasama_blade.png

maigo_icon.png 背景透過していない PNG 画像。
500 x 500 ピクセル。こんなに大きい画像を使う必要はないはず。

maigo_icon.png

Minecraft Forge で動かす

クリエイティブモードのワールドで確認する。

ムラサマ・ブレード

ムラサマ・ブレードは背景透過PNG画像を使ったのでちゃんと剣らしいものになっている。

クリエイティブ・インベントリの戦闘(Combat)タブに追加されている。

mod_murasama_blade_1.png

mod_murasama_blade_2.png

mod_murasama_blade_3.png

迷子板

迷子板は背景透過していないPNG画像を使ったので板のような形状で描画されている。

mod_maigo_ita_1.png

mod_maigo_ita_2.png

mod_maigo_ita_3.png

ひのきのぼう

「ひのきのぼう」はモデルもテクスチャも用意しなかったため、名称や画像が自動で設定されたようだ。

mod_hinokino_bou_1.png

mod_hinokino_bou_2.png

参考資料

Minecraft の武器について

Minecraft Forge での開発について

6
4
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
6
4