From 233bdf6998d84b761b7effe5268306751291ff11 Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Sat, 12 Apr 2025 22:12:02 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=88=98=E6=9C=AF=E5=86=B2?= =?UTF-8?q?=E5=88=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../capability/player/PlayerVariable.java | 9 +++-- .../event/ClientEventHandler.java | 6 ++++ .../event/PlayerEventHandler.java | 28 ++++++++++++++++ .../mixins/KeyboardInputMixin.java | 10 ------ .../network/NetworkRegistry.java | 1 + .../message/send/TacticalSprintMessage.java | 33 +++++++++++++++++++ 6 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/network/message/send/TacticalSprintMessage.java diff --git a/src/main/java/com/atsuishio/superbwarfare/capability/player/PlayerVariable.java b/src/main/java/com/atsuishio/superbwarfare/capability/player/PlayerVariable.java index 03a2a8f2f..58cc1b5c3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/capability/player/PlayerVariable.java +++ b/src/main/java/com/atsuishio/superbwarfare/capability/player/PlayerVariable.java @@ -26,6 +26,7 @@ public class PlayerVariable implements INBTSerializable { public int shotgunAmmo = 0; public int sniperAmmo = 0; public int heavyAmmo = 0; + public boolean tacticalSprint = false; public boolean edit = false; public void sync(Entity entity) { @@ -34,8 +35,8 @@ public class PlayerVariable implements INBTSerializable { var newVariable = entity.getData(ModAttachments.PLAYER_VARIABLE); if (old != null && old.equals(newVariable)) return; - if (entity instanceof ServerPlayer) { - PacketDistributor.sendToAllPlayers(new PlayerVariablesSyncMessage(entity.getId(), newVariable.writeToNBT())); + if (entity instanceof ServerPlayer serverPlayer) { + PacketDistributor.sendToPlayer(serverPlayer, new PlayerVariablesSyncMessage(entity.getId(), newVariable.writeToNBT())); } } @@ -58,6 +59,7 @@ public class PlayerVariable implements INBTSerializable { type.set(nbt, type.get(this)); } + nbt.putBoolean("TacticalSprint", tacticalSprint); nbt.putBoolean("EditMode", edit); return nbt; @@ -68,6 +70,7 @@ public class PlayerVariable implements INBTSerializable { type.set(this, type.get(tag)); } + tacticalSprint = tag.getBoolean("TacticalSprint"); edit = tag.getBoolean("EditMode"); return this; @@ -82,6 +85,8 @@ public class PlayerVariable implements INBTSerializable { clone.sniperAmmo = this.sniperAmmo; clone.heavyAmmo = this.heavyAmmo; clone.edit = this.edit; + clone.tacticalSprint = this.tacticalSprint; + return clone; } diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 5a1f44ec9..f3bb4f403 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -351,6 +351,12 @@ public class ClientEventHandler { if (zoom) { tacticalSprint = false; } + + if (tacticalSprint && player.onGround()) { + PacketDistributor.sendToServer(new TacticalSprintMessage(true)); + } else { + PacketDistributor.sendToServer(new TacticalSprintMessage(false)); + } } /** diff --git a/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java index 849adf464..1f6806107 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/PlayerEventHandler.java @@ -1,5 +1,6 @@ package com.atsuishio.superbwarfare.event; +import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.config.common.GameplayConfig; import com.atsuishio.superbwarfare.init.ModAttachments; import com.atsuishio.superbwarfare.init.ModItems; @@ -11,11 +12,14 @@ import com.atsuishio.superbwarfare.tools.AmmoType; import com.atsuishio.superbwarfare.tools.GunsTool; import com.atsuishio.superbwarfare.tools.InventoryTool; import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.SubscribeEvent; @@ -27,6 +31,9 @@ import net.neoforged.neoforge.network.PacketDistributor; @EventBusSubscriber public class PlayerEventHandler { + + public static final ResourceLocation TACTICAL_SPRINT = Mod.loc("tactical_sprint"); + @SubscribeEvent public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { Player player = event.getEntity(); @@ -71,6 +78,10 @@ public class PlayerEventHandler { if (stack.is(ModTags.Items.GUN)) { handleSpecialWeaponAmmo(player); } + + if (!player.level().isClientSide) { + handleTacticalAttribute(player); + } } private static void handleSpecialWeaponAmmo(Player player) { @@ -176,6 +187,23 @@ public class PlayerEventHandler { } } + public static void handleTacticalAttribute(Player player) { + if (player == null) { + return; + } + var attr = player.getAttribute(Attributes.MOVEMENT_SPEED); + if (attr == null) return; + + if (attr.getModifier(TACTICAL_SPRINT) != null) { + attr.removeModifier(TACTICAL_SPRINT); + } + + if (player.getData(ModAttachments.PLAYER_VARIABLE).tacticalSprint) { + player.setSprinting(true); + attr.addTransientModifier(new AttributeModifier(TACTICAL_SPRINT, 0.25, AttributeModifier.Operation.ADD_MULTIPLIED_BASE)); + } + } + @SubscribeEvent public static void onAnvilUpdate(AnvilUpdateEvent event) { ItemStack left = event.getLeft(); diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/KeyboardInputMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/KeyboardInputMixin.java index 9f5362553..c4c8c1654 100644 --- a/src/main/java/com/atsuishio/superbwarfare/mixins/KeyboardInputMixin.java +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/KeyboardInputMixin.java @@ -1,6 +1,5 @@ package com.atsuishio.superbwarfare.mixins; -import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModMobEffects; import com.atsuishio.superbwarfare.tools.NBTTool; @@ -17,11 +16,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(KeyboardInput.class) public abstract class KeyboardInputMixin extends Input { -// @Shadow -// private static float calculateImpulse(boolean pInput, boolean pOtherInput) { -// return 0; -// } - // 按键修改mixin @Inject(method = "tick", at = @At("RETURN")) public void tick(boolean pIsSneaking, float pSneakingSpeedMultiplier, CallbackInfo ci) { @@ -29,10 +23,6 @@ public abstract class KeyboardInputMixin extends Input { Player player = mc.player; if (player == null) return; - if (ClientEventHandler.tacticalSprint && player.onGround()) { - this.forwardImpulse *= 2f; - } - ItemStack stack = player.getMainHandItem(); var tag = NBTTool.getTag(stack); diff --git a/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java b/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java index b2b4da936..84e3abbe3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java @@ -54,5 +54,6 @@ public class NetworkRegistry { registrar.playToServer(AdjustMortarAngleMessage.TYPE, AdjustMortarAngleMessage.STREAM_CODEC, AdjustMortarAngleMessage::handler); registrar.playToServer(ChangeVehicleSeatMessage.TYPE, ChangeVehicleSeatMessage.STREAM_CODEC, ChangeVehicleSeatMessage::handler); registrar.playToServer(ShowChargingRangeMessage.TYPE, ShowChargingRangeMessage.STREAM_CODEC, ShowChargingRangeMessage::handler); + registrar.playToServer(TacticalSprintMessage.TYPE, TacticalSprintMessage.STREAM_CODEC, TacticalSprintMessage::handler); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/TacticalSprintMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/TacticalSprintMessage.java new file mode 100644 index 000000000..90e17fa09 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/TacticalSprintMessage.java @@ -0,0 +1,33 @@ +package com.atsuishio.superbwarfare.network.message.send; + +import com.atsuishio.superbwarfare.Mod; +import com.atsuishio.superbwarfare.init.ModAttachments; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import org.jetbrains.annotations.NotNull; + +public record TacticalSprintMessage(boolean sprint) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(Mod.loc("vehicle_fire")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.BOOL, + TacticalSprintMessage::sprint, + TacticalSprintMessage::new + ); + + public static void handler(TacticalSprintMessage message, final IPayloadContext context) { + var player = context.player(); + + var cap = player.getData(ModAttachments.PLAYER_VARIABLE).watch(); + cap.tacticalSprint = message.sprint; + cap.sync(player); + } + + @Override + public @NotNull Type type() { + return TYPE; + } +}