From 25d0ae52294c7f30ba5c0071715dd73d79dc1c6d Mon Sep 17 00:00:00 2001 From: fretuks Date: Wed, 20 May 2026 13:42:33 +0200 Subject: [PATCH] refactor execution handling and add missing validation checks --- .../net/fretux/knockedback/CarryManager.java | 4 +++- .../knockedback/ExecuteKnockedPacket.java | 6 ++++-- .../net/fretux/knockedback/KnockedBack.java | 11 +++------- .../fretux/knockedback/MobKillHandler.java | 2 -- .../fretux/knockedback/NetworkHandler.java | 2 +- .../knockedback/PlayerExecutionHandler.java | 20 +++++++++---------- .../assets/knockedback/lang/de_de.json | 1 + .../assets/knockedback/lang/en_us.json | 3 ++- 8 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/main/java/net/fretux/knockedback/CarryManager.java b/src/main/java/net/fretux/knockedback/CarryManager.java index ee66aa9..2482513 100644 --- a/src/main/java/net/fretux/knockedback/CarryManager.java +++ b/src/main/java/net/fretux/knockedback/CarryManager.java @@ -41,7 +41,9 @@ public class CarryManager { .getCommandSenderWorld() .getEntitiesOfClass(Player.class, box).stream() .filter(p -> KnockedManager.isKnocked(p) - && !p.getUUID().equals(carrier.getUUID())) + && !p.getUUID().equals(carrier.getUUID()) + && !isBeingCarried(p.getUUID()) + && !PlayerExecutionHandler.isBeingPlayerExecuted(p.getUUID())) .findFirst() .orElse(null); } diff --git a/src/main/java/net/fretux/knockedback/ExecuteKnockedPacket.java b/src/main/java/net/fretux/knockedback/ExecuteKnockedPacket.java index 07ce0e9..afc9bb3 100644 --- a/src/main/java/net/fretux/knockedback/ExecuteKnockedPacket.java +++ b/src/main/java/net/fretux/knockedback/ExecuteKnockedPacket.java @@ -28,7 +28,9 @@ public class ExecuteKnockedPacket { if (target instanceof Player tp) { UUID tid = tp.getUUID(); if (PlayerExecutionHandler.isBeingPlayerExecuted(tid)) { - PlayerExecutionHandler.cancelExecution(tid); + if (PlayerExecutionHandler.isExecutingTarget(executor.getUUID(), tid)) { + PlayerExecutionHandler.cancelExecution(tid); + } } else { PlayerExecutionHandler.startExecution(executor, tp); } @@ -47,4 +49,4 @@ public class ExecuteKnockedPacket { .findFirst() .orElse(null); } -} \ No newline at end of file +} diff --git a/src/main/java/net/fretux/knockedback/KnockedBack.java b/src/main/java/net/fretux/knockedback/KnockedBack.java index 1f2225c..ad027e5 100644 --- a/src/main/java/net/fretux/knockedback/KnockedBack.java +++ b/src/main/java/net/fretux/knockedback/KnockedBack.java @@ -1,14 +1,12 @@ package net.fretux.knockedback; import com.mojang.logging.LogUtils; -import net.fretux.knockedback.effects.KnockedEffect; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.event.server.ServerStartingEvent; import net.minecraftforge.fml.config.ModConfig; @@ -22,18 +20,15 @@ public class KnockedBack { public static final String MOD_ID = "knockedback"; private static final Logger LOGGER = LogUtils.getLogger(); - public KnockedBack() { - ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Config.COMMON_SPEC); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); + public KnockedBack(FMLJavaModLoadingContext context) { + context.registerConfig(ModConfig.Type.COMMON, Config.COMMON_SPEC); + context.getModEventBus().addListener(this::setup); MinecraftForge.EVENT_BUS.register(this); - MinecraftForge.EVENT_BUS.register(new KnockedEffect()); MinecraftForge.EVENT_BUS.register(new MobKillHandler()); - MinecraftForge.EVENT_BUS.register(new PlayerExecutionHandler()); } private void setup(final FMLCommonSetupEvent event) { NetworkHandler.register(); - PlayerExecutionHandler.register(); } @SubscribeEvent diff --git a/src/main/java/net/fretux/knockedback/MobKillHandler.java b/src/main/java/net/fretux/knockedback/MobKillHandler.java index 78843dc..0ee68d7 100644 --- a/src/main/java/net/fretux/knockedback/MobKillHandler.java +++ b/src/main/java/net/fretux/knockedback/MobKillHandler.java @@ -11,7 +11,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.registries.ForgeRegistries; @@ -21,7 +20,6 @@ import java.util.*; import static net.fretux.knockedback.KnockedManager.removeKnockedState; import static net.fretux.knockedback.KnockedManager.setGripped; -@Mod.EventBusSubscriber(modid = KnockedBack.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) public class MobKillHandler { public static int getExecutionTime() { return Config.COMMON.executionTime.get(); diff --git a/src/main/java/net/fretux/knockedback/NetworkHandler.java b/src/main/java/net/fretux/knockedback/NetworkHandler.java index a80b979..9f33c2b 100644 --- a/src/main/java/net/fretux/knockedback/NetworkHandler.java +++ b/src/main/java/net/fretux/knockedback/NetworkHandler.java @@ -8,7 +8,7 @@ public class NetworkHandler { public static final String PROTOCOL_VERSION = "1"; public static SimpleChannel CHANNEL; public static void register() { - CHANNEL = NetworkRegistry.newSimpleChannel(new ResourceLocation(KnockedBack.MOD_ID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals); + CHANNEL = NetworkRegistry.newSimpleChannel(ResourceLocation.fromNamespaceAndPath(KnockedBack.MOD_ID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals); int id = 0; CHANNEL.registerMessage(id++, ExecuteKnockedPacket.class, ExecuteKnockedPacket::encode, ExecuteKnockedPacket::decode, ExecuteKnockedPacket::handle); CHANNEL.registerMessage(id++, KnockedTimePacket.class, KnockedTimePacket::encode, KnockedTimePacket::decode, KnockedTimePacket::handle); diff --git a/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java b/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java index 8ae1629..269d934 100644 --- a/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java +++ b/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java @@ -6,7 +6,6 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent; @@ -34,6 +33,11 @@ public class PlayerExecutionHandler { return executionAttempts.values().stream().anyMatch(attempt -> attempt.executorUuid.equals(playerUuid)); } + public static boolean isExecutingTarget(UUID executorId, UUID knockedId) { + PlayerExecutionAttempt attempt = executionAttempts.get(knockedId); + return attempt != null && attempt.executorUuid.equals(executorId); + } + @SubscribeEvent public static void onPlayerTick(TickEvent.PlayerTickEvent event) { if (event.side.isServer() && event.phase == TickEvent.Phase.END && event.player instanceof ServerPlayer sp && isExecuting(sp.getUUID())) { @@ -61,19 +65,15 @@ public class PlayerExecutionHandler { } } - public static void register() { - MinecraftForge.EVENT_BUS.register(new PlayerExecutionHandler()); - } - public static void startExecution(ServerPlayer executor, Player target) { if (KnockedManager.isKnocked(executor)) { - executor.sendSystemMessage(Component.translatable("message.knockedback.cannot_carry_while_knocked")); + executor.sendSystemMessage(Component.translatable("message.knockedback.cannot_execute_while_knocked")); return; } UUID knockedId = target.getUUID(); if (!KnockedManager.isKnocked(target)) return; if (CarryManager.isBeingCarried(target.getUUID())) { - executor.sendSystemMessage(Component.translatable("message.knockedback.cannot_execute_while_knocked")); + executor.sendSystemMessage(Component.translatable("message.knockedback.cannot_execute_carried_player")); return; } if (executionAttempts.containsKey(knockedId)) return; @@ -124,8 +124,8 @@ public class PlayerExecutionHandler { public static void executeKnockedPlayer(ServerPlayer executor, LivingEntity knockedPlayer) { UUID id = knockedPlayer.getUUID(); + executionAttempts.remove(id); KnockedManager.removeKnockedState(knockedPlayer); - cancelExecution(id); KnockedManager.markKillInProgress(knockedPlayer); knockedPlayer.kill(); KnockedManager.unmarkKillInProgress(knockedPlayer); @@ -139,9 +139,9 @@ public class PlayerExecutionHandler { new ExecutionProgressPacket(0, null) ); } - executor.sendSystemMessage(Component.translatable("message.knockedback.you_executed", knockedPlayer.getDisplayName(), "!")); + executor.sendSystemMessage(Component.translatable("message.knockedback.you_executed", knockedPlayer.getDisplayName())); if (knockedPlayer instanceof ServerPlayer serverPlayer) { - serverPlayer.sendSystemMessage(Component.translatable("message.knockedback.you_were_executed", executor.getDisplayName(), "!")); + serverPlayer.sendSystemMessage(Component.translatable("message.knockedback.you_were_executed", executor.getDisplayName())); } } diff --git a/src/main/resources/assets/knockedback/lang/de_de.json b/src/main/resources/assets/knockedback/lang/de_de.json index caee08b..1c8ee8a 100644 --- a/src/main/resources/assets/knockedback/lang/de_de.json +++ b/src/main/resources/assets/knockedback/lang/de_de.json @@ -5,6 +5,7 @@ "message.knockedback.cannot_carry_while_knocked": "Du kannst niemanden tragen, während du betäubt bist!", "message.knockedback.cannot_execute_while_knocked": "Du kannst niemanden hinrichten, während du betäubt bist!", + "message.knockedback.cannot_execute_carried_player": "Du kannst keinen Spieler hinrichten, der getragen wird!", "message.knockedback.execution_started": "Hinrichtung gestartet...", "message.knockedback.being_executed": "Du wirst hingerichtet!", diff --git a/src/main/resources/assets/knockedback/lang/en_us.json b/src/main/resources/assets/knockedback/lang/en_us.json index 3cb7d35..4c4b367 100644 --- a/src/main/resources/assets/knockedback/lang/en_us.json +++ b/src/main/resources/assets/knockedback/lang/en_us.json @@ -4,6 +4,7 @@ "key.categories.knockedback": "Knockedback Controls", "message.knockedback.cannot_carry_while_knocked": "You cannot carry others while you are knocked!", "message.knockedback.cannot_execute_while_knocked": "You cannot execute others while you are knocked!", + "message.knockedback.cannot_execute_carried_player": "You cannot execute a player who is being carried!", "message.knockedback.picked_up": "Picked up %s", "message.knockedback.being_carried": "You are being carried by %s", "message.knockedback.dropped": "Dropped %s", @@ -16,4 +17,4 @@ "message.knockedback.you_were_executed": "You were executed by %s!", "overlay.knockedback.recovery_time": "Time until recovery: %s s", "death.attack.knockedback_execution": "%1$s was executed mercilessly." -} \ No newline at end of file +}