Fixed Items and XP not dropping on kill

This commit is contained in:
IM23a-spirgif
2025-04-28 13:32:04 +02:00
parent 48f3e5a28b
commit 76c09aa1c8
4 changed files with 21 additions and 15 deletions
@@ -2,6 +2,8 @@ package net.fretux.knockedback;
import com.mojang.logging.LogUtils; import com.mojang.logging.LogUtils;
import net.fretux.knockedback.effects.KnockedEffect; 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.common.MinecraftForge;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent;
@@ -40,7 +42,8 @@ public class KnockedBack {
@SubscribeEvent @SubscribeEvent
public void onLivingDeath(LivingDeathEvent event) { 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); event.setCanceled(true);
} }
} }
@@ -65,8 +65,8 @@ public class KnockedManager {
Map.Entry<UUID, Integer> entry = it.next(); Map.Entry<UUID, Integer> entry = it.next();
UUID playerId = entry.getKey(); UUID playerId = entry.getKey();
int timeLeft = entry.getValue(); int timeLeft = entry.getValue();
if ( grippedEntities.contains(playerId) if (grippedEntities.contains(playerId)
|| CarryManager.isBeingCarried(playerId) ) { || CarryManager.isBeingCarried(playerId)) {
ServerPlayer p = NetworkHandlerHelper.getPlayerByUuid(server, playerId); ServerPlayer p = NetworkHandlerHelper.getPlayerByUuid(server, playerId);
if (p != null) { if (p != null) {
NetworkHandler.CHANNEL.send( NetworkHandler.CHANNEL.send(
@@ -113,16 +113,17 @@ public class KnockedManager {
@SubscribeEvent @SubscribeEvent
public static void onLivingHurt(LivingHurtEvent event) { public static void onLivingHurt(LivingHurtEvent event) {
LivingEntity entity = event.getEntity(); LivingEntity entity = event.getEntity();
DamageSource source = event.getSource(); if (!(entity instanceof Player player)) {
String damageType = source.getMsgId(); return;
boolean isFatal = entity.getHealth() - event.getAmount() <= 0; }
DamageSource src = event.getSource();
String damageType = src.getMsgId();
boolean isFatal = player.getHealth() - event.getAmount() <= 0;
if (!isKnocked(entity)) { if (!isKnocked(entity)) {
if (entity instanceof Player player && isFatal) { if (isFatal) {
if (!(damageType.equals("fall") || damageType.equals("explosion") || damageType.equals("explosion.player") || if (src.getEntity() instanceof LivingEntity) {
damageType.equals("fire") || damageType.equals("lava") || damageType.equals("onFire") ||
damageType.equals("fireball"))) {
event.setCanceled(true); event.setCanceled(true);
applyKnockedState(player); applyKnockedState(entity);
} }
} }
return; return;
@@ -27,6 +27,7 @@ public class MobKillHandler {
private static class KillAttempt { private static class KillAttempt {
private final UUID mobUuid; private final UUID mobUuid;
private int timeLeft; private int timeLeft;
public KillAttempt(UUID mobUuid, int timeLeft) { public KillAttempt(UUID mobUuid, int timeLeft) {
this.mobUuid = mobUuid; this.mobUuid = mobUuid;
this.timeLeft = timeLeft; this.timeLeft = timeLeft;
@@ -124,7 +125,7 @@ public class MobKillHandler {
private void executeKnockedPlayer(Player knocked, Mob mob) { private void executeKnockedPlayer(Player knocked, Mob mob) {
removeKnockedState(knocked); removeKnockedState(knocked);
knocked.setHealth(0.0F); knocked.kill();
mob.getNavigation().stop(); mob.getNavigation().stop();
if (knocked instanceof ServerPlayer sp) { if (knocked instanceof ServerPlayer sp) {
NetworkHandler.CHANNEL.send( NetworkHandler.CHANNEL.send(
@@ -142,8 +143,8 @@ public class MobKillHandler {
if (!(p.level() instanceof ServerLevel world)) return null; if (!(p.level() instanceof ServerLevel world)) return null;
double r = 2.5; double r = 2.5;
AABB box = new AABB( 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() return world.getEntitiesOfClass(Mob.class, box).stream()
.filter(m -> isHostile(m) || isAggressiveNeutral(m)) .filter(m -> isHostile(m) || isAggressiveNeutral(m))
@@ -153,6 +154,7 @@ public class MobKillHandler {
private boolean isHostile(Mob m) { private boolean isHostile(Mob m) {
return m instanceof net.minecraft.world.entity.monster.Monster; return m instanceof net.minecraft.world.entity.monster.Monster;
} }
private boolean isAggressiveNeutral(Mob m) { 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.animal.Wolf w) return w.isAngry();
if (m instanceof net.minecraft.world.entity.monster.EnderMan e) return e.isCreepy(); if (m instanceof net.minecraft.world.entity.monster.EnderMan e) return e.isCreepy();
@@ -117,7 +117,7 @@ public class PlayerExecutionHandler {
public static void executeKnockedPlayer(ServerPlayer executor, LivingEntity knockedPlayer) { public static void executeKnockedPlayer(ServerPlayer executor, LivingEntity knockedPlayer) {
KnockedManager.removeKnockedState(knockedPlayer); KnockedManager.removeKnockedState(knockedPlayer);
knockedPlayer.setHealth(0.0F); knockedPlayer.kill();
executor.sendSystemMessage(Component.literal("You executed " + knockedPlayer.getName().getString() + "!")); executor.sendSystemMessage(Component.literal("You executed " + knockedPlayer.getName().getString() + "!"));
if (knockedPlayer instanceof ServerPlayer serverPlayer) { if (knockedPlayer instanceof ServerPlayer serverPlayer) {
serverPlayer.sendSystemMessage(Component.literal("You were executed by " + executor.getName().getString() + "!")); serverPlayer.sendSystemMessage(Component.literal("You were executed by " + executor.getName().getString() + "!"));