diff --git a/leaf-server/minecraft-patches/features/0153-Async-target-finding.patch b/leaf-server/minecraft-patches/features/0153-Async-target-finding.patch index fd386af4..8bd2753c 100644 --- a/leaf-server/minecraft-patches/features/0153-Async-target-finding.patch +++ b/leaf-server/minecraft-patches/features/0153-Async-target-finding.patch @@ -669,7 +669,7 @@ index 3093f03d4f298bf39fec8bad2b6c22518774aea8..0a41797fd7beddce0b93d42bac6e0270 } else { this.parent = animal; diff --git a/net/minecraft/world/entity/ai/goal/GoalSelector.java b/net/minecraft/world/entity/ai/goal/GoalSelector.java -index e82e32407cec6109b9c3b0106295217f4a3f4aa2..3c24382a3cced8dcea103ccc87cb506310de8461 100644 +index e82e32407cec6109b9c3b0106295217f4a3f4aa2..f522125d19e31ec3fd3d38d1fdb307ba25e300a8 100644 --- a/net/minecraft/world/entity/ai/goal/GoalSelector.java +++ b/net/minecraft/world/entity/ai/goal/GoalSelector.java @@ -26,13 +26,23 @@ public class GoalSelector { @@ -850,7 +850,7 @@ index e82e32407cec6109b9c3b0106295217f4a3f4aa2..3c24382a3cced8dcea103ccc87cb5063 for (WrappedGoal wrappedGoal : this.availableGoals) { if (wrappedGoal.isRunning() && (goalContainsAnyFlags(wrappedGoal, this.goalTypes) || !wrappedGoal.canContinueToUse())) { // Paper - Perf: optimize goal types by removing streams wrappedGoal.stop(); -@@ -116,6 +251,18 @@ public class GoalSelector { +@@ -116,6 +251,24 @@ public class GoalSelector { } public void tickRunningGoals(boolean tickAllRunning) { @@ -862,6 +862,12 @@ index e82e32407cec6109b9c3b0106295217f4a3f4aa2..3c24382a3cced8dcea103ccc87cb5063 + availableGoalsDirty = false; + } + ctxState = tickAllRunning ? 2 : 3; ++ } else { ++ for (WrappedGoal wrappedGoal : this.ctxGoals) { ++ if (wrappedGoal.isRunning() && (tickAllRunning || wrappedGoal.requiresUpdateEveryTick())) { ++ wrappedGoal.tick(); ++ } ++ } + } + return; + } diff --git a/leaf-server/src/main/java/org/dreeam/leaf/async/ai/AsyncGoalExecutor.java b/leaf-server/src/main/java/org/dreeam/leaf/async/ai/AsyncGoalExecutor.java index 084ed5df..780e2678 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/async/ai/AsyncGoalExecutor.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/async/ai/AsyncGoalExecutor.java @@ -18,7 +18,6 @@ public class AsyncGoalExecutor { protected final SpscIntQueue queue; protected final SpscIntQueue wake; protected final IntArrayList submit; - private final AsyncGoalThread thread; private final ServerLevel world; private long midTickCount = 0L; @@ -27,7 +26,6 @@ public class AsyncGoalExecutor { this.queue = new SpscIntQueue(AsyncTargetFinding.queueSize); this.wake = new SpscIntQueue(AsyncTargetFinding.queueSize); this.submit = new IntArrayList(); - this.thread = thread; } boolean wake(int id) { @@ -46,7 +44,18 @@ public class AsyncGoalExecutor { public final void tick() { batchSubmit(); - LockSupport.unpark(thread); + while (true) { + OptionalInt result = this.wake.recv(); + if (result.isEmpty()) { + break; + } + int id = result.getAsInt(); + if (poll(id) && !this.queue.send(id)) { + do { + wake(id); + } while (poll(id)); + } + } } private void batchSubmit() { @@ -67,18 +76,6 @@ public class AsyncGoalExecutor { } public final void midTick() { - while (true) { - OptionalInt result = this.wake.recv(); - if (result.isEmpty()) { - break; - } - int id = result.getAsInt(); - if (poll(id) && !this.queue.send(id)) { - do { - wake(id); - } while (poll(id)); - } - } if (AsyncTargetFinding.threshold <= 0L || (midTickCount % AsyncTargetFinding.threshold) == 0L) { batchSubmit(); }