Mod制作日記 - アイテム

アップロード:2024/12/05 最終更新:2024/12/05

前回の続き。

追加するだけだったアイテムをカスタムする方法についてやっていきます。

目次 (折りたたみ可)

カスタムアイテム Lv.1

「ItemRegister」クラスへ以下のように追加をします。

ItemRegister.json
package com.masuec.my_mod.registers; import com.masuec.my_mod.MyMod; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; import net.minecraft.world.item.Rarity; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; public class ItemRegister { public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MyMod.MODID); // 前回のアイテム public static final RegistryObject<Item> TEST_ITEM = ITEMS.register( "test_item", () -> new Item(new Item.Properties()) ); // 今回追加するアイテム public static final RegistryObject<Item> TEST_ITEM2 = ITEMS.register( "test_item2", () -> new Item( new Item.Properties() // .durability(1000) // 耐久値 .fireResistant() // 火炎耐性 .food( // 食べ物 (new FoodProperties.Builder()) .alwaysEat() // いつでも食べられる .nutrition(20) // 満腹度 .saturationMod(0.5F) // 腹持ち係数 // ポーション効果 .effect(() -> new MobEffectInstance(MobEffects.REGENERATION, 400, 1), 0.5F) .build() // (食べ物の設定終わり) ) .rarity(Rarity.EPIC) // レアリティ .stacksTo(16) // 最大スタック数 ) ); public static void register(IEventBus evBus) { ITEMS.register(evBus); } }

new Item.Properties()の後ろに必要なメソッドをつなげていくと、アイテムの性質の設定を追加できます。

耐久値

今回コメントアウトしているのは、他の性質と競合してしまうからです(おそらく最大スタック数)。 競合している状態だとゲームが起動しません。

満腹度と腹持ち係数

満腹度が空腹ゲージの回復量。アイコン一つ分が2。

腹持ち係数は隠し満腹度を決める数。隠し満腹度 = 満腹度×腹持ち係数。

食べ物のポーションエフェクト

.effect(() -> new MobEffectInstance(MobEffects.REGENERATION, 400, 1), 0.5F)

ポーションの種類は、MobEffects.と入力すると補完で出てきますが、バニラのコードを見て選ぶこともできます。

VSCode内でMobEffectsを「右クリック > 定義へ移動」でバニラのコードを確認できます。

一覧
概要
MOVEMENT_SPEED移動速度上昇
MOVEMENT_SLOWDOWN移動速度低下
DIG_SPEED採掘速度上昇
DIG_SLOWDOWN採掘速度低下
DAMAGE_BOOST攻撃力上昇
HEAL即時回復
HARMダメージ
JUMP跳躍力上昇
CONFUSION吐き気
REGENERATION再生
DAMAGE_RESISTANCE耐性
FIRE_RESISTANCE火炎耐性
WATER_BREATHING水中呼吸
INVISIBILITY透明化
BLINDNESS盲目
NIGHT_VISION暗視
HUNGER空腹
WEAKNESS弱体化
POISON
WITHERウィザー
HEALTH_BOOST体力増強
ABSORPTION衝撃吸収
SATURATION飽和
GLOWING発光
LEVITATION浮遊
LUCK幸運
UNLUCK不運
SLOW_FALLING低速落下
CONDUIT_POWERコンジットパワー
DOLPHINS_GRACEイルカの好意
BAD_OMEN不吉な予感

レアリティ

アイテムの表示名の文字の色です。エンチャントされたアイテムは水色、ネザースターは黄色、管理者用アイテムはマゼンタ──といったようなやつです。

一覧
概要
COMMON普通(白)
UNCOMMONアンコモン(黄色)
RAREレア(水色)
EPIC超レア(マゼンタ)

カスタムアイテム Lv.2

もっとアイテムを独自にカスタマイズする方法やろうと思ったんですけど、武器やツールは後回しにするので、それ以外となると割とネタがないんですよね......

