From f29343931fa29ebebed47c3721d2b275ccc66e4d Mon Sep 17 00:00:00 2001 From: PseudoKnight Date: Sun, 11 Feb 2024 23:14:07 -0800 Subject: [PATCH] Fix pkill() on latest 1.20.4 builds This does now cause a damage event that is cancellable. It also changes the damage cause from CUSTOM to KILL, but this is appropriate and in line with other changes, as KILL didn't previously exist. --- .../bukkit/entities/BukkitMCLivingEntity.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCLivingEntity.java b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCLivingEntity.java index 963a8897f..9b3870a73 100644 --- a/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCLivingEntity.java +++ b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCLivingEntity.java @@ -1,5 +1,6 @@ package com.laytonsmith.abstraction.bukkit.entities; +import com.laytonsmith.PureUtilities.Common.ReflectionUtils; import com.laytonsmith.abstraction.MCAttributeModifier; import com.laytonsmith.abstraction.MCEntity; import com.laytonsmith.abstraction.MCEntityEquipment; @@ -26,11 +27,14 @@ import org.bukkit.attribute.AttributeInstance; import org.bukkit.attribute.AttributeModifier; import org.bukkit.block.Block; +import org.bukkit.damage.DamageSource; +import org.bukkit.damage.DamageType; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Mob; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.util.BlockIterator; @@ -346,8 +350,16 @@ public void setTarget(MCLivingEntity target, Target t) { @Override public void kill() { - le.setLastDamageCause(new EntityDamageEvent(le, EntityDamageEvent.DamageCause.CUSTOM, le.getHealth())); - le.setHealth(0D); + try { + le.damage(le.getHealth(), DamageSource.builder(DamageType.GENERIC_KILL).build()); + } catch (NoClassDefFoundError | NoSuchMethodError ex) { + // probably before 1.20.4 + EntityDamageEvent event = ReflectionUtils.newInstance(EntityDamageEvent.class, + new Class[]{Entity.class, DamageCause.class, double.class}, + new Object[]{le, EntityDamageEvent.DamageCause.CUSTOM, le.getHealth()}); + le.setLastDamageCause(event); + le.setHealth(0); + } } @Override