minecraft-source/src/net/minecraft/world/level/PathNavigationRegion.java

96 lines
3.8 KiB
Java

package net.minecraft.world.level;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import javax.annotation.Nullable;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.border.WorldBorder;
import net.minecraft.world.level.chunk.EmptyLevelChunk;
import net.minecraft.world.level.chunk.ChunkSource;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.chunk.ChunkAccess;
public class PathNavigationRegion implements BlockGetter, CollisionGetter {
protected final int centerX;
protected final int centerZ;
protected final ChunkAccess[][] chunks;
protected boolean allEmpty;
protected final Level level;
public PathNavigationRegion(final Level bjt, final BlockPos fk2, final BlockPos fk3) {
this.level = bjt;
this.centerX = fk2.getX() >> 4;
this.centerZ = fk2.getZ() >> 4;
final int integer5 = fk3.getX() >> 4;
final int integer6 = fk3.getZ() >> 4;
this.chunks = new ChunkAccess[integer5 - this.centerX + 1][integer6 - this.centerZ + 1];
final ChunkSource caa7 = bjt.getChunkSource();
this.allEmpty = true;
for (int integer7 = this.centerX; integer7 <= integer5; ++integer7) {
for (int integer8 = this.centerZ; integer8 <= integer6; ++integer8) {
this.chunks[integer7 - this.centerX][integer8 - this.centerZ] = caa7.getChunkNow(integer7, integer8);
}
}
for (int integer7 = fk2.getX() >> 4; integer7 <= fk3.getX() >> 4; ++integer7) {
for (int integer8 = fk2.getZ() >> 4; integer8 <= fk3.getZ() >> 4; ++integer8) {
final ChunkAccess bzv10 = this.chunks[integer7 - this.centerX][integer8 - this.centerZ];
if (bzv10 != null && !bzv10.isYSpaceEmpty(fk2.getY(), fk3.getY())) {
this.allEmpty = false;
return;
}
}
}
}
private ChunkAccess getChunk(final BlockPos fk) {
return this.getChunk(fk.getX() >> 4, fk.getZ() >> 4);
}
private ChunkAccess getChunk(final int integer1, final int integer2) {
final int integer3 = integer1 - this.centerX;
final int integer4 = integer2 - this.centerZ;
if (integer3 < 0 || integer3 >= this.chunks.length || integer4 < 0 || integer4 >= this.chunks[integer3].length) {
return new EmptyLevelChunk(this.level, new ChunkPos(integer1, integer2));
}
final ChunkAccess bzv6 = this.chunks[integer3][integer4];
return (bzv6 != null) ? bzv6 : new EmptyLevelChunk(this.level, new ChunkPos(integer1, integer2));
}
@Override
public WorldBorder getWorldBorder() {
return this.level.getWorldBorder();
}
@Override
public BlockGetter getChunkForCollisions(final int integer1, final int integer2) {
return this.getChunk(integer1, integer2);
}
@Nullable
@Override
public BlockEntity getBlockEntity(final BlockPos fk) {
final ChunkAccess bzv3 = this.getChunk(fk);
return bzv3.getBlockEntity(fk);
}
@Override
public BlockState getBlockState(final BlockPos fk) {
if (Level.isOutsideBuildHeight(fk)) {
return Blocks.AIR.defaultBlockState();
}
final ChunkAccess bzv3 = this.getChunk(fk);
return bzv3.getBlockState(fk);
}
@Override
public FluidState getFluidState(final BlockPos fk) {
if (Level.isOutsideBuildHeight(fk)) {
return Fluids.EMPTY.defaultFluidState();
}
final ChunkAccess bzv3 = this.getChunk(fk);
return bzv3.getFluidState(fk);
}
}