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

63 lines
2.3 KiB
Java

package net.minecraft.world.entity.ai.behavior;
import net.minecraft.core.BlockPos;
import net.minecraft.tags.FluidTags;
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;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import org.apache.commons.lang3.mutable.MutableLong;
public class TryFindWater {
public static BehaviorControl<PathfinderMob> create(int range, float speedModifier) {
MutableLong mutableLong = new MutableLong(0L);
return BehaviorBuilder.create(
instance -> instance.group(
instance.absent(MemoryModuleType.ATTACK_TARGET), instance.absent(MemoryModuleType.WALK_TARGET), instance.registered(MemoryModuleType.LOOK_TARGET)
)
.apply(instance, (memoryAccessor, memoryAccessor2, memoryAccessor3) -> (serverLevel, pathfinderMob, l) -> {
if (serverLevel.getFluidState(pathfinderMob.blockPosition()).is(FluidTags.WATER)) {
return false;
} else if (l < mutableLong.getValue()) {
mutableLong.setValue(l + 20L + 2L);
return true;
} else {
BlockPos blockPos = null;
BlockPos blockPos2 = null;
BlockPos blockPos3 = pathfinderMob.blockPosition();
for (BlockPos blockPos4 : BlockPos.withinManhattan(blockPos3, range, range, range)) {
if (blockPos4.getX() != blockPos3.getX() || blockPos4.getZ() != blockPos3.getZ()) {
BlockState blockState = pathfinderMob.level().getBlockState(blockPos4.above());
BlockState blockState2 = pathfinderMob.level().getBlockState(blockPos4);
if (blockState2.is(Blocks.WATER)) {
if (blockState.isAir()) {
blockPos = blockPos4.immutable();
break;
}
if (blockPos2 == null && !blockPos4.closerToCenterThan(pathfinderMob.position(), 1.5)) {
blockPos2 = blockPos4.immutable();
}
}
}
}
if (blockPos == null) {
blockPos = blockPos2;
}
if (blockPos != null) {
memoryAccessor3.set(new BlockPosTracker(blockPos));
memoryAccessor2.set(new WalkTarget(new BlockPosTracker(blockPos), speedModifier, 0));
}
mutableLong.setValue(l + 40L);
return true;
}
})
);
}
}