From 8000fd40b2b4d4c3cf4e51cf124d015729a01fb6 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Wed, 16 Apr 2025 20:56:06 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=91=BD=E5=90=8DFireMessage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../capability/player/PlayerVariable.java | 11 ++++++++ .../superbwarfare/client/ClickHandler.java | 4 +-- .../item/gun/special/BocekItem.java | 2 +- .../network/NetworkRegistry.java | 2 +- .../{FireMessage.java => FireKeyMessage.java} | 28 ++++++++++--------- 5 files changed, 30 insertions(+), 17 deletions(-) rename src/main/java/com/atsuishio/superbwarfare/network/message/send/{FireMessage.java => FireKeyMessage.java} (89%) 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 fd84bbdd6..5bdbb8d07 100644 --- a/src/main/java/com/atsuishio/superbwarfare/capability/player/PlayerVariable.java +++ b/src/main/java/com/atsuishio/superbwarfare/capability/player/PlayerVariable.java @@ -8,6 +8,7 @@ import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.common.util.INBTSerializable; @@ -18,6 +19,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; @EventBusSubscriber(modid = Mod.MODID) @@ -51,6 +53,15 @@ public class PlayerVariable implements INBTSerializable { return this; } + /** + * 编辑并同步玩家变量 + */ + public void modify(Player player, Consumer consumer) { + watch(); + consumer.accept(this); + sync(player); + } + public CompoundTag writeToNBT() { CompoundTag nbt = new CompoundTag(); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java index 68ddf6008..5560fbe52 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/ClickHandler.java @@ -345,7 +345,7 @@ public class ClickHandler { ClientEventHandler.burstFireAmount = 0; } } else { - PacketDistributor.sendToServer(new FireMessage(0, handTimer, zoom)); + PacketDistributor.sendToServer(new FireKeyMessage(0, handTimer, zoom)); if ((!data.reloading() && !data.charging() && !data.bolt.needed.get()) @@ -365,7 +365,7 @@ public class ClickHandler { } public static void handleWeaponFireRelease() { - PacketDistributor.sendToServer(new FireMessage(1, handTimer, zoom)); + PacketDistributor.sendToServer(new FireKeyMessage(1, handTimer, zoom)); bowPull = false; holdFire = false; holdFireVehicle = false; diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java index 8325cf943..764115c90 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java @@ -40,7 +40,7 @@ import javax.annotation.ParametersAreNonnullByDefault; import java.util.Optional; import java.util.function.Supplier; -import static com.atsuishio.superbwarfare.network.message.send.FireMessage.spawnBullet; +import static com.atsuishio.superbwarfare.network.message.send.FireKeyMessage.spawnBullet; public class BocekItem extends GunItem implements GeoItem, ReleaseSpecialWeapon { diff --git a/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java b/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java index 84e3abbe3..c49ba9611 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java @@ -40,7 +40,7 @@ public class NetworkRegistry { registrar.playToServer(SwitchVehicleWeaponMessage.TYPE, SwitchVehicleWeaponMessage.STREAM_CODEC, SwitchVehicleWeaponMessage::handler); registrar.playToServer(AdjustZoomFovMessage.TYPE, AdjustZoomFovMessage.STREAM_CODEC, AdjustZoomFovMessage::handler); registrar.playToServer(SwitchScopeMessage.TYPE, SwitchScopeMessage.STREAM_CODEC, SwitchScopeMessage::handler); - registrar.playToServer(FireMessage.TYPE, FireMessage.STREAM_CODEC, FireMessage::handler); + registrar.playToServer(FireKeyMessage.TYPE, FireKeyMessage.STREAM_CODEC, FireKeyMessage::handler); registrar.playToServer(ReloadMessage.TYPE, ReloadMessage.STREAM_CODEC, ReloadMessage::handler); registrar.playToServer(FireModeMessage.TYPE, FireModeMessage.STREAM_CODEC, FireModeMessage::handler); registrar.playToServer(PlayerStopRidingMessage.TYPE, PlayerStopRidingMessage.STREAM_CODEC, PlayerStopRidingMessage::handler); diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireKeyMessage.java similarity index 89% rename from src/main/java/com/atsuishio/superbwarfare/network/message/send/FireMessage.java rename to src/main/java/com/atsuishio/superbwarfare/network/message/send/FireKeyMessage.java index 868e36506..bcbca65d0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/FireKeyMessage.java @@ -25,21 +25,24 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -public record FireMessage(int msgType, double power, boolean zoom) implements CustomPacketPayload { - public static final Type TYPE = new Type<>(Mod.loc("fire")); +/** + * 开火按键按下/松开时的处理 + */ +public record FireKeyMessage(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( + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.INT, - FireMessage::msgType, + FireKeyMessage::msgType, ByteBufCodecs.DOUBLE, - FireMessage::power, + FireKeyMessage::power, ByteBufCodecs.BOOL, - FireMessage::zoom, - FireMessage::new + FireKeyMessage::zoom, + FireKeyMessage::new ); - public static void handler(FireMessage message, final IPayloadContext context) { + public static void handler(FireKeyMessage message, final IPayloadContext context) { pressAction(context.player(), message.msgType, message.power, message.zoom); } @@ -51,25 +54,24 @@ public record FireMessage(int msgType, double power, boolean zoom) implements Cu handleGunBolt(player, stack); - var cap = player.getData(ModAttachments.PLAYER_VARIABLE).watch(); if (type == 0) { if (data.reload.prepareTimer.get() == 0 && data.reloading() && data.ammo.get() > 0) { data.forceStop.set(true); } - cap.edit = false; + player.getData(ModAttachments.PLAYER_VARIABLE).modify(player, cap -> cap.edit = false); // 按下开火 - if (!(stack.getItem() instanceof ReleaseSpecialWeapon releaseSpecialWeapon)) return; - releaseSpecialWeapon.fireOnPress(player, data, zoom); + if (stack.getItem() instanceof ReleaseSpecialWeapon releaseSpecialWeapon) { + releaseSpecialWeapon.fireOnPress(player, data, zoom); + } } else if (type == 1) { // 松开开火 if (stack.getItem() instanceof ReleaseSpecialWeapon releaseSpecialWeapon) { releaseSpecialWeapon.fireOnRelease(player, data, power, zoom); } } - cap.sync(player); data.save(); }