From 3e48b6731984218cbcca3db3f43c391bda77f489 Mon Sep 17 00:00:00 2001 From: hayanesuru Date: Sat, 26 Jul 2025 01:05:41 +0900 Subject: [PATCH] fix async target finding entity headbang (#424) closes #417 --- .../features/0229-Async-target-finding.patch | 51 ++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/leaf-server/minecraft-patches/features/0229-Async-target-finding.patch b/leaf-server/minecraft-patches/features/0229-Async-target-finding.patch index 60b7404b..96766c86 100644 --- a/leaf-server/minecraft-patches/features/0229-Async-target-finding.patch +++ b/leaf-server/minecraft-patches/features/0229-Async-target-finding.patch @@ -235,6 +235,30 @@ index 7caf9ea3792089dcf890c2af0ac17ee1d5c85c16..3882bc7a8d1684b91876eb7c67999490 this.navigation.tick(); this.customServerAiStep((ServerLevel)this.level()); +diff --git a/net/minecraft/world/entity/ai/control/LookControl.java b/net/minecraft/world/entity/ai/control/LookControl.java +index 95c43931fb0f11136ab73df3c8716aac42d8f1d4..a0d729f18164f1863a5735a9322d3f3df9ab0c95 100644 +--- a/net/minecraft/world/entity/ai/control/LookControl.java ++++ b/net/minecraft/world/entity/ai/control/LookControl.java +@@ -35,6 +35,19 @@ public class LookControl implements Control { + this.setLookAt(x, y, z, this.mob.getHeadRotSpeed(), this.mob.getMaxHeadXRot()); + } + ++ // Leaf start - Async target finding ++ public void setLookAtWithCooldown(double x, double y, double z, int lookAtCooldown) { ++ float deltaYaw = this.mob.getHeadRotSpeed(); ++ float deltaPitch = this.mob.getMaxHeadXRot(); ++ this.wantedX = x; ++ this.wantedY = y; ++ this.wantedZ = z; ++ this.yMaxRotSpeed = deltaYaw; ++ this.xMaxRotAngle = deltaPitch; ++ this.lookAtCooldown = lookAtCooldown; ++ } ++ // Leaf end - Async target finding ++ + public void setLookAt(double x, double y, double z, float deltaYaw, float deltaPitch) { + this.wantedX = x; + this.wantedY = y; diff --git a/net/minecraft/world/entity/ai/goal/AvoidEntityGoal.java b/net/minecraft/world/entity/ai/goal/AvoidEntityGoal.java index 7651676e72fcec52d7c1f9f7d7b6f9e585015c4d..7b1f8e58f6b1fc34204b77cf3c902759aceb3350 100644 --- a/net/minecraft/world/entity/ai/goal/AvoidEntityGoal.java @@ -908,7 +932,7 @@ index be59d0c27a83b329ec3f97c029cfb9c114e22472..28e4c81ba8411147fe326bcf331d9ac1 if (llama == null) { return false; diff --git a/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.java b/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.java -index 6463c3c9b08d6058f2843c225b08a40fc30a960b..1b9729d3ecf7ab5b364cab26f940ac77da880014 100644 +index 6463c3c9b08d6058f2843c225b08a40fc30a960b..44ba360fa0450aaa1783f1ac2f2b35c37bf55677 100644 --- a/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.java +++ b/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.java @@ -48,32 +48,78 @@ public class LookAtPlayerGoal extends Goal { @@ -947,10 +971,7 @@ index 6463c3c9b08d6058f2843c225b08a40fc30a960b..1b9729d3ecf7ab5b364cab26f940ac77 + this.mob.getZ() + ); + } - -- ServerLevel serverLevel = getServerLevel(this.mob); -- if (this.lookAtType == Player.class) { -- this.lookAt = serverLevel.getNearestPlayer(this.lookAtContext, this.mob, this.mob.getX(), this.mob.getEyeY(), this.mob.getZ()); ++ + return this.lookAt != null; + } + @@ -965,7 +986,10 @@ index 6463c3c9b08d6058f2843c225b08a40fc30a960b..1b9729d3ecf7ab5b364cab26f940ac77 + this.lookAt = target; + return true; + } -+ + +- ServerLevel serverLevel = getServerLevel(this.mob); +- if (this.lookAtType == Player.class) { +- this.lookAt = serverLevel.getNearestPlayer(this.lookAtContext, this.mob, this.mob.getX(), this.mob.getEyeY(), this.mob.getZ()); + protected void getLookAsync() { + final var mob = this.mob; + final var ctx = mob.getGoalCtx(); @@ -1008,6 +1032,21 @@ index 6463c3c9b08d6058f2843c225b08a40fc30a960b..1b9729d3ecf7ab5b364cab26f940ac77 @Override public boolean canContinueToUse() { +@@ -94,7 +140,13 @@ public class LookAtPlayerGoal extends Goal { + public void tick() { + if (this.lookAt.isAlive()) { + double d = this.onlyHorizontal ? this.mob.getEyeY() : this.lookAt.getEyeY(); +- this.mob.getLookControl().setLookAt(this.lookAt.getX(), d, this.lookAt.getZ()); ++ // Leaf start - Async target finding ++ if (org.dreeam.leaf.config.modules.async.AsyncTargetFinding.searchEntity) { ++ this.mob.getLookControl().setLookAtWithCooldown(this.lookAt.getX(), d, this.lookAt.getZ(), 10); ++ } else { ++ this.mob.getLookControl().setLookAt(this.lookAt.getX(), d, this.lookAt.getZ()); ++ } ++ // Leaf end - Async target finding + this.lookTime--; + } + } diff --git a/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java b/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java index f15da598cb1d7872fafb8b173e5134b9667c9a9f..a6cb3b316c797cf85496ba395295c002805f573e 100644 --- a/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java