diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoCountOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoCountOverlay.java index 302d99fdf..6f0b673df 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoCountOverlay.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/AmmoCountOverlay.java @@ -106,7 +106,7 @@ public class AmmoCountOverlay implements LayeredDraw.Layer { var ammoBoxType = data == null ? "All" : data.type(); boxAmmoCount = type.get(stack); - if (ammoBoxType.equals("All") || ammoBoxType.equals(type.name)) { + if (ammoBoxType.equals("All") || ammoBoxType.equals(type.serializationName)) { boxAnimator.forward(currentTime); boxAmmoSelected = true; } else { @@ -158,7 +158,7 @@ public class AmmoCountOverlay implements LayeredDraw.Layer { // 弹药类型 guiGraphics.drawString( font, - Component.translatable(type.translatableKey).getString(), + Component.translatable(type.translationKey).getString(), ammoX + 35, h + yOffset, fontColor, diff --git a/src/main/java/com/atsuishio/superbwarfare/command/AmmoCommand.java b/src/main/java/com/atsuishio/superbwarfare/command/AmmoCommand.java index 7c985405b..683b38e38 100644 --- a/src/main/java/com/atsuishio/superbwarfare/command/AmmoCommand.java +++ b/src/main/java/com/atsuishio/superbwarfare/command/AmmoCommand.java @@ -31,7 +31,7 @@ public class AmmoCommand { var type = context.getArgument("type", Ammo.class); var value = type.get(player); - context.getSource().sendSuccess(() -> Component.translatable("commands.ammo.get", Component.translatable(type.translatableKey), value), true); + context.getSource().sendSuccess(() -> Component.translatable("commands.ammo.get", Component.translatable(type.translationKey), value), true); return 0; })))) .then(Commands.literal("set").requires(s -> s.hasPermission(2)).then(Commands.argument("players", EntityArgument.players()).then(Commands.argument("type", EnumArgument.enumArgument(Ammo.class)).then(Commands.argument("value", IntegerArgumentType.integer(0)).executes(context -> { @@ -43,7 +43,7 @@ public class AmmoCommand { type.set(player, value); } - context.getSource().sendSuccess(() -> Component.translatable("commands.ammo.set", Component.translatable(type.translatableKey), value, players.size()), true); + context.getSource().sendSuccess(() -> Component.translatable("commands.ammo.set", Component.translatable(type.translationKey), value, players.size()), true); return 0; }))))) .then(Commands.literal("add").requires(s -> s.hasPermission(2)).then(Commands.argument("players", EntityArgument.players()).then(Commands.argument("type", EnumArgument.enumArgument(Ammo.class)).then(Commands.argument("value", IntegerArgumentType.integer(0)).executes(context -> { @@ -55,7 +55,7 @@ public class AmmoCommand { type.add(player, value); } - context.getSource().sendSuccess(() -> Component.translatable("commands.ammo.add", Component.translatable(type.translatableKey), value, players.size()), true); + context.getSource().sendSuccess(() -> Component.translatable("commands.ammo.add", Component.translatable(type.translationKey), value, players.size()), true); return 0; }))))); } diff --git a/src/main/java/com/atsuishio/superbwarfare/component/ModDataComponents.java b/src/main/java/com/atsuishio/superbwarfare/component/ModDataComponents.java index f42923618..8f1335774 100644 --- a/src/main/java/com/atsuishio/superbwarfare/component/ModDataComponents.java +++ b/src/main/java/com/atsuishio/superbwarfare/component/ModDataComponents.java @@ -55,7 +55,7 @@ public class ModDataComponents { public static void register(IEventBus eventBus) { for (var type : Ammo.values()) { - type.dataComponent = register("ammo_" + type.name.toLowerCase(), builder -> builder.persistent(Codec.INT)); + type.dataComponent = register("ammo_" + type.name, builder -> builder.persistent(Codec.INT)); } DATA_COMPONENT_TYPES.register(eventBus); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/AmmoSupplierItem.java b/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/AmmoSupplierItem.java index c91eb5219..b9eb093b4 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/AmmoSupplierItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/AmmoSupplierItem.java @@ -57,7 +57,7 @@ public class AmmoSupplierItem extends Item { } if (!level.isClientSide()) { - player.displayClientMessage(Component.translatable("item.superbwarfare.ammo_supplier.supply", Component.translatable(this.type.translatableKey), ammoToAdd * count), true); + player.displayClientMessage(Component.translatable("item.superbwarfare.ammo_supplier.supply", Component.translatable(this.type.translationKey), ammoToAdd * count), true); level.playSound(null, player.blockPosition(), ModSounds.BULLET_SUPPLY.get(), SoundSource.PLAYERS, 1, 1); } return InteractionResultHolder.success(stack); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/box/AmmoBox.java b/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/box/AmmoBox.java index 806664aec..54863e3ab 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/box/AmmoBox.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/box/AmmoBox.java @@ -77,7 +77,7 @@ public class AmmoBox extends Item { list.add("All"); for (var ammoType : Ammo.values()) { - list.add(ammoType.name); + list.add(ammoType.serializationName); } return list; @@ -102,18 +102,10 @@ public class AmmoBox extends Item { return true; } - switch (type) { - case RIFLE -> - player.displayClientMessage(Component.translatable("des.superbwarfare.ammo_box.type.rifle").withStyle(ChatFormatting.GREEN), true); - case HANDGUN -> - player.displayClientMessage(Component.translatable("des.superbwarfare.ammo_box.type.handgun").withStyle(ChatFormatting.AQUA), true); - case SHOTGUN -> - player.displayClientMessage(Component.translatable("des.superbwarfare.ammo_box.type.shotgun").withStyle(ChatFormatting.RED), true); - case SNIPER -> - player.displayClientMessage(Component.translatable("des.superbwarfare.ammo_box.type.sniper").withStyle(ChatFormatting.GOLD), true); - case HEAVY -> - player.displayClientMessage(Component.translatable("des.superbwarfare.ammo_box.type.heavy").withStyle(ChatFormatting.LIGHT_PURPLE), true); - } + player.displayClientMessage( + Component.translatable("des.superbwarfare.ammo_box.type." + type.name).withStyle(type.color), + true + ); } return true; @@ -127,24 +119,10 @@ public class AmmoBox extends Item { tooltipComponents.add(Component.translatable("des.superbwarfare.ammo_box").withStyle(ChatFormatting.GRAY)); - tooltipComponents.add(Component.translatable("des.superbwarfare.ammo_box.handgun").withStyle(ChatFormatting.AQUA) - .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(FormatTool.format0D(Ammo.HANDGUN.get(stack)) + ((type != Ammo.HANDGUN) ? " " : " ←-")).withStyle(ChatFormatting.BOLD))); - - tooltipComponents.add(Component.translatable("des.superbwarfare.ammo_box.rifle").withStyle(ChatFormatting.GREEN) - .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(FormatTool.format0D(Ammo.RIFLE.get(stack)) + ((type != Ammo.RIFLE) ? " " : " ←-")).withStyle(ChatFormatting.BOLD))); - - tooltipComponents.add(Component.translatable("des.superbwarfare.ammo_box.shotgun").withStyle(ChatFormatting.RED) - .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(FormatTool.format0D(Ammo.SHOTGUN.get(stack)) + ((type != Ammo.SHOTGUN) ? " " : " ←-")).withStyle(ChatFormatting.BOLD))); - - tooltipComponents.add(Component.translatable("des.superbwarfare.ammo_box.sniper").withStyle(ChatFormatting.GOLD) - .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(FormatTool.format0D(Ammo.SNIPER.get(stack)) + ((type != Ammo.SNIPER) ? " " : " ←-")).withStyle(ChatFormatting.BOLD))); - - tooltipComponents.add(Component.translatable("des.superbwarfare.ammo_box.heavy").withStyle(ChatFormatting.LIGHT_PURPLE) - .append(Component.literal("").withStyle(ChatFormatting.RESET)) - .append(Component.literal(FormatTool.format0D(Ammo.HEAVY.get(stack)) + ((type != Ammo.HEAVY) ? " " : " ←-")).withStyle(ChatFormatting.BOLD))); + for (var ammo : Ammo.values()) { + tooltipComponents.add(Component.translatable("des.superbwarfare.ammo_box." + ammo.name).withStyle(ammo.color) + .append(Component.literal("").withStyle(ChatFormatting.RESET)) + .append(Component.literal(FormatTool.format0D(ammo.get(stack)) + ((type != ammo) ? " " : " ←-")).withStyle(ChatFormatting.BOLD))); + } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java index 31826ee21..cd142e6cf 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -464,13 +464,7 @@ public abstract class GunItem extends Item implements CustomRendererItem { var type = Ammo.getType(ammoTypeInfo.value()); assert type != null; - return switch (type) { - case RIFLE -> "Rifle Ammo"; - case HANDGUN -> "Handgun Ammo"; - case SHOTGUN -> "Shotgun Ammo"; - case SNIPER -> "Sniper Ammo"; - case HEAVY -> "Heavy Ammo"; - }; + return type.displayName; } return ""; } diff --git a/src/main/java/com/atsuishio/superbwarfare/tools/Ammo.java b/src/main/java/com/atsuishio/superbwarfare/tools/Ammo.java index 1fa45a9d6..056aaf990 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tools/Ammo.java +++ b/src/main/java/com/atsuishio/superbwarfare/tools/Ammo.java @@ -2,6 +2,7 @@ package com.atsuishio.superbwarfare.tools; import com.atsuishio.superbwarfare.capability.player.PlayerVariable; import com.atsuishio.superbwarfare.init.ModAttachments; +import net.minecraft.ChatFormatting; import net.minecraft.core.component.DataComponentType; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.Entity; @@ -9,23 +10,61 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.registries.DeferredHolder; public enum Ammo { - HANDGUN("item.superbwarfare.ammo.handgun", "HandgunAmmo"), - RIFLE("item.superbwarfare.ammo.rifle", "RifleAmmo"), - SHOTGUN("item.superbwarfare.ammo.shotgun", "ShotgunAmmo"), - SNIPER("item.superbwarfare.ammo.sniper", "SniperAmmo"), - HEAVY("item.superbwarfare.ammo.heavy", "HeavyAmmo"); - public final String translatableKey; + HANDGUN(ChatFormatting.GREEN), + RIFLE(ChatFormatting.AQUA), + SHOTGUN(ChatFormatting.RED), + SNIPER(ChatFormatting.GOLD), + HEAVY(ChatFormatting.LIGHT_PURPLE); + + /** + * 翻译字段名称,如 item.superbwarfare.ammo.rifle + */ + public final String translationKey; + /** + * 大驼峰格式命名的序列化字段名称,如 RifleAmmo + */ + public final String serializationName; + /** + * 下划线格式命名的小写名称,如 rifle + */ public final String name; + + /** + * 大驼峰格式命名的显示名称,如 Rifle Ammo + */ + public final String displayName; + + public final ChatFormatting color; public DeferredHolder, DataComponentType> dataComponent; - Ammo(String translatableKey, String name) { - this.translatableKey = translatableKey; + Ammo(ChatFormatting color) { + this.color = color; + + var name = name().toLowerCase(); this.name = name; + this.translationKey = "item.superbwarfare.ammo." + name; + + var builder = new StringBuilder(); + var useUpperCase = true; + + for (char c : name.toCharArray()) { + if (c == '_') { + useUpperCase = true; + } else if (useUpperCase) { + builder.append(Character.toUpperCase(c)); + useUpperCase = false; + } else { + builder.append(c); + } + } + + this.displayName = builder + " Ammo"; + this.serializationName = builder + "Ammo"; } public static Ammo getType(String name) { for (Ammo type : values()) { - if (type.name.equals(name)) { + if (type.serializationName.equals(name)) { return type; } } @@ -48,12 +87,12 @@ public enum Ammo { // NBTTag public int get(CompoundTag tag) { - return tag.getInt(this.name); + return tag.getInt(this.serializationName); } public void set(CompoundTag tag, int count) { if (count < 0) count = 0; - tag.putInt(this.name, count); + tag.putInt(this.serializationName, count); } public void add(CompoundTag tag, int count) { @@ -108,6 +147,6 @@ public enum Ammo { @Override public String toString() { - return this.name; + return this.serializationName; } }