package net.minecraft.server;
import javax.annotation.Nullable;
public class ChunkCache implements IBlockAccess {
protected int a;
protected int b;
protected Chunk[][] c;
protected boolean d;
protected World e;
public ChunkCache(World world, BlockPosition blockposition, BlockPosition blockposition1, int i) {
this.e = world;
this.a = blockposition.getX() - i >> 4;
this.b = blockposition.getZ() - i >> 4;
int j = blockposition1.getX() + i >> 4;
int k = blockposition1.getZ() + i >> 4;
this.c = new Chunk[j - this.a + 1][k - this.b + 1];
this.d = true;
int l;
int i1;
for (l = this.a; l <= j; ++l) {
for (i1 = this.b; i1 <= k; ++i1) {
this.c[l - this.a][i1 - this.b] = world.getChunkIfLoaded(l, i1); // Paper
}
}
for (l = blockposition.getX() >> 4; l <= blockposition1.getX() >> 4; ++l) {
for (i1 = blockposition.getZ() >> 4; i1 <= blockposition1.getZ() >> 4; ++i1) {
Chunk chunk = this.c[l - this.a][i1 - this.b];
if (chunk != null && !chunk.c(blockposition.getY(), blockposition1.getY())) {
this.d = false;
}
}
}
}
@Nullable
public TileEntity getTileEntity(BlockPosition blockposition) {
return this.a(blockposition, Chunk.EnumTileEntityState.IMMEDIATE);
}
@Nullable
public TileEntity a(BlockPosition blockposition, Chunk.EnumTileEntityState chunk_enumtileentitystate) {
int i = (blockposition.getX() >> 4) - this.a;
int j = (blockposition.getZ() >> 4) - this.b;
return this.c[i][j].a(blockposition, chunk_enumtileentitystate);
}
public IBlockData getType(BlockPosition blockposition) {
if (blockposition.getY() >= 0 && blockposition.getY() < 256) {
int i = (blockposition.getX() >> 4) - this.a;
int j = (blockposition.getZ() >> 4) - this.b;
if (i >= 0 && i < this.c.length && j >= 0 && j < this.c[i].length) {
Chunk chunk = this.c[i][j];
if (chunk != null) {
return chunk.getBlockData(blockposition);
}
}
}
return Blocks.AIR.getBlockData();
}
public boolean isEmpty(BlockPosition blockposition) {
return this.getType(blockposition).getMaterial() == Material.AIR;
}
public int getBlockPower(BlockPosition blockposition, EnumDirection enumdirection) {
return this.getType(blockposition).b(this, blockposition, enumdirection);
}
}