From 3d3ee83336afcb40c827a5536da1e276b98aa070 Mon Sep 17 00:00:00 2001 From: IM23a-spirgif Date: Tue, 1 Apr 2025 17:22:55 +0200 Subject: [PATCH] Damage resets knocked times now properly --- .../java/net/fretux/knockedback/Config.java | 2 -- .../net/fretux/knockedback/KnockedBack.java | 14 ---------- .../fretux/knockedback/KnockedManager.java | 27 +++++++++++-------- .../fretux/knockedback/KnockedTimePacket.java | 5 ---- .../knockedback/PlayerExecutionHandler.java | 1 - .../knockedback/effects/KnockedEffect.java | 1 + 6 files changed, 17 insertions(+), 33 deletions(-) diff --git a/src/main/java/net/fretux/knockedback/Config.java b/src/main/java/net/fretux/knockedback/Config.java index a925af6..dd7ca18 100644 --- a/src/main/java/net/fretux/knockedback/Config.java +++ b/src/main/java/net/fretux/knockedback/Config.java @@ -51,8 +51,6 @@ public class Config logDirtBlock = LOG_DIRT_BLOCK.get(); magicNumber = MAGIC_NUMBER.get(); magicNumberIntroduction = MAGIC_NUMBER_INTRODUCTION.get(); - - // convert the list of strings into a set of items items = ITEM_STRINGS.get().stream() .map(itemName -> ForgeRegistries.ITEMS.getValue(new ResourceLocation(itemName))) .collect(Collectors.toSet()); diff --git a/src/main/java/net/fretux/knockedback/KnockedBack.java b/src/main/java/net/fretux/knockedback/KnockedBack.java index 63002d8..d3c8326 100644 --- a/src/main/java/net/fretux/knockedback/KnockedBack.java +++ b/src/main/java/net/fretux/knockedback/KnockedBack.java @@ -41,20 +41,6 @@ public class KnockedBack { LOGGER.info("KnockedBack mod server starting"); } - @SubscribeEvent - public void onLivingHurt(LivingHurtEvent event) { - DamageSource source = event.getSource(); - String damageType = source.getMsgId(); - if (event.getEntity() instanceof Player player && player.getHealth() - event.getAmount() <= 0) { - if (!(damageType.equals("fall") || damageType.equals("explosion") || damageType.equals("explosion.player") || - damageType.equals("fire") || damageType.equals("lava") || damageType.equals("onFire") || - damageType.equals("fireball"))) { - event.setCanceled(true); - KnockedManager.applyKnockedState(player); - } - } - } - @SubscribeEvent public void onLivingDeath(LivingDeathEvent event) { if (KnockedManager.isKnocked(event.getEntity())) { diff --git a/src/main/java/net/fretux/knockedback/KnockedManager.java b/src/main/java/net/fretux/knockedback/KnockedManager.java index 8a47ad7..c8dcbd6 100644 --- a/src/main/java/net/fretux/knockedback/KnockedManager.java +++ b/src/main/java/net/fretux/knockedback/KnockedManager.java @@ -56,13 +56,10 @@ public class KnockedManager { Map.Entry entry = it.next(); UUID entityId = entry.getKey(); int timeLeft = entry.getValue(); - - // If the player is gripped, force the timer to 0 if (grippedEntities.contains(entityId)) { entry.setValue(0); timeLeft = 0; } else { - // If not gripped, decrease normally timeLeft--; if (timeLeft <= 0) { it.remove(); @@ -71,8 +68,6 @@ public class KnockedManager { entry.setValue(timeLeft); } } - - // Send the updated time to the knocked player ServerPlayer knockedPlayer = NetworkHandlerHelper.getPlayerByUuid( net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(), entityId); if (knockedPlayer != null) { @@ -85,13 +80,23 @@ public class KnockedManager { @SubscribeEvent public static void onLivingHurt(LivingHurtEvent event) { LivingEntity entity = event.getEntity(); - if (!isKnocked(entity)) return; - knockedEntities.put(entity.getUUID(), KNOCKED_DURATION); - DamageSource source = event.getSource(); String damageType = source.getMsgId(); - // Handle lethal damage cases (fire, explosions, etc.) + boolean isFatal = entity.getHealth() - event.getAmount() <= 0; + + if (!isKnocked(entity)) { + if (entity instanceof Player player && isFatal) { + if (!(damageType.equals("fall") || damageType.equals("explosion") || damageType.equals("explosion.player") || + damageType.equals("fire") || damageType.equals("lava") || damageType.equals("onFire") || + damageType.equals("fireball"))) { + event.setCanceled(true); + applyKnockedState(player); + } + } + return; + } + knockedEntities.put(entity.getUUID(), KNOCKED_DURATION); if (damageType.equals("fire") || damageType.equals("lava") || damageType.equals("onFire") || damageType.equals("explosion") || damageType.equals("explosion.player") || damageType.equals("fireball")) { entity.setHealth(0.0F); @@ -99,13 +104,13 @@ public class KnockedManager { return; } - // Handle falling or lethal explosion if ((damageType.equals("fall") || damageType.equals("explosion") || damageType.equals("explosion.player")) && event.getAmount() >= entity.getHealth()) { entity.setHealth(0.0F); - removeKnockedState(entity); + removeKnockedState(entity); return; } + event.setCanceled(true); } } \ No newline at end of file diff --git a/src/main/java/net/fretux/knockedback/KnockedTimePacket.java b/src/main/java/net/fretux/knockedback/KnockedTimePacket.java index fd0985b..0038ec1 100644 --- a/src/main/java/net/fretux/knockedback/KnockedTimePacket.java +++ b/src/main/java/net/fretux/knockedback/KnockedTimePacket.java @@ -7,22 +7,17 @@ import java.util.function.Supplier; public class KnockedTimePacket { private final int timeLeft; - public KnockedTimePacket(int timeLeft) { this.timeLeft = timeLeft; } - public static void encode(KnockedTimePacket packet, FriendlyByteBuf buf) { buf.writeInt(packet.timeLeft); } - public static KnockedTimePacket decode(FriendlyByteBuf buf) { return new KnockedTimePacket(buf.readInt()); } - public static void handle(KnockedTimePacket packet, Supplier ctx) { ctx.get().enqueueWork(() -> { - // Client side: update the client state with the time left. ClientKnockedState.setTimeLeft(packet.timeLeft); }); ctx.get().setPacketHandled(true); diff --git a/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java b/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java index 28a0f92..ef686fc 100644 --- a/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java +++ b/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java @@ -11,7 +11,6 @@ import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; @Mod.EventBusSubscriber(modid = "knockedback", bus = Mod.EventBusSubscriber.Bus.MOD) public class PlayerExecutionHandler { public static final double EXECUTION_RANGE = 2.0; - public static void register() { MinecraftForge.EVENT_BUS.register(new PlayerExecutionHandler()); } diff --git a/src/main/java/net/fretux/knockedback/effects/KnockedEffect.java b/src/main/java/net/fretux/knockedback/effects/KnockedEffect.java index 4d19f09..b584c24 100644 --- a/src/main/java/net/fretux/knockedback/effects/KnockedEffect.java +++ b/src/main/java/net/fretux/knockedback/effects/KnockedEffect.java @@ -19,6 +19,7 @@ public class KnockedEffect { player.setDeltaMovement(0, 0, 0); player.setSprinting(false); player.hurtMarked = true; + player.setNoGravity(false); } }