在Minecraft Forge 1.15.2中,添加自己的独特武器到Mod中

总结

    • 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 可以被写作 com/example/bukimod/BukiMod.javaMOD 主类。通过添加 @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的代码位置在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 的代码位置是 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游戏。

你都拿到了「村正」、「手裏剣」、「聖なる鎧」吗?《Wizardry》的乐趣也在于收集物品!- 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.png 文件的数据 mursama_blade.json。

{
  "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百科全书

层级:通过项目路径进行指定。只在parent为”item/generated”时有效,用于指定在库存中显示的图标。通常只有一个,但像生成蛋之类的物品可能有多个层级。这个数量是每个物品确定的。

src/main/resources/assets/bukimod/textures/items/*.png 的文件路径物品的纹理图像。

村雨刀.png背景透过PNG图像。
2100 x 2100 像素。不应该使用如此大的图像大小。

murasama_blade.png迷子图标.png 是一个没有透明背景的PNG图片。
大小为500 x 500像素。应该不需要使用这么大尺寸的图片。

maigo_icon.png

使用Minecraft Forge来运行在创意模式的世界中进行确认。

群山之刃由於使用背景透明的PNG圖像,ムラサマ·ブレード 看起來像一把真正的劍。

已添加到创意清单的战斗选项卡中。

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 Wiki

 

    • 武器 – Minecraft Japan Wiki – アットウィキ

 

    • アイテム耐久度 – Minecraft Wiki

 

    アイテム修繕 – Minecraft Wiki

关于Minecraft Forge的开发

    • Minecraft Mod 開発環境構築 (IntelliJ IDEA + Minecraft Forge 1.15.2) + Hello World Mod 作成 – Qiita

 

    • Minecraft 1.12.2 Forge Modの作成 その3 【剣の追加とレシピ登録,クラフト後に返ってくるアイテムの設定】 – Qiita

 

    • Minecraft 1.14.4 Forge Modの作成 その3 【無機能アイテムの追加】 – Qiita

 

    • Minecraft 1.14.4 Forge Modの作成 その6 【5種ツールの追加】 – Qiita

 

    • モデル – Minecraft Wiki

 

    • ツール類の追加(1.7.10) | TNT Modders

Forge Documentation

Resources – Forge Documentation
Registries – Forge Documentation
Internationalization and localization – Forge Documentation
Model Files – Forge Documentation

Overview (Forge 1.12.2-14.23.5.2838 [MCP stable_39])

Item.ToolMaterial (Forge 1.12.2-14.23.5.2838 [MCP stable_39])
ItemSword (Forge 1.12.2-14.23.5.2838 [MCP stable_39])
IForgeRegistryEntry.Impl (Forge 1.12.2-14.23.5.2838 [MCP stable_39])

bannerAds