From 3c13f0753a05487c7b5c74aab677df3d4d554e2d Mon Sep 17 00:00:00 2001 From: Atsuishio <842960157@qq.com> Date: Fri, 11 Apr 2025 02:31:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B3=A2=E5=A1=9E=E5=85=8B?= =?UTF-8?q?=E6=89=8B=E9=83=A8=E5=8A=A8=E7=94=BB=E5=92=8C=E6=97=A0=E6=95=88?= =?UTF-8?q?=E5=8F=91=E5=B0=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/client/ClickHandler.java | 11 ++++++--- .../event/ClientEventHandler.java | 6 ++--- .../network/message/send/FireMessage.java | 23 +++++++++---------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java index e0524416d..120fe799b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java @@ -334,6 +334,7 @@ public class ClickHandler { player.playSound(ModSounds.TRIGGER_CLICK.get(), 1, 1); } else { player.playSound(ModSounds.BOCEK_PULL_1P.get(), 1, 1); + handTimer = 0; } if (!gunItem.useBackpackAmmo(stack) && data.ammo() <= 0 && data.reload.time() == 0) { @@ -342,8 +343,12 @@ public class ClickHandler { ClientEventHandler.burstFireAmount = 0; } } else { - PacketDistributor.sendToServer(new FireMessage(0)); - if ((!data.reloading() && !data.charging() && !data.bolt.needed()) && drawTime < 0.01) { + PacketDistributor.sendToServer(new FireMessage(0, handTimer, zoom)); + if ((!data.reloading() + && !data.charging() + && !data.bolt.needed()) + && drawTime < 0.01 + ) { if (data.fireMode() == 1) { if (ClientEventHandler.burstFireAmount == 0) { ClientEventHandler.burstFireAmount = data.burstAmount(); @@ -358,7 +363,7 @@ public class ClickHandler { } public static void handleWeaponFireRelease() { - PacketDistributor.sendToServer(new FireMessage(1)); + PacketDistributor.sendToServer(new FireMessage(1, handTimer, zoom)); ClientEventHandler.holdFire = false; ClientEventHandler.holdFireVehicle = false; ClientEventHandler.customRpm = 0; diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 546e1a5c6..9c345de6b 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -1009,7 +1009,7 @@ public class ClientEventHandler { handleWeaponFire(event, living); handleWeaponShell(); handleGunRecoil(); - handleBowPullAnimation(living); + handleBowPullAnimation(living, stack); handleWeaponDraw(living); handlePlayerCamera(event); } @@ -1420,10 +1420,10 @@ public class ClientEventHandler { event.setRoll((float) (roll + cameraRot[2] + (DisplayConfig.CAMERA_ROTATE.get() ? 0.35 : 0) * turnRot[2])); } - private static void handleBowPullAnimation(LivingEntity entity) { + private static void handleBowPullAnimation(LivingEntity entity, ItemStack stack) { float times = 4 * (float) Math.min(Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(), 0.8); - if (holdFire) { + if (holdFire && entity instanceof Player player && !player.getCooldowns().isOnCooldown(stack.getItem())) { pullTimer = Math.min(pullTimer + 0.024 * times, 1.4); bowTimer = Math.min(bowTimer + 0.018 * times, 1); handTimer = Math.min(handTimer + 0.018 * times, 1); diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireMessage.java index 21ffa62da..54d44d0ea 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireMessage.java @@ -2,7 +2,6 @@ package com.atsuishio.superbwarfare.network.message.send; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.entity.projectile.ProjectileEntity; -import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.event.GunEventHandler; import com.atsuishio.superbwarfare.init.ModAttachments; import com.atsuishio.superbwarfare.init.ModPerks; @@ -27,21 +26,25 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -public record FireMessage(int msgType) implements CustomPacketPayload { +public record FireMessage(int msgType, double power, boolean zoom) implements CustomPacketPayload { public static final Type TYPE = new Type<>(Mod.loc("fire")); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.INT, FireMessage::msgType, + ByteBufCodecs.DOUBLE, + FireMessage::power, + ByteBufCodecs.BOOL, + FireMessage::zoom, FireMessage::new ); public static void handler(FireMessage message, final IPayloadContext context) { - pressAction(context.player(), message.msgType); + pressAction(context.player(), message.msgType, message.power, message.zoom); } - public static void pressAction(Player player, int type) { + public static void pressAction(Player player, int type, double power, boolean zoom) { if (player.isSpectator()) return; ItemStack stack = player.getMainHandItem(); if (!stack.is(ModTags.Items.GUN)) return; @@ -59,19 +62,15 @@ public record FireMessage(int msgType) implements CustomPacketPayload { cap.edit = false; // 按下开火 - if (!(stack.getItem() instanceof SpecialFireWeapon specialFireWeapon)) { - player.setData(ModAttachments.PLAYER_VARIABLE, cap); - cap.sync(player); - return; - } - specialFireWeapon.fireOnPress(player, data, ClientEventHandler.zoom); + if (!(stack.getItem() instanceof SpecialFireWeapon specialFireWeapon)) return; + specialFireWeapon.fireOnPress(player, data, zoom); } else if (type == 1) { // 松开开火 if (stack.getItem() instanceof SpecialFireWeapon specialFireWeapon) { if (specialFireWeapon instanceof BocekItem) { - specialFireWeapon.fireOnRelease(player, data, ClientEventHandler.bowTimer, ClientEventHandler.zoom); + specialFireWeapon.fireOnRelease(player, data, power, zoom); } else { - specialFireWeapon.fireOnRelease(player, data, 0, ClientEventHandler.zoom); + specialFireWeapon.fireOnRelease(player, data, 0, zoom); } } }