From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Taiyou06 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 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 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