diff --git a/src/main/java/net/fretux/knockedback/KnockedBack.java b/src/main/java/net/fretux/knockedback/KnockedBack.java index 264808a..588962c 100644 --- a/src/main/java/net/fretux/knockedback/KnockedBack.java +++ b/src/main/java/net/fretux/knockedback/KnockedBack.java @@ -2,6 +2,8 @@ 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; @@ -40,7 +42,8 @@ public class KnockedBack { @SubscribeEvent public void onLivingDeath(LivingDeathEvent event) { - if (KnockedManager.isKnocked(event.getEntity())) { + LivingEntity victim = event.getEntity(); + if (victim instanceof Player player && KnockedManager.isKnocked(player)) { event.setCanceled(true); } } diff --git a/src/main/java/net/fretux/knockedback/KnockedManager.java b/src/main/java/net/fretux/knockedback/KnockedManager.java index 0762d69..5177f32 100644 --- a/src/main/java/net/fretux/knockedback/KnockedManager.java +++ b/src/main/java/net/fretux/knockedback/KnockedManager.java @@ -65,8 +65,8 @@ public class KnockedManager { Map.Entry entry = it.next(); UUID playerId = entry.getKey(); int timeLeft = entry.getValue(); - if ( grippedEntities.contains(playerId) - || CarryManager.isBeingCarried(playerId) ) { + if (grippedEntities.contains(playerId) + || CarryManager.isBeingCarried(playerId)) { ServerPlayer p = NetworkHandlerHelper.getPlayerByUuid(server, playerId); if (p != null) { NetworkHandler.CHANNEL.send( @@ -113,16 +113,17 @@ public class KnockedManager { @SubscribeEvent public static void onLivingHurt(LivingHurtEvent event) { LivingEntity entity = event.getEntity(); - DamageSource source = event.getSource(); - String damageType = source.getMsgId(); - boolean isFatal = entity.getHealth() - event.getAmount() <= 0; + if (!(entity instanceof Player player)) { + return; + } + DamageSource src = event.getSource(); + String damageType = src.getMsgId(); + boolean isFatal = player.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"))) { + if (isFatal) { + if (src.getEntity() instanceof LivingEntity) { event.setCanceled(true); - applyKnockedState(player); + applyKnockedState(entity); } } return; diff --git a/src/main/java/net/fretux/knockedback/MobKillHandler.java b/src/main/java/net/fretux/knockedback/MobKillHandler.java index e761c86..a5f0c04 100644 --- a/src/main/java/net/fretux/knockedback/MobKillHandler.java +++ b/src/main/java/net/fretux/knockedback/MobKillHandler.java @@ -27,6 +27,7 @@ public class MobKillHandler { private static class KillAttempt { private final UUID mobUuid; private int timeLeft; + public KillAttempt(UUID mobUuid, int timeLeft) { this.mobUuid = mobUuid; this.timeLeft = timeLeft; @@ -124,7 +125,7 @@ public class MobKillHandler { private void executeKnockedPlayer(Player knocked, Mob mob) { removeKnockedState(knocked); - knocked.setHealth(0.0F); + knocked.kill(); mob.getNavigation().stop(); if (knocked instanceof ServerPlayer sp) { NetworkHandler.CHANNEL.send( @@ -142,8 +143,8 @@ public class MobKillHandler { if (!(p.level() instanceof ServerLevel world)) return null; double r = 2.5; AABB box = new AABB( - p.getX()-r, p.getY()-r, p.getZ()-r, - p.getX()+r, p.getY()+r, p.getZ()+r + p.getX() - r, p.getY() - r, p.getZ() - r, + p.getX() + r, p.getY() + r, p.getZ() + r ); return world.getEntitiesOfClass(Mob.class, box).stream() .filter(m -> isHostile(m) || isAggressiveNeutral(m)) @@ -153,6 +154,7 @@ public class MobKillHandler { private boolean isHostile(Mob m) { return m instanceof net.minecraft.world.entity.monster.Monster; } + private boolean isAggressiveNeutral(Mob m) { if (m instanceof net.minecraft.world.entity.animal.Wolf w) return w.isAngry(); if (m instanceof net.minecraft.world.entity.monster.EnderMan e) return e.isCreepy(); diff --git a/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java b/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java index 8134ec7..5b181cd 100644 --- a/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java +++ b/src/main/java/net/fretux/knockedback/PlayerExecutionHandler.java @@ -117,7 +117,7 @@ public class PlayerExecutionHandler { public static void executeKnockedPlayer(ServerPlayer executor, LivingEntity knockedPlayer) { KnockedManager.removeKnockedState(knockedPlayer); - knockedPlayer.setHealth(0.0F); + knockedPlayer.kill(); executor.sendSystemMessage(Component.literal("You executed " + knockedPlayer.getName().getString() + "!")); if (knockedPlayer instanceof ServerPlayer serverPlayer) { serverPlayer.sendSystemMessage(Component.literal("You were executed by " + executor.getName().getString() + "!"));