From 94fc6f79c6066c5b42971277bc55c27a091214b7 Mon Sep 17 00:00:00 2001 From: Fretux Date: Wed, 7 Jan 2026 18:14:25 +0100 Subject: [PATCH] Allow execution animation on other clients --- .../knockedback/ExecutionProgressPacket.java | 17 ++++++++++++++--- .../fretux/knockedback/KnockedManager.java | 2 +- .../fretux/knockedback/MobKillHandler.java | 10 +++++----- .../knockedback/PlayerExecutionHandler.java | 18 ++++++++++++------ .../client/ClientExecutionState.java | 14 ++++++++++++-- .../client/PlayerAnimationHandler.java | 19 ++++++++++--------- 6 files changed, 54 insertions(+), 26 deletions(-) diff --git a/src/main/java/net/fretux/knockedback/ExecutionProgressPacket.java b/src/main/java/net/fretux/knockedback/ExecutionProgressPacket.java index d9ba472..2ac70c6 100644 --- a/src/main/java/net/fretux/knockedback/ExecutionProgressPacket.java +++ b/src/main/java/net/fretux/knockedback/ExecutionProgressPacket.java @@ -3,26 +3,37 @@ package net.fretux.knockedback; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; +import javax.annotation.Nullable; +import java.util.UUID; import java.util.function.Supplier; public class ExecutionProgressPacket { private final int timeLeft; + @Nullable + private final UUID executorId; - public ExecutionProgressPacket(int timeLeft) { + public ExecutionProgressPacket(int timeLeft, @Nullable UUID executorId) { this.timeLeft = timeLeft; + this.executorId = executorId; } public static void encode(ExecutionProgressPacket msg, FriendlyByteBuf buf) { buf.writeInt(msg.timeLeft); + buf.writeBoolean(msg.executorId != null); + if (msg.executorId != null) { + buf.writeUUID(msg.executorId); + } } public static ExecutionProgressPacket decode(FriendlyByteBuf buf) { - return new ExecutionProgressPacket(buf.readInt()); + int timeLeft = buf.readInt(); + UUID executorId = buf.readBoolean() ? buf.readUUID() : null; + return new ExecutionProgressPacket(timeLeft, executorId); } public static void handle(ExecutionProgressPacket msg, Supplier ctx) { ctx.get().enqueueWork(() -> { - net.fretux.knockedback.client.ClientExecutionState.setTimeLeft(msg.timeLeft); + net.fretux.knockedback.client.ClientExecutionState.setExecution(msg.timeLeft, msg.executorId); }); ctx.get().setPacketHandled(true); } diff --git a/src/main/java/net/fretux/knockedback/KnockedManager.java b/src/main/java/net/fretux/knockedback/KnockedManager.java index b793ef9..fe10c78 100644 --- a/src/main/java/net/fretux/knockedback/KnockedManager.java +++ b/src/main/java/net/fretux/knockedback/KnockedManager.java @@ -215,7 +215,7 @@ public class KnockedManager { ); NetworkHandler.CHANNEL.send( PacketDistributor.PLAYER.with(() -> sp), - new ExecutionProgressPacket(0) + new ExecutionProgressPacket(0, null) ); NetworkHandler.CHANNEL.send( PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> sp), diff --git a/src/main/java/net/fretux/knockedback/MobKillHandler.java b/src/main/java/net/fretux/knockedback/MobKillHandler.java index 65d10ed..13dceff 100644 --- a/src/main/java/net/fretux/knockedback/MobKillHandler.java +++ b/src/main/java/net/fretux/knockedback/MobKillHandler.java @@ -65,7 +65,7 @@ public class MobKillHandler { if (p instanceof ServerPlayer sp) { NetworkHandler.CHANNEL.send( PacketDistributor.PLAYER.with(() -> sp), - new ExecutionProgressPacket(0) + new ExecutionProgressPacket(0, null) ); } setGripped(p, false); @@ -85,7 +85,7 @@ public class MobKillHandler { if (knocked instanceof ServerPlayer sp) { NetworkHandler.CHANNEL.send( PacketDistributor.PLAYER.with(() -> sp), - new ExecutionProgressPacket(0) + new ExecutionProgressPacket(0, null) ); } setGripped(knocked, false); @@ -100,7 +100,7 @@ public class MobKillHandler { if (knocked instanceof ServerPlayer sp) { NetworkHandler.CHANNEL.send( PacketDistributor.PLAYER.with(() -> sp), - new ExecutionProgressPacket(0) + new ExecutionProgressPacket(0, null) ); } setGripped(knocked, false); @@ -114,7 +114,7 @@ public class MobKillHandler { if (knocked instanceof ServerPlayer sp) { NetworkHandler.CHANNEL.send( PacketDistributor.PLAYER.with(() -> sp), - new ExecutionProgressPacket(attempt.timeLeft) + new ExecutionProgressPacket(attempt.timeLeft, null) ); } if (attempt.timeLeft <= 0) { @@ -141,7 +141,7 @@ public class MobKillHandler { if (knocked instanceof ServerPlayer sp) { NetworkHandler.CHANNEL.send( PacketDistributor.PLAYER.with(() -> sp), - new ExecutionProgressPacket(0) + new ExecutionProgressPacket(0, null) ); } } diff --git a/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java b/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java index 836f074..2e78482 100644 --- a/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java +++ b/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java @@ -90,7 +90,7 @@ public class PlayerExecutionHandler { knocked.sendSystemMessage(Component.translatable("message.knockedback.execution_interrupted")); NetworkHandler.CHANNEL.send( PacketDistributor.PLAYER.with(() -> knocked), - new ExecutionProgressPacket(0) + new ExecutionProgressPacket(0, null) ); } ServerPlayer executor = getPlayerByUuid(attempt.executorUuid); @@ -98,7 +98,7 @@ public class PlayerExecutionHandler { executor.sendSystemMessage(Component.translatable("message.knockedback.execution_interrupted_executor")); NetworkHandler.CHANNEL.send( PacketDistributor.PLAYER.with(() -> executor), - new ExecutionProgressPacket(0) + new ExecutionProgressPacket(0, null) ); } } @@ -128,12 +128,12 @@ public class PlayerExecutionHandler { KnockedManager.unmarkKillInProgress(knockedPlayer); NetworkHandler.CHANNEL.send( PacketDistributor.PLAYER.with(() -> executor), - new ExecutionProgressPacket(0) + new ExecutionProgressPacket(0, null) ); if (knockedPlayer instanceof ServerPlayer sp) { NetworkHandler.CHANNEL.send( PacketDistributor.PLAYER.with(() -> sp), - new ExecutionProgressPacket(0) + new ExecutionProgressPacket(0, null) ); } executor.sendSystemMessage(Component.translatable("message.knockedback.you_executed", knockedPlayer.getDisplayName(), "!")); @@ -160,8 +160,14 @@ public class PlayerExecutionHandler { continue; } attempt.timeLeft--; - NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> executor), new ExecutionProgressPacket(attempt.timeLeft)); - NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> knocked), new ExecutionProgressPacket(attempt.timeLeft)); + NetworkHandler.CHANNEL.send( + PacketDistributor.PLAYER.with(() -> executor), + new ExecutionProgressPacket(attempt.timeLeft, attempt.executorUuid) + ); + NetworkHandler.CHANNEL.send( + PacketDistributor.PLAYER.with(() -> knocked), + new ExecutionProgressPacket(attempt.timeLeft, attempt.executorUuid) + ); if (attempt.timeLeft <= 0) { executeKnockedPlayer(executor, knocked); } else { diff --git a/src/main/java/net/fretux/knockedback/client/ClientExecutionState.java b/src/main/java/net/fretux/knockedback/client/ClientExecutionState.java index 2f09762..3ca5c3e 100644 --- a/src/main/java/net/fretux/knockedback/client/ClientExecutionState.java +++ b/src/main/java/net/fretux/knockedback/client/ClientExecutionState.java @@ -1,10 +1,16 @@ package net.fretux.knockedback.client; +import javax.annotation.Nullable; +import java.util.UUID; + public class ClientExecutionState { private static int timeLeft = 0; + @Nullable + private static UUID executorId; - public static void setTimeLeft(int ticks) { + public static void setExecution(int ticks, @Nullable UUID executor) { timeLeft = ticks; + executorId = ticks > 0 ? executor : null; } public static int getTimeLeft() { @@ -14,4 +20,8 @@ public class ClientExecutionState { public static boolean isExecuting() { return timeLeft > 0; } -} \ No newline at end of file + + public static boolean isExecutor(UUID playerId) { + return timeLeft > 0 && executorId != null && executorId.equals(playerId); + } +} diff --git a/src/main/java/net/fretux/knockedback/client/PlayerAnimationHandler.java b/src/main/java/net/fretux/knockedback/client/PlayerAnimationHandler.java index d7942ac..aae522f 100644 --- a/src/main/java/net/fretux/knockedback/client/PlayerAnimationHandler.java +++ b/src/main/java/net/fretux/knockedback/client/PlayerAnimationHandler.java @@ -6,6 +6,7 @@ import dev.kosmx.playerAnim.api.layered.ModifierLayer; import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationAccess; import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationRegistry; import net.fretux.knockedback.KnockedBack; +import net.minecraft.client.Minecraft; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -19,8 +20,8 @@ import java.util.UUID; @Mod.EventBusSubscriber(modid = KnockedBack.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) public class PlayerAnimationHandler { - private static final ResourceLocation GRIP_ANIMATION_ID = - ResourceLocation.fromNamespaceAndPath(KnockedBack.MOD_ID, "animation.model.gripping"); + private static final ResourceLocation EXECUTION_ANIMATION_ID = + ResourceLocation.fromNamespaceAndPath(KnockedBack.MOD_ID, "animation.model.execution"); private static final Map> layers = new HashMap<>(); private static final Map activeStates = new HashMap<>(); @@ -29,17 +30,17 @@ public class PlayerAnimationHandler { if (event.phase != TickEvent.Phase.END) return; if (!(event.player instanceof AbstractClientPlayer player)) return; UUID playerId = player.getUUID(); - boolean shouldGrip = ClientGrippedState.isGripped(playerId); - boolean wasGripping = activeStates.getOrDefault(playerId, false); - if (shouldGrip == wasGripping) return; - activeStates.put(playerId, shouldGrip); + boolean shouldPlayExecution = ClientExecutionState.isExecutor(playerId); + boolean wasPlaying = activeStates.getOrDefault(playerId, false); + if (shouldPlayExecution == wasPlaying) return; + activeStates.put(playerId, shouldPlayExecution); ModifierLayer layer = layers.computeIfAbsent(playerId, id -> { ModifierLayer newLayer = new ModifierLayer<>(); PlayerAnimationAccess.getPlayerAnimLayer(player).addAnimLayer(0, newLayer); return newLayer; }); - if (shouldGrip) { - var animation = PlayerAnimationRegistry.getAnimation(GRIP_ANIMATION_ID); + if (shouldPlayExecution) { + var animation = PlayerAnimationRegistry.getAnimation(EXECUTION_ANIMATION_ID); if (animation != null) { layer.setAnimation(new KeyframeAnimationPlayer(animation)); } @@ -47,4 +48,4 @@ public class PlayerAnimationHandler { layer.setAnimation(null); } } -} \ No newline at end of file +}