package net.minecraft.world.level; import com.google.common.base.Suppliers; import java.util.List; import java.util.function.Supplier; import javax.annotation.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.SectionPos; import net.minecraft.core.registries.Registries; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.border.WorldBorder; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkSource; import net.minecraft.world.level.chunk.EmptyLevelChunk; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.shapes.VoxelShape; public class PathNavigationRegion implements CollisionGetter { protected final int centerX; protected final int centerZ; protected final ChunkAccess[][] chunks; protected boolean allEmpty; protected final Level level; private final Supplier> plains; public PathNavigationRegion(Level p_47164_, BlockPos p_47165_, BlockPos p_47166_) { this.level = p_47164_; this.plains = Suppliers.memoize(() -> p_47164_.registryAccess().lookupOrThrow(Registries.BIOME).getOrThrow(Biomes.PLAINS)); this.centerX = SectionPos.blockToSectionCoord(p_47165_.getX()); this.centerZ = SectionPos.blockToSectionCoord(p_47165_.getZ()); int i = SectionPos.blockToSectionCoord(p_47166_.getX()); int j = SectionPos.blockToSectionCoord(p_47166_.getZ()); this.chunks = new ChunkAccess[i - this.centerX + 1][j - this.centerZ + 1]; ChunkSource chunksource = p_47164_.getChunkSource(); this.allEmpty = true; for (int k = this.centerX; k <= i; k++) { for (int l = this.centerZ; l <= j; l++) { this.chunks[k - this.centerX][l - this.centerZ] = chunksource.getChunkNow(k, l); } } for (int i1 = SectionPos.blockToSectionCoord(p_47165_.getX()); i1 <= SectionPos.blockToSectionCoord(p_47166_.getX()); i1++) { for (int j1 = SectionPos.blockToSectionCoord(p_47165_.getZ()); j1 <= SectionPos.blockToSectionCoord(p_47166_.getZ()); j1++) { ChunkAccess chunkaccess = this.chunks[i1 - this.centerX][j1 - this.centerZ]; if (chunkaccess != null && !chunkaccess.isYSpaceEmpty(p_47165_.getY(), p_47166_.getY())) { this.allEmpty = false; return; } } } } private ChunkAccess getChunk(BlockPos p_47186_) { return this.getChunk(SectionPos.blockToSectionCoord(p_47186_.getX()), SectionPos.blockToSectionCoord(p_47186_.getZ())); } private ChunkAccess getChunk(int p_47168_, int p_47169_) { int i = p_47168_ - this.centerX; int j = p_47169_ - this.centerZ; if (i >= 0 && i < this.chunks.length && j >= 0 && j < this.chunks[i].length) { ChunkAccess chunkaccess = this.chunks[i][j]; return (ChunkAccess)(chunkaccess != null ? chunkaccess : new EmptyLevelChunk(this.level, new ChunkPos(p_47168_, p_47169_), this.plains.get())); } else { return new EmptyLevelChunk(this.level, new ChunkPos(p_47168_, p_47169_), this.plains.get()); } } @Override public WorldBorder getWorldBorder() { return this.level.getWorldBorder(); } @Override public BlockGetter getChunkForCollisions(int p_47173_, int p_47174_) { return this.getChunk(p_47173_, p_47174_); } @Override public List getEntityCollisions(@Nullable Entity p_186557_, AABB p_186558_) { return List.of(); } @Nullable @Override public BlockEntity getBlockEntity(BlockPos p_47180_) { ChunkAccess chunkaccess = this.getChunk(p_47180_); return chunkaccess.getBlockEntity(p_47180_); } @Override public BlockState getBlockState(BlockPos p_47188_) { if (this.isOutsideBuildHeight(p_47188_)) { return Blocks.AIR.defaultBlockState(); } else { ChunkAccess chunkaccess = this.getChunk(p_47188_); return chunkaccess.getBlockState(p_47188_); } } @Override public FluidState getFluidState(BlockPos p_47171_) { if (this.isOutsideBuildHeight(p_47171_)) { return Fluids.EMPTY.defaultFluidState(); } else { ChunkAccess chunkaccess = this.getChunk(p_47171_); return chunkaccess.getFluidState(p_47171_); } } @Override public int getMinY() { return this.level.getMinY(); } @Override public int getHeight() { return this.level.getHeight(); } }