From 353b7a1b3bdf4d5123646a4ee1ae409ccd3e3653 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Sun, 20 Apr 2025 21:11:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dtaser=E5=BC=80=E7=81=AB?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/ClientEventHandler.java | 9 +++-- .../superbwarfare/item/gun/GunItem.java | 9 +++++ .../item/gun/special/TaserItem.java | 38 +++++++++++++------ 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index d87d94bb3..196e53fe6 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -666,9 +666,10 @@ public class ClientEventHandler { public static void shootClient(Player player, final CompoundTag tag) { ItemStack stack = player.getMainHandItem(); - if (!(stack.getItem() instanceof GunItem)) return; + if (!(stack.getItem() instanceof GunItem gunItem)) return; var data = GunData.from(stack); if (!data.hasEnoughAmmoToShoot(player)) return; + if (!gunItem.canShoot(data)) return; if (stack.is(ModTags.Items.NORMAL_GUN)) { int mode = data.fireMode.get(); @@ -737,15 +738,15 @@ public class ClientEventHandler { actionMove = Mth.lerp(0.125 * times, actionMove, 0); } - // TODO 添加canShoot()方法,提前判断是否能开火 + // TODO 完善canShoot()方法,提前判断是否能开火 public static void handleClientShoot() { Player player = Minecraft.getInstance().player; if (player == null) return; ItemStack stack = player.getMainHandItem(); - if (!(stack.getItem() instanceof GunItem)) return; + if (!(stack.getItem() instanceof GunItem gunItem)) return; var data = GunData.from(stack); - if (data.projectileAmount() <= 0) return; + if (!gunItem.canShoot(data)) return; PacketDistributor.sendToServer(new ShootMessage(gunSpread, zoom)); fireRecoilTime = 10; 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 c31ad26ba..2724252b3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -476,6 +476,13 @@ public abstract class GunItem extends Item implements CustomRendererItem { public void addReloadTimeBehavior(Map> behaviors) { } + /** + * 判断武器能否开火 + */ + public boolean canShoot(GunData data) { + return data.projectileAmount() > 0; + } + /** * 服务端在开火前的额外行为 */ @@ -598,6 +605,8 @@ public abstract class GunItem extends Item implements CustomRendererItem { /** * 服务端发射单发子弹 + * + * @return 是否发射成功 */ public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) { var stack = data.stack; diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java index 3c86b8e4c..af7267824 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java @@ -184,15 +184,7 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem { @Override public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) { - if (data.reloading()) return false; var stack = data.stack; - - int perkLevel = data.perk.getLevel(ModPerks.VOLT_OVERLOAD); - var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); - var hasEnoughEnergy = energyStorage != null && energyStorage.getEnergyStored() >= 400 + 100 * perkLevel; - - if (!hasEnoughEnergy) return false; - player.getCooldowns().addCooldown(stack.getItem(), 5); if (player instanceof ServerPlayer serverPlayer) { @@ -200,7 +192,6 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem { int wireLength = data.perk.getLevel(ModPerks.LONGER_WIRE); var level = serverPlayer.level(); - TaserBulletEntity taserBulletProjectile = new TaserBulletEntity(player, level, (float) data.damage(), volt, wireLength); @@ -209,12 +200,35 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem { (float) (zoom ? 0.1 : spread)); level.addFreshEntity(taserBulletProjectile); } - - energyStorage.extractEnergy(400 + 100 * perkLevel, false); - return true; } + @Override + public void afterShoot(GunData data, Player player) { + super.afterShoot(data, player); + var stack = data.stack; + int perkLevel = data.perk.getLevel(ModPerks.VOLT_OVERLOAD); + + var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (energyStorage != null) { + energyStorage.extractEnergy(400 + 100 * perkLevel, false); + } + } + + @Override + public boolean canShoot(GunData data) { + var stack = data.stack; + + int perkLevel = data.perk.getLevel(ModPerks.VOLT_OVERLOAD); + + var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); + var hasEnoughEnergy = energyStorage != null && energyStorage.getEnergyStored() >= 400 + 100 * perkLevel; + + if (!hasEnoughEnergy) return false; + if (data.reloading()) return false; + return super.canShoot(data); + } + @Override public int getMaxEnergy() { return MAX_ENERGY;