mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2026-01-03 14:22:26 +00:00
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.
77 lines
3.7 KiB
Diff
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
|