From dc199f3efefbbc12ce54e908d670db14c2fdfab4 Mon Sep 17 00:00:00 2001 From: xSnowyk Date: Wed, 17 Dec 2025 23:58:30 +0700 Subject: [PATCH 1/2] Fix EntityTargetLivingEntityEvent spam in TemptGoal --- .../world/entity/ai/goal/TemptGoal.java.patch | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/world/entity/ai/goal/TemptGoal.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/ai/goal/TemptGoal.java.patch index 1a838aa9c160..0766f72355c9 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/ai/goal/TemptGoal.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/ai/goal/TemptGoal.java.patch @@ -9,19 +9,26 @@ private int calmDown; private boolean isRunning; private final Predicate items; -@@ -56,6 +_,15 @@ +@@ -54,8 +_,21 @@ + this.calmDown--; + return false; } else { - this.player = getServerLevel(this.mob) +- this.player = getServerLevel(this.mob) ++ // this.player = getServerLevel(this.mob).getNearestPlayer(this.targetingConditions.range(this.mob.getAttributeValue(Attributes.TEMPT_RANGE)), this.mob); ++ // Paper start - Fix EntityTargetLivingEntityEvent spam ++ LivingEntity candidate = getServerLevel(this.mob) .getNearestPlayer(this.targetingConditions.range(this.mob.getAttributeValue(Attributes.TEMPT_RANGE)), this.mob); -+ // CraftBukkit start -+ if (this.player != null) { -+ org.bukkit.event.entity.EntityTargetLivingEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetLivingEvent(this.mob, this.player, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TEMPT); ++ ++ if (candidate != null && this.player != candidate) { ++ org.bukkit.event.entity.EntityTargetLivingEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetLivingEvent(this.mob, candidate, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TEMPT); + if (event.isCancelled()) { + return false; + } -+ this.player = (event.getTarget() == null) ? null : ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle(); ++ candidate = (event.getTarget() == null) ? null : ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle(); + } -+ // CraftBukkit end ++ ++ this.player = candidate; ++ // Paper end - Fix EntityTargetLivingEntityEvent spam return this.player != null; } } From aebbb69a410d62afa7543a72438fd5941f7583bd Mon Sep 17 00:00:00 2001 From: xSnowyk Date: Thu, 18 Dec 2025 20:38:05 +0700 Subject: [PATCH 2/2] Throttle EntityTargetLivingEntityEvent in TemptGoal --- .../world/entity/ai/goal/TemptGoal.java.patch | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/world/entity/ai/goal/TemptGoal.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/ai/goal/TemptGoal.java.patch index 0766f72355c9..1845f244e8ab 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/ai/goal/TemptGoal.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/ai/goal/TemptGoal.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/ai/goal/TemptGoal.java +++ b/net/minecraft/world/entity/ai/goal/TemptGoal.java -@@ -23,7 +_,7 @@ +@@ -23,12 +_,13 @@ private double pz; private double pRotX; private double pRotY; @@ -9,17 +9,25 @@ private int calmDown; private boolean isRunning; private final Predicate items; -@@ -54,8 +_,21 @@ + private final boolean canScare; + private final double stopDistance; ++ private int temptEventCooldown; // Paper + + public TemptGoal(PathfinderMob mob, double speedModifier, Predicate items, boolean canScare) { + this((Mob)mob, speedModifier, items, canScare, 2.5); +@@ -54,8 +_,23 @@ this.calmDown--; return false; } else { - this.player = getServerLevel(this.mob) + // this.player = getServerLevel(this.mob).getNearestPlayer(this.targetingConditions.range(this.mob.getAttributeValue(Attributes.TEMPT_RANGE)), this.mob); -+ // Paper start - Fix EntityTargetLivingEntityEvent spam ++ // Paper start - Throttle EntityTargetLivingEntityEvent + LivingEntity candidate = getServerLevel(this.mob) .getNearestPlayer(this.targetingConditions.range(this.mob.getAttributeValue(Attributes.TEMPT_RANGE)), this.mob); + -+ if (candidate != null && this.player != candidate) { ++ if (candidate != null && (candidate != this.player || --this.temptEventCooldown <= 0)) { ++ this.temptEventCooldown = 10; ++ + org.bukkit.event.entity.EntityTargetLivingEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetLivingEvent(this.mob, candidate, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TEMPT); + if (event.isCancelled()) { + return false; @@ -28,7 +36,7 @@ + } + + this.player = candidate; -+ // Paper end - Fix EntityTargetLivingEntityEvent spam ++ // Paper end - Throttle EntityTargetLivingEntityEvent return this.player != null; } }