minecraft-src/net/minecraft/world/entity/ai/behavior/InsideBrownianWalk.java
2025-07-04 01:41:11 +03:00

39 lines
1.5 KiB
Java

package net.minecraft.world.entity.ai.behavior;
import java.util.Collections;
import java.util.List;
import net.minecraft.Util;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.PathfinderMob;
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;
public class InsideBrownianWalk {
public static BehaviorControl<PathfinderMob> create(float speedModifier) {
return BehaviorBuilder.create(
instance -> instance.group(instance.absent(MemoryModuleType.WALK_TARGET))
.apply(
instance,
memoryAccessor -> (serverLevel, pathfinderMob, l) -> {
if (serverLevel.canSeeSky(pathfinderMob.blockPosition())) {
return false;
} else {
BlockPos blockPos = pathfinderMob.blockPosition();
List<BlockPos> list = (List<BlockPos>)BlockPos.betweenClosedStream(blockPos.offset(-1, -1, -1), blockPos.offset(1, 1, 1))
.map(BlockPos::immutable)
.collect(Util.toMutableList());
Collections.shuffle(list);
list.stream()
.filter(blockPosx -> !serverLevel.canSeeSky(blockPosx))
.filter(blockPosx -> serverLevel.loadedAndEntityCanStandOn(blockPosx, pathfinderMob))
.filter(blockPosx -> serverLevel.noCollision(pathfinderMob))
.findFirst()
.ifPresent(blockPosx -> memoryAccessor.set(new WalkTarget(blockPosx, speedModifier, 0)));
return true;
}
}
)
);
}
}