package net.minecraft.world;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.common.util.ForgeDirection;
public class ChunkCache implements IBlockAccess
{
private int chunkX;
private int chunkZ;
private Chunk[][] chunkArray;
/** set by !chunk.getAreLevelsEmpty */
private boolean hasExtendedLevels;
/** Reference to the World object. */
private World worldObj;
private static final String __OBFID = "CL_00000155";
public ChunkCache(World p_i1964_1_, int p_i1964_2_, int p_i1964_3_, int p_i1964_4_, int p_i1964_5_, int p_i1964_6_, int p_i1964_7_, int p_i1964_8_)
{
this.worldObj = p_i1964_1_;
this.chunkX = p_i1964_2_ - p_i1964_8_ >> 4;
this.chunkZ = p_i1964_4_ - p_i1964_8_ >> 4;
int l1 = p_i1964_5_ + p_i1964_8_ >> 4;
int i2 = p_i1964_7_ + p_i1964_8_ >> 4;
this.chunkArray = new Chunk[l1 - this.chunkX + 1][i2 - this.chunkZ + 1];
this.hasExtendedLevels = true;
int j2;
int k2;
Chunk chunk;
for (j2 = this.chunkX; j2 <= l1; ++j2)
{
for (k2 = this.chunkZ; k2 <= i2; ++k2)
{
chunk = p_i1964_1_.getChunkFromChunkCoords(j2, k2);
if (chunk != null)
{
this.chunkArray[j2 - this.chunkX][k2 - this.chunkZ] = chunk;
}
}
}
for (j2 = p_i1964_2_ >> 4; j2 <= p_i1964_5_ >> 4; ++j2)
{
for (k2 = p_i1964_4_ >> 4; k2 <= p_i1964_7_ >> 4; ++k2)
{
chunk = this.chunkArray[j2 - this.chunkX][k2 - this.chunkZ];
if (chunk != null && !chunk.getAreLevelsEmpty(p_i1964_3_, p_i1964_6_))
{
this.hasExtendedLevels = false;
}
}
}
}
/**
* set by !chunk.getAreLevelsEmpty
*/
@SideOnly(Side.CLIENT)
public boolean extendedLevelsInChunkCache()
{
return this.hasExtendedLevels;
}
public Block getBlock(int p_147439_1_, int p_147439_2_, int p_147439_3_)
{
Block block = Blocks.air;
if (p_147439_2_ >= 0 && p_147439_2_ < 256)
{
int l = (p_147439_1_ >> 4) - this.chunkX;
int i1 = (p_147439_3_ >> 4) - this.chunkZ;
if (l >= 0 && l < this.chunkArray.length && i1 >= 0 && i1 < this.chunkArray[l].length)
{
Chunk chunk = this.chunkArray[l][i1];
if (chunk != null)
{
block = chunk.getBlock(p_147439_1_ & 15, p_147439_2_, p_147439_3_ & 15);
}
}
}
return block;
}
public TileEntity getTileEntity(int x, int y, int z)
{
int l = (x >> 4) - this.chunkX;
int i1 = (z >> 4) - this.chunkZ;
if (l < 0 || l >= chunkArray.length || i1 < 0 || i1 >= chunkArray[l].length) return null;
if (chunkArray[l][i1] == null) return null;
return this.chunkArray[l][i1].getBlockTileEntityInChunk(x & 15, y, z & 15);
}
/**
* Any Light rendered on a 1.8 Block goes through here
*/
@SideOnly(Side.CLIENT)
public int getLightBrightnessForSkyBlocks(int p_72802_1_, int p_72802_2_, int p_72802_3_, int p_72802_4_)
{
int i1 = this.getSkyBlockTypeBrightness(EnumSkyBlock.Sky, p_72802_1_, p_72802_2_, p_72802_3_);
int j1 = this.getSkyBlockTypeBrightness(EnumSkyBlock.Block, p_72802_1_, p_72802_2_, p_72802_3_);
if (j1 < p_72802_4_)
{
j1 = p_72802_4_;
}
return i1 << 20 | j1 << 4;
}
/**
* Returns the block metadata at coords x,y,z
*/
public int getBlockMetadata(int p_72805_1_, int p_72805_2_, int p_72805_3_)
{
if (p_72805_2_ < 0)
{
return 0;
}
else if (p_72805_2_ >= 256)
{
return 0;
}
else
{
int l = (p_72805_1_ >> 4) - this.chunkX;
int i1 = (p_72805_3_ >> 4) - this.chunkZ;
if (l < 0 || l >= chunkArray.length || i1 < 0 || i1 >= chunkArray[l].length) return 0;
if (chunkArray[l][i1] == null) return 0;
return this.chunkArray[l][i1].getBlockMetadata(p_72805_1_ & 15, p_72805_2_, p_72805_3_ & 15);
}
}
/**
* Is this block powering in the specified direction Args: x, y, z, direction
*/
public int isBlockProvidingPowerTo(int x, int y, int z, int directionIn)
{
return this.getBlock(x, y, z).isProvidingStrongPower(this, x, y, z, directionIn);
}
/**
* Gets the biome for a given set of x/z coordinates
*/
@SideOnly(Side.CLIENT)
public BiomeGenBase getBiomeGenForCoords(int x, int z)
{
return this.worldObj.getBiomeGenForCoords(x, z);
}
/**
* Returns true if the block at the specified coordinates is empty
*/
public boolean isAirBlock(int x, int y, int z)
{
return this.getBlock(x, y, z).isAir(this, x, y, z);
}
/**
* Brightness for SkyBlock.Sky is clear white and (through color computing it is assumed) DEPENDENT ON DAYTIME.
* Brightness for SkyBlock.Block is yellowish and independent.
*/
@SideOnly(Side.CLIENT)
public int getSkyBlockTypeBrightness(EnumSkyBlock p_72810_1_, int p_72810_2_, int p_72810_3_, int p_72810_4_)
{
if (p_72810_3_ < 0)
{
p_72810_3_ = 0;
}
if (p_72810_3_ >= 256)
{
p_72810_3_ = 255;
}
if (p_72810_3_ >= 0 && p_72810_3_ < 256 && p_72810_2_ >= -30000000 && p_72810_4_ >= -30000000 && p_72810_2_ < 30000000 && p_72810_4_ <= 30000000)
{
if (p_72810_1_ == EnumSkyBlock.Sky && this.worldObj.provider.hasNoSky)
{
return 0;
}
else
{
int l;
int i1;
if (this.getBlock(p_72810_2_, p_72810_3_, p_72810_4_).getUseNeighborBrightness())
{
l = this.getSpecialBlockBrightness(p_72810_1_, p_72810_2_, p_72810_3_ + 1, p_72810_4_);
i1 = this.getSpecialBlockBrightness(p_72810_1_, p_72810_2_ + 1, p_72810_3_, p_72810_4_);
int j1 = this.getSpecialBlockBrightness(p_72810_1_, p_72810_2_ - 1, p_72810_3_, p_72810_4_);
int k1 = this.getSpecialBlockBrightness(p_72810_1_, p_72810_2_, p_72810_3_, p_72810_4_ + 1);
int l1 = this.getSpecialBlockBrightness(p_72810_1_, p_72810_2_, p_72810_3_, p_72810_4_ - 1);
if (i1 > l)
{
l = i1;
}
if (j1 > l)
{
l = j1;
}
if (k1 > l)
{
l = k1;
}
if (l1 > l)
{
l = l1;
}
return l;
}
else
{
l = (p_72810_2_ >> 4) - this.chunkX;
i1 = (p_72810_4_ >> 4) - this.chunkZ;
return this.chunkArray[l][i1].getSavedLightValue(p_72810_1_, p_72810_2_ & 15, p_72810_3_, p_72810_4_ & 15);
}
}
}
else
{
return p_72810_1_.defaultLightValue;
}
}
/**
* is only used on stairs and tilled fields
*/
@SideOnly(Side.CLIENT)
public int getSpecialBlockBrightness(EnumSkyBlock p_72812_1_, int p_72812_2_, int p_72812_3_, int p_72812_4_)
{
if (p_72812_3_ < 0)
{
p_72812_3_ = 0;
}
if (p_72812_3_ >= 256)
{
p_72812_3_ = 255;
}
if (p_72812_3_ >= 0 && p_72812_3_ < 256 && p_72812_2_ >= -30000000 && p_72812_4_ >= -30000000 && p_72812_2_ < 30000000 && p_72812_4_ <= 30000000)
{
int l = (p_72812_2_ >> 4) - this.chunkX;
int i1 = (p_72812_4_ >> 4) - this.chunkZ;
return this.chunkArray[l][i1].getSavedLightValue(p_72812_1_, p_72812_2_ & 15, p_72812_3_, p_72812_4_ & 15);
}
else
{
return p_72812_1_.defaultLightValue;
}
}
/**
* Returns maximum world height.
*/
@SideOnly(Side.CLIENT)
public int getHeight()
{
return 256;
}
@Override
public boolean isSideSolid(int x, int y, int z, ForgeDirection side, boolean _default)
{
if (x < -30000000 || z < -30000000 || x >= 30000000 || z >= 30000000)
{
return _default;
}
return getBlock(x, y, z).isSideSolid(this, x, y, z, side);
}
}