From 2cd8947733e13cb670ee662486e36f5374f7884e Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Sun, 20 Apr 2025 20:53:45 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=83=A8=E5=88=86=E5=BC=80?= =?UTF-8?q?=E7=81=AB=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/event/ClientEventHandler.java | 3 +++ .../atsuishio/superbwarfare/item/gun/GunItem.java | 12 ++++++++++-- .../superbwarfare/item/gun/launcher/M79Item.java | 6 ++++-- .../superbwarfare/item/gun/launcher/RpgItem.java | 7 ++++--- .../item/gun/launcher/SecondaryCataclysm.java | 8 +++++--- .../item/gun/shotgun/HomemadeShotgunItem.java | 9 +++++++++ .../superbwarfare/item/gun/sniper/SentinelItem.java | 4 ++-- .../superbwarfare/item/gun/special/TaserItem.java | 11 ++++++----- 8 files changed, 43 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index faf1fd609..d87d94bb3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -737,6 +737,7 @@ public class ClientEventHandler { actionMove = Mth.lerp(0.125 * times, actionMove, 0); } + // TODO 添加canShoot()方法,提前判断是否能开火 public static void handleClientShoot() { Player player = Minecraft.getInstance().player; if (player == null) return; @@ -744,6 +745,8 @@ public class ClientEventHandler { if (!(stack.getItem() instanceof GunItem)) return; var data = GunData.from(stack); + if (data.projectileAmount() <= 0) 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 b2a5cf0fc..c31ad26ba 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -495,7 +495,12 @@ public abstract class GunItem extends Item implements CustomRendererItem { if (data.defaultActionTime() > 0 && data.ammo.get() > (data.stack.is(ModTags.Items.REVOLVER) ? 0 : 1)) { data.bolt.needed.set(true); } + } + /** + * 服务端在开火后的额外行为 + */ + public void afterShoot(GunData data, Player player) { if (!data.useBackpackAmmo()) { data.ammo.set(data.ammo.get() - 1); data.isEmpty.set(true); @@ -518,9 +523,10 @@ public abstract class GunItem extends Item implements CustomRendererItem { // 生成所有子弹 for (int index0 = 0; index0 < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : projectileAmount); index0++) { - shootBullet(player, data, spread, zoom); + if (!shootBullet(player, data, spread, zoom)) return; } + data.item.afterShoot(data, player); playFireSounds(data, player, zoom); } @@ -593,7 +599,7 @@ public abstract class GunItem extends Item implements CustomRendererItem { /** * 服务端发射单发子弹 */ - public void shootBullet(Player player, GunData data, double spread, boolean zoom) { + public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) { var stack = data.stack; float headshot = (float) data.headshot(); @@ -668,6 +674,8 @@ public abstract class GunItem extends Item implements CustomRendererItem { projectile.setPos(player.getX() - 0.1 * player.getLookAngle().x, player.getEyeY() - 0.1 - 0.1 * player.getLookAngle().y, player.getZ() + -0.1 * player.getLookAngle().z); projectile.shoot(player, player.getLookAngle().x, player.getLookAngle().y + 0.001f, player.getLookAngle().z, stack.is(ModTags.Items.SHOTGUN) && perk == ModPerks.INCENDIARY_BULLET.get() ? 4.5f : velocity, (float) spread); player.level().addFreshEntity(projectile); + + return true; } @SubscribeEvent diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java index b5cdefa3b..64be44318 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java @@ -121,8 +121,8 @@ public class M79Item extends GunItem implements GeoItem { } @Override - public void shootBullet(Player player, GunData data, double spread, boolean zoom) { - if (data.reloading()) return; + public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) { + if (data.reloading()) return false; if (player.level() instanceof ServerLevel serverLevel) { GunGrenadeEntity gunGrenadeEntity = new GunGrenadeEntity(player, serverLevel, @@ -157,6 +157,8 @@ public class M79Item extends GunItem implements GeoItem { player.getZ() + 1.8 * player.getLookAngle().z, 4, 0.1, 0.1, 0.1, 0.002, true); } + + return true; } } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java index fdb0ca3f6..5b3826e77 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java @@ -144,10 +144,10 @@ public class RpgItem extends GunItem implements GeoItem { } @Override - public void shootBullet(Player player, GunData data, double spread, boolean zoom) { + public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) { Level level = player.level(); - if (data.reloading()) return; + if (data.reloading()) return false; if (player.level() instanceof ServerLevel serverLevel) { RpgRocketEntity rocket = new RpgRocketEntity(player, level, @@ -188,6 +188,8 @@ public class RpgItem extends GunItem implements GeoItem { } data.isEmpty.set(true); data.closeHammer.set(true); + + return true; } @Override @@ -197,5 +199,4 @@ public class RpgItem extends GunItem implements GeoItem { behaviors.put(84, data -> data.isEmpty.set(false)); behaviors.put(9, data -> data.closeHammer.set(false)); } - } \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java index d38c09742..4672c586d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java @@ -232,9 +232,9 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, EnergyStorag } @Override - public void shootBullet(Player player, GunData data, double spread, boolean zoom) { - if (data.reloading()) return; - ItemStack stack = data.stack(); + public boolean shootBullet(Player player, GunData data, double spread, boolean zoom) { + if (data.reloading()) return false; + var stack = data.stack; var stackCap = stack.getCapability(Capabilities.EnergyStorage.ITEM); var hasEnoughEnergy = stackCap != null && stackCap.getEnergyStored() >= 3000; @@ -282,6 +282,8 @@ public class SecondaryCataclysm extends GunItem implements GeoItem, EnergyStorag } } } + + return true; } @Override diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java index a66c976cb..ac89b39d8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java @@ -136,6 +136,15 @@ public class HomemadeShotgunItem extends GunItem implements GeoItem { } } + @Override + public void afterShoot(GunData data, Player player) { + super.afterShoot(data, player); + + var stack = data.stack(); + stack.hurtAndBreak(1, (ServerLevel) player.level(), player, p -> { + }); + } + @Override public int getAvailableFireModes() { return FireMode.SEMI.flag; diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java index 1182b40a1..0513b08ef 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java @@ -191,8 +191,8 @@ public class SentinelItem extends GunItem implements GeoItem, EnergyStorageItem } @Override - public void beforeShoot(GunData data, Player player, double spread, boolean zoom) { - super.beforeShoot(data, player, spread, zoom); + public void afterShoot(GunData data, Player player) { + super.afterShoot(data, player); var cap = data.stack.getCapability(Capabilities.EnergyStorage.ITEM); if (cap != null) { 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 8744ec6eb..3c86b8e4c 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 @@ -112,7 +112,6 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem { return this.cache; } - @Override @ParametersAreNonnullByDefault public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { @@ -184,15 +183,15 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem { } @Override - public void shootBullet(Player player, GunData data, double spread, boolean zoom) { - if (data.reloading()) return; - ItemStack stack = data.stack(); + 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; + if (!hasEnoughEnergy) return false; player.getCooldowns().addCooldown(stack.getItem(), 5); @@ -212,6 +211,8 @@ public class TaserItem extends GunItem implements GeoItem, EnergyStorageItem { } energyStorage.extractEnergy(400 + 100 * perkLevel, false); + + return true; } @Override