From 69a7f614b7491ed7412ba186c7c7865284bb1850 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Thu, 22 May 2025 17:16:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0otto=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=92=8Cbetter=20combat=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +- .../tooltip/ClientCellImageTooltip.java | 4 +- .../tooltip/component/CellImageComponent.java | 8 +- .../superbwarfare/init/ModItems.java | 5 +- .../atsuishio/superbwarfare/init/ModTabs.java | 8 +- .../superbwarfare/item/ElectricBaton.java | 107 +++++++++++++++++- .../superbwarfare/tiers/ModItemTier.java | 2 +- .../assets/superbwarfare/lang/en_us.json | 3 + .../assets/superbwarfare/lang/zh_cn.json | 3 + 9 files changed, 131 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index 4c37e4a81..88831de28 100644 --- a/build.gradle +++ b/build.gradle @@ -143,7 +143,9 @@ dependencies { // implementation "curse.maven:cupboard-326652:6078150" // implementation "curse.maven:connectivity-470193:6229173" -// // 测试用mod + // 测试用mod + implementation "curse.maven:better-combat-by-daedelus-639842:6532547" + implementation "curse.maven:playeranimator-658587:6024462" // implementation fg.deobf("curse.maven:oculus-581495:6020952") // implementation fg.deobf("curse.maven:embeddium-908741:5681725") // implementation fg.deobf("curse.maven:timeless-and-classics-zero-1028108:6069384") diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientCellImageTooltip.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientCellImageTooltip.java index e7dc542b8..5d088c00d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientCellImageTooltip.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientCellImageTooltip.java @@ -1,6 +1,6 @@ package com.atsuishio.superbwarfare.client.tooltip; -import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent; +import com.atsuishio.superbwarfare.client.tooltip.component.CellImageComponent; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; @@ -19,7 +19,7 @@ public class ClientCellImageTooltip implements ClientTooltipComponent { protected final int height; protected final ItemStack stack; - public ClientCellImageTooltip(GunImageComponent tooltip) { + public ClientCellImageTooltip(CellImageComponent tooltip) { this.width = tooltip.width; this.height = tooltip.height; this.stack = tooltip.stack; diff --git a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/component/CellImageComponent.java b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/component/CellImageComponent.java index 054ab9469..6c5b4b283 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/tooltip/component/CellImageComponent.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/tooltip/component/CellImageComponent.java @@ -1,19 +1,21 @@ package com.atsuishio.superbwarfare.client.tooltip.component; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; -public class CellImageComponent extends GunImageComponent { +public class CellImageComponent implements TooltipComponent { public int width; public int height; public ItemStack stack; public CellImageComponent(int width, int height, ItemStack stack) { - super(width, height, stack); + this.width = width; + this.height = height; + this.stack = stack; } public CellImageComponent(ItemStack stack) { this(32, 16, stack); } - } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java index 42591bca7..ebeb357e6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java @@ -142,7 +142,10 @@ public class ModItems { public static final DeferredHolder DETONATOR = ITEMS.register("detonator", Detonator::new); public static final DeferredHolder TARGET_DEPLOYER = ITEMS.register("target_deployer", TargetDeployer::new); public static final DeferredHolder DPS_GENERATOR_DEPLOYER = ITEMS.register("dps_generator_deployer", DPSGeneratorDeployer::new); - public static final DeferredHolder KNIFE = ITEMS.register("knife", () -> new SwordItem(ModItemTier.STEEL, new Item.Properties().attributes(SwordItem.createAttributes(ModItemTier.STEEL, 0, -1.8f)))); + public static final DeferredHolder KNIFE = ITEMS.register("knife", () -> new SwordItem(ModItemTier.STEEL, new Item.Properties() + .attributes(SwordItem.createAttributes(ModItemTier.STEEL, 0, -1.8f)) + .durability(1200) + )); public static final DeferredHolder HAMMER = ITEMS.register("hammer", Hammer::new); public static final DeferredHolder ELECTRIC_BATON = ITEMS.register("electric_baton", ElectricBaton::new); public static final DeferredHolder CROWBAR = ITEMS.register("crowbar", Crowbar::new); diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java index 429bd1544..720dfde1c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java @@ -2,10 +2,7 @@ package com.atsuishio.superbwarfare.init; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.api.event.RegisterContainersEvent; -import com.atsuishio.superbwarfare.item.ArmorPlate; -import com.atsuishio.superbwarfare.item.BatteryItem; -import com.atsuishio.superbwarfare.item.C4Bomb; -import com.atsuishio.superbwarfare.item.SmallContainerBlockItem; +import com.atsuishio.superbwarfare.item.*; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -94,6 +91,9 @@ public class ModTabs { if (registryObject.get() instanceof BatteryItem batteryItem) { output.accept(batteryItem.makeFullEnergyStack()); } + if (registryObject.get() == ModItems.ELECTRIC_BATON.get()) { + output.accept(ElectricBaton.makeFullEnergyStack()); + } })) .build()); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/ElectricBaton.java b/src/main/java/com/atsuishio/superbwarfare/item/ElectricBaton.java index 1c3d683a2..7ebbe7984 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/ElectricBaton.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/ElectricBaton.java @@ -1,18 +1,123 @@ package com.atsuishio.superbwarfare.item; +import com.atsuishio.superbwarfare.client.tooltip.component.CellImageComponent; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModMobEffects; import com.atsuishio.superbwarfare.tiers.ModItemTier; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.capabilities.Capabilities; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; +import java.util.Optional; public class ElectricBaton extends SwordItem implements EnergyStorageItem { + + public static final int MAX_ENERGY = 6000; + public static final int ENERGY_COST = 1000; + public static final String TAG_OPEN = "Open"; + public ElectricBaton() { super(ModItemTier.STEEL, new Properties() .durability(1114) - .attributes(SwordItem.createAttributes(ModItemTier.STEEL, 3, -2.5f)) + .attributes(SwordItem.createAttributes(ModItemTier.STEEL, 2, -2.5f)) ); } + @Override + @ParametersAreNonnullByDefault + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + tooltipComponents.add(Component.translatable("des.superbwarfare.electric_baton").withStyle(ChatFormatting.AQUA)); + + if (NBTTool.getTag(stack).getBoolean(TAG_OPEN)) { + tooltipComponents.add(Component.translatable("des.superbwarfare.electric_baton.open").withStyle(ChatFormatting.GRAY)); + } + } + @Override public int getMaxEnergy() { return 6000; } + + @Override + @ParametersAreNonnullByDefault + public @NotNull InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { + ItemStack stack = player.getItemInHand(usedHand); + + if (player.isCrouching()) { + var tag = NBTTool.getTag(stack); + tag.putBoolean(TAG_OPEN, !tag.getBoolean(TAG_OPEN)); + NBTTool.saveTag(stack, tag); + + player.displayClientMessage(Component.translatable("des.superbwarfare.electric_baton." + (tag.getBoolean(TAG_OPEN) ? "open" : "close")), true); + } + return InteractionResultHolder.fail(stack); + } + + @Override + public boolean isBarVisible(@NotNull ItemStack stack) { + return NBTTool.getTag(stack).getBoolean(TAG_OPEN); + } + + @Override + public int getBarWidth(ItemStack stack) { + var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (cap == null) return 0; + + return Math.round(cap.getEnergyStored() * 13F / MAX_ENERGY); + } + + @Override + public int getBarColor(@NotNull ItemStack pStack) { + return 0xFFFF00; + } + + @Override + @ParametersAreNonnullByDefault + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + if (NBTTool.getTag(stack).getBoolean(TAG_OPEN)) { + var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (cap != null && cap.getEnergyStored() >= ENERGY_COST) { + cap.extractEnergy(ENERGY_COST, false); + + if (!target.level().isClientSide) { + target.addEffect(new MobEffectInstance(ModMobEffects.SHOCK, 200, 2), attacker); + } + } + } + return super.hurtEnemy(stack, target, attacker); + } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + return Optional.of(new CellImageComponent(pStack)); + } + + public static ItemStack makeFullEnergyStack() { + ItemStack stack = new ItemStack(ModItems.ELECTRIC_BATON.get()); + + var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (cap != null) { + cap.receiveEnergy(MAX_ENERGY, false); + } + + var tag = NBTTool.getTag(stack); + tag.putBoolean(TAG_OPEN, true); + NBTTool.saveTag(stack, tag); + + return stack; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/tiers/ModItemTier.java b/src/main/java/com/atsuishio/superbwarfare/tiers/ModItemTier.java index 58098d12d..4fb5a9471 100644 --- a/src/main/java/com/atsuishio/superbwarfare/tiers/ModItemTier.java +++ b/src/main/java/com/atsuishio/superbwarfare/tiers/ModItemTier.java @@ -11,7 +11,7 @@ import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; public enum ModItemTier implements Tier { - STEEL(400, 6.0f, 5.5f, 15, () -> Ingredient.of(ModItems.STEEL_INGOT.get())), + STEEL(400, 6, 5, 15, () -> Ingredient.of(ModItems.STEEL_INGOT.get())), ; private final int uses; diff --git a/src/main/resources/assets/superbwarfare/lang/en_us.json b/src/main/resources/assets/superbwarfare/lang/en_us.json index 326dbe175..6a2a12ef9 100644 --- a/src/main/resources/assets/superbwarfare/lang/en_us.json +++ b/src/main/resources/assets/superbwarfare/lang/en_us.json @@ -185,6 +185,9 @@ "item.superbwarfare.knife": "Knife", "item.superbwarfare.hammer": "Hammer", "item.superbwarfare.electric_baton": "Electric Baton", + "des.superbwarfare.electric_baton": "Right click while sneaking to switch electroshock mode", + "des.superbwarfare.electric_baton.open": "Electroshock Mode Enabled", + "des.superbwarfare.electric_baton.close": "Electroshock Mode Disabled", "item.superbwarfare.crowbar": "Crowbar", "des.superbwarfare.crowbar": "Right-click to open containers. Pick up vehicles when sneaking", "item.superbwarfare.defuser": "Defuser", diff --git a/src/main/resources/assets/superbwarfare/lang/zh_cn.json b/src/main/resources/assets/superbwarfare/lang/zh_cn.json index 9ce5b5e73..d519180f4 100644 --- a/src/main/resources/assets/superbwarfare/lang/zh_cn.json +++ b/src/main/resources/assets/superbwarfare/lang/zh_cn.json @@ -185,6 +185,9 @@ "item.superbwarfare.knife": "军刀", "item.superbwarfare.hammer": "大锤", "item.superbwarfare.electric_baton": "电棍", + "des.superbwarfare.electric_baton": "潜行使用以开关电击模式", + "des.superbwarfare.electric_baton.open": "已开启电击模式", + "des.superbwarfare.electric_baton.close": "已关闭电击模式", "item.superbwarfare.crowbar": "撬棍", "des.superbwarfare.crowbar": "右击以开启集装箱,潜行时右击以回收载具", "item.superbwarfare.defuser": "拆弹器",