From cef8bd993373b452866f66c39bc31b95a293570d Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 16 Mar 2023 07:15:33 +1100 Subject: [PATCH] SPIGOT-7294: Call EntityDamageEvent for Interaction entity --- .../minecraft/world/entity/Interaction.patch | 45 +++++++++++++++++++ .../craftbukkit/event/CraftEventFactory.java | 8 +++- 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 nms-patches/net/minecraft/world/entity/Interaction.patch diff --git a/nms-patches/net/minecraft/world/entity/Interaction.patch b/nms-patches/net/minecraft/world/entity/Interaction.patch new file mode 100644 index 000000000..4e95c9fe2 --- /dev/null +++ b/nms-patches/net/minecraft/world/entity/Interaction.patch @@ -0,0 +1,45 @@ +--- a/net/minecraft/world/entity/Interaction.java ++++ b/net/minecraft/world/entity/Interaction.java +@@ -24,6 +24,12 @@ + import net.minecraft.world.phys.AxisAlignedBB; + import org.slf4j.Logger; + ++// CraftBukkit start ++import net.minecraft.world.damagesource.DamageSource; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityDamageEvent; ++// CraftBukkit end ++ + public class Interaction extends Entity implements Attackable, Targeting { + + private static final Logger LOGGER = LogUtils.getLogger(); +@@ -62,7 +68,7 @@ + this.setHeight(nbttagcompound.getFloat("height")); + } + +- DataResult dataresult; ++ DataResult> dataresult; // CraftBukkit - decompile error + Logger logger; + + if (nbttagcompound.contains("attack")) { +@@ -138,12 +144,19 @@ + public boolean skipAttackInteraction(Entity entity) { + if (entity instanceof EntityHuman) { + EntityHuman entityhuman = (EntityHuman) entity; ++ // CraftBukkit start ++ DamageSource source = entityhuman.damageSources().playerAttack(entityhuman); ++ EntityDamageEvent event = CraftEventFactory.callNonLivingEntityDamageEvent(this, source, 1.0F, false); ++ if (event.isCancelled()) { ++ return true; ++ } ++ // CraftBukkit end + + this.attack = new Interaction.PlayerAction(entityhuman.getUUID(), this.level.getGameTime()); + if (entityhuman instanceof EntityPlayer) { + EntityPlayer entityplayer = (EntityPlayer) entityhuman; + +- CriterionTriggers.PLAYER_HURT_ENTITY.trigger(entityplayer, this, entityhuman.damageSources().generic(), 1.0F, 1.0F, false); ++ CriterionTriggers.PLAYER_HURT_ENTITY.trigger(entityplayer, this, source, (float) event.getFinalDamage(), 1.0F, false); // CraftBukkit + } + + return !this.getResponse(); diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index d59ff1164..3d38fc4cd 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -1075,14 +1075,18 @@ public class CraftEventFactory { return handleNonLivingEntityDamageEvent(entity, source, damage, cancelOnZeroDamage, false); } - public static boolean handleNonLivingEntityDamageEvent(Entity entity, DamageSource source, double damage, boolean cancelOnZeroDamage, boolean cancelled) { + public static EntityDamageEvent callNonLivingEntityDamageEvent(Entity entity, DamageSource source, double damage, boolean cancelled) { final EnumMap modifiers = new EnumMap(DamageModifier.class); final EnumMap> functions = new EnumMap(DamageModifier.class); modifiers.put(DamageModifier.BASE, damage); functions.put(DamageModifier.BASE, ZERO); - final EntityDamageEvent event = handleEntityDamageEvent(entity, source, modifiers, functions, cancelled); + return handleEntityDamageEvent(entity, source, modifiers, functions, cancelled); + } + + public static boolean handleNonLivingEntityDamageEvent(Entity entity, DamageSource source, double damage, boolean cancelOnZeroDamage, boolean cancelled) { + final EntityDamageEvent event = callNonLivingEntityDamageEvent(entity, source, damage, cancelled); if (event == null) { return false;