From 419010b130757548794d02d54fa4bbb2f77c6ce5 Mon Sep 17 00:00:00 2001 From: Doc Date: Tue, 16 Aug 2022 20:00:57 +1000 Subject: [PATCH] SPIGOT-7112: Mobs added 1.17 and after do not create an EntityTargetEvent properly --- .../ai/behavior/BehaviorFollowAdult.patch | 35 +++++++++++++++ .../entity/ai/sensing/TemptingSensor.patch | 45 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFollowAdult.patch create mode 100644 nms-patches/net/minecraft/world/entity/ai/sensing/TemptingSensor.patch diff --git a/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFollowAdult.patch b/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFollowAdult.patch new file mode 100644 index 000000000..5059baa3d --- /dev/null +++ b/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFollowAdult.patch @@ -0,0 +1,35 @@ +--- a/net/minecraft/world/entity/ai/behavior/BehaviorFollowAdult.java ++++ b/net/minecraft/world/entity/ai/behavior/BehaviorFollowAdult.java +@@ -10,6 +10,13 @@ + import net.minecraft.world.entity.ai.memory.MemoryModuleType; + import net.minecraft.world.entity.ai.memory.MemoryStatus; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftLivingEntity; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityTargetEvent; ++import org.bukkit.event.entity.EntityTargetLivingEntityEvent; ++// CraftBukkit end ++ + public class BehaviorFollowAdult extends Behavior { + + private final UniformInt followRange; +@@ -38,7 +45,17 @@ + } + + protected void start(WorldServer worldserver, E e0, long i) { +- BehaviorUtil.setWalkAndLookTargetMemories(e0, (Entity) this.getNearestAdult(e0), (Float) this.speedModifier.apply(e0), this.followRange.getMinValue() - 1); ++ // CraftBukkit start ++ EntityTargetLivingEntityEvent event = CraftEventFactory.callEntityTargetLivingEvent(e0, this.getNearestAdult(e0), EntityTargetEvent.TargetReason.FOLLOW_LEADER); ++ if (event.isCancelled()) { ++ return; ++ } ++ if (event.getTarget() != null) { ++ BehaviorUtil.setWalkAndLookTargetMemories(e0, ((CraftLivingEntity) event.getTarget()).getHandle(), this.speedModifier.apply(e0), this.followRange.getMinValue() - 1); ++ } else { ++ e0.getBrain().eraseMemory(MemoryModuleType.NEAREST_VISIBLE_ADULT); ++ } ++ // CraftBukkit end + } + + private EntityAgeable getNearestAdult(E e0) { diff --git a/nms-patches/net/minecraft/world/entity/ai/sensing/TemptingSensor.patch b/nms-patches/net/minecraft/world/entity/ai/sensing/TemptingSensor.patch new file mode 100644 index 000000000..7d4dc6e14 --- /dev/null +++ b/nms-patches/net/minecraft/world/entity/ai/sensing/TemptingSensor.patch @@ -0,0 +1,45 @@ +--- a/net/minecraft/world/entity/ai/sensing/TemptingSensor.java ++++ b/net/minecraft/world/entity/ai/sensing/TemptingSensor.java +@@ -17,6 +17,14 @@ + import net.minecraft.world.item.ItemStack; + import net.minecraft.world.item.crafting.RecipeItemStack; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.entity.HumanEntity; ++import org.bukkit.event.entity.EntityTargetEvent; ++import org.bukkit.event.entity.EntityTargetLivingEntityEvent; ++// CraftBukkit end ++ + public class TemptingSensor extends Sensor { + + public static final int TEMPTATION_RANGE = 10; +@@ -29,7 +37,7 @@ + + protected void doTick(WorldServer worldserver, EntityCreature entitycreature) { + BehaviorController behaviorcontroller = entitycreature.getBrain(); +- Stream stream = worldserver.players().stream().filter(IEntitySelector.NO_SPECTATORS).filter((entityplayer) -> { ++ Stream stream = worldserver.players().stream().filter(IEntitySelector.NO_SPECTATORS).filter((entityplayer) -> { // CraftBukkit - decompile error + return TemptingSensor.TEMPT_TARGETING.test(entitycreature, entityplayer); + }).filter((entityplayer) -> { + return entitycreature.closerThan(entityplayer, 10.0D); +@@ -41,7 +49,17 @@ + if (!list.isEmpty()) { + EntityHuman entityhuman = (EntityHuman) list.get(0); + +- behaviorcontroller.setMemory(MemoryModuleType.TEMPTING_PLAYER, (Object) entityhuman); ++ // CraftBukkit start ++ EntityTargetLivingEntityEvent event = CraftEventFactory.callEntityTargetLivingEvent(entitycreature, entityhuman, EntityTargetEvent.TargetReason.TEMPT); ++ if (event.isCancelled()) { ++ return; ++ } ++ if (event.getTarget() instanceof HumanEntity) { ++ behaviorcontroller.setMemory(MemoryModuleType.TEMPTING_PLAYER, ((CraftHumanEntity) event.getTarget()).getHandle()); ++ } else { ++ behaviorcontroller.eraseMemory(MemoryModuleType.TEMPTING_PLAYER); ++ } ++ // CraftBukkit end + } else { + behaviorcontroller.eraseMemory(MemoryModuleType.TEMPTING_PLAYER); + }