9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2026-01-03 14:22:26 +00:00
Files
Leaf/leaf-server/minecraft-patches/features/0213-rewrite-InsideBrownianWalk.patch
Dreeam 9a4efaa230 Drop patch that causes performance regression
Originally vanilla logic is to use stream, and Mojang switched it to Guava's Collections2
since 1.21.4. It is much faster than using stream or manually adding to a new ArrayList.
Manually adding to a new ArrayList requires allocating a new object array. However, the Collections2
lazy handles filter condition on iteration, so much better.
2025-08-04 19:25:56 +08:00

77 lines
3.7 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Taiyou06 <kaandindar21@gmail.com>
Date: Wed, 19 Mar 2025 15:18:58 +0100
Subject: [PATCH] rewrite InsideBrownianWalk
License: LGPL-3.0 (https://www.gnu.org/licenses/lgpl-3.0.html)
This method is mainly visible when ton of villagers suddenly wants to sleep.
diff --git a/net/minecraft/world/entity/ai/behavior/InsideBrownianWalk.java b/net/minecraft/world/entity/ai/behavior/InsideBrownianWalk.java
index cbde74f4b6d586a5f80cdd675573441636bf682d..00585419d4c2f58ac8b05ad67cbe674dec96baea 100644
--- a/net/minecraft/world/entity/ai/behavior/InsideBrownianWalk.java
+++ b/net/minecraft/world/entity/ai/behavior/InsideBrownianWalk.java
@@ -9,31 +9,40 @@ import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder;
import net.minecraft.world.entity.ai.memory.MemoryModuleType;
import net.minecraft.world.entity.ai.memory.WalkTarget;
+// Leaf start - rewrite InsideBrownianWalk
public class InsideBrownianWalk {
public static BehaviorControl<PathfinderMob> create(float speedModifier) {
- return BehaviorBuilder.create(
- instance -> instance.group(instance.absent(MemoryModuleType.WALK_TARGET))
- .apply(
- instance,
- walkTarget -> (level, mob, gameTime) -> {
- if (level.canSeeSky(mob.blockPosition())) {
- return false;
- } else {
- BlockPos blockPos = mob.blockPosition();
- List<BlockPos> list = BlockPos.betweenClosedStream(blockPos.offset(-1, -1, -1), blockPos.offset(1, 1, 1))
- .map(BlockPos::immutable)
- .collect(Util.toMutableList());
- Collections.shuffle(list);
- list.stream()
- .filter(pos -> !level.canSeeSky(pos))
- .filter(pos -> level.loadedAndEntityCanStandOn(pos, mob))
- .filter(pos -> level.noCollision(mob))
- .findFirst()
- .ifPresent(pos -> walkTarget.set(new WalkTarget(pos, speedModifier, 0)));
- return true;
- }
+ return BehaviorBuilder.create(instance -> instance.group(instance.absent(MemoryModuleType.WALK_TARGET))
+ .apply(instance, walkTarget -> (level, mob, gameTime) -> {
+ if (level.canSeeSky(mob.blockPosition())) {
+ return false;
+ }
+
+ BlockPos currentPos = mob.blockPosition();
+ BlockPos[] nearbyBlocks = org.dreeam.leaf.util.BlockAreaUtils.getBlocksBetween(
+ currentPos.offset(-1, -1, -1),
+ currentPos.offset(1, 1, 1)
+ );
+
+ // Fisher-Yates shuffle is faster for this case
+ for (int i = nearbyBlocks.length - 1; i > 0; i--) {
+ int j = mob.random.nextInt(i + 1);
+ BlockPos temp = nearbyBlocks[i];
+ nearbyBlocks[i] = nearbyBlocks[j];
+ nearbyBlocks[j] = temp;
+ }
+
+ for (BlockPos pos : nearbyBlocks) {
+ if (!level.canSeeSky(pos) &&
+ level.loadedAndEntityCanStandOn(pos, mob) &&
+ level.noCollision(mob)) {
+ walkTarget.set(new WalkTarget(pos, speedModifier, 0));
+ break;
}
- )
+ }
+ return true;
+ })
);
}
}
+// Leaf end - rewrite InsideBrownianWalk