mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
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
|