Mod制作日記 - アイテム
前回の続き。
追加するだけだったアイテムをカスタムする方法についてやっていきます。
目次 (折りたたみ可)
カスタムアイテム Lv.1
「ItemRegister」クラスへ以下のように追加をします。
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.REGENERATION:再生ポーション
- 400:ポーションの効果時間(tick)
- 1:ポーションの強度(0 ~ 127)
- 0.5F:食べたときにポーションがかかる確率(0.0 ~ 1.0)
ポーションの種類は、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」クラスを作ります。
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 | 取り消し線 |
UNDERLINE | 下線 abc |
ITALIC | 斜体 abc |
RESET | リセット |
登録
このアイテムも登録する必要があります。「ItemRegister」クラスに戻りましょう。
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);
}
}