とりあえず「com.(作者名).(ModのID).items.CustomItem」クラスを作ります。

CustomItem.java
package com.masuec.my_mod.items; import java.util.List; import javax.annotation.Nullable; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; public class CustomItem extends Item { public CustomItem() { super(new Item.Properties().durability(1000)); } public void appendHoverText(ItemStack pStack, @Nullable Level pLv, List<Component> pTooltip, TooltipFlag pFlag) { pTooltip.add(Component.translatable("item3_tooltip").withStyle(ChatFormatting.GOLD)); } }

さて、このappendHoverTextメソッドはバニラのレコードを参考にしています。 これはインベントリ内でマウスカーソルを合わせたときに出てくる説明文を追加します。

バニラのコードの参考

VSCode内のエクスプローラの下にある「JAVA PROJECTS」を展開して、「Referenced Libraries > forge1.20.1-47.3.0_mapped_parchment_2023.09.03-1.20.1-recomp.jar > net.minecraft.world.item > Items」を開きます。

そこでCtrl + Fで「record」と検索すると、

new RecordItem(1, SoundEvents.MUSIC_DISC_13, (new Item.Properties()).stacksTo(1).rarity(Rarity.RARE), 178)

のようにRecordItemが検索できます。

あとはこのRecordItemを「右クリック > 定義へ移動」とすると、先ほど新規作成したクラスと似た構造のコードにたどり着くと思います。

/** * Allows items to add custom lines of information to the mouseover description. */ public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List<Component> pTooltip, TooltipFlag pFlag) { pTooltip.add(this.getDisplayName().withStyle(ChatFormatting.GRAY)); } public MutableComponent getDisplayName() { return Component.translatable(this.getDescriptionId() + ".desc"); }

元のコード(上記)のappendHoverTextにはすぐ下のgetDisplayNameメソッドが使われているので、その戻り値で置き換えて使っているというわけですね。

Component.translatable

このメソッドの引数の文字列はlangファイルのキーです。

ChatFormatting

文字の色およびテキスト装飾です。

一覧
概要
BLACK
abc
DARK_BLUE暗い青
abc
DARK_GREEN暗い緑
abc
DARK_AQUA暗い水色
abc
DARK_RED暗い赤
abc
DARK_PURPLE暗い紫
abc
GOLD金色
abc
GRAY灰色
abc
DARK_GRAY暗い灰色
abc
BLUE
abc
GREEN
abc
AQUA水色
abc
RED
abc
LIGHT_PURPLEマゼンタ
abc
YELLOW黄色
abc
WHITE
abc
OBFUSCATED難読化
BOLD太字
abc
STRIKETHROUGH取り消し線
abc
UNDERLINE下線
abc
ITALIC斜体
abc
RESETリセット

登録

このアイテムも登録する必要があります。「ItemRegister」クラスに戻りましょう。

ItemRegister.java
package com.masuec.my_mod.registers; import com.masuec.my_mod.MyMod; import com.masuec.my_mod.items.CustomItem; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; import net.minecraft.world.item.Rarity; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; public class ItemRegister { public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MyMod.MODID); public static final RegistryObject<Item> TEST_ITEM = ITEMS.register( "test_item", () -> new Item(new Item.Properties()) ); public static final RegistryObject<Item> TEST_ITEM2 = ITEMS.register( "test_item2", () -> new Item( new Item.Properties() .fireResistant() .food( (new FoodProperties.Builder()) .alwaysEat() .nutrition(20) .saturationMod(0.5F) .effect(() -> new MobEffectInstance(MobEffects.REGENERATION, 400, 1), 0.5F) .build() ) .rarity(Rarity.EPIC) .stacksTo(16) ) ); // 3つめ public static final RegistryObject<Item> TEST_ITEM3 = ITEMS.register("test_item3", () -> new CustomItem()); public static void register(IEventBus evBus) { ITEMS.register(evBus); } }