package net.minecraft.world; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.chunk.Chunk; public class ChunkCache implements IBlockAccess { protected int chunkX; protected int chunkZ; protected Chunk[][] chunkArray; /** set by !chunk.getAreLevelsEmpty */ protected boolean hasExtendedLevels; /** Reference to the World object. */ protected World worldObj; private static final String __OBFID = "CL_00000155"; public ChunkCache(World worldIn, BlockPos p_i45746_2_, BlockPos p_i45746_3_, int p_i45746_4_) { this.worldObj = worldIn; this.chunkX = p_i45746_2_.getX() - p_i45746_4_ >> 4; this.chunkZ = p_i45746_2_.getZ() - p_i45746_4_ >> 4; int var5 = p_i45746_3_.getX() + p_i45746_4_ >> 4; int var6 = p_i45746_3_.getZ() + p_i45746_4_ >> 4; this.chunkArray = new Chunk[var5 - this.chunkX + 1][var6 - this.chunkZ + 1]; this.hasExtendedLevels = true; int var7; int var8; for (var7 = this.chunkX; var7 <= var5; ++var7) { for (var8 = this.chunkZ; var8 <= var6; ++var8) { this.chunkArray[var7 - this.chunkX][var8 - this.chunkZ] = worldIn.getChunkFromChunkCoords(var7, var8); } } for (var7 = p_i45746_2_.getX() >> 4; var7 <= p_i45746_3_.getX() >> 4; ++var7) { for (var8 = p_i45746_2_.getZ() >> 4; var8 <= p_i45746_3_.getZ() >> 4; ++var8) { Chunk var9 = this.chunkArray[var7 - this.chunkX][var8 - this.chunkZ]; if (var9 != null && !var9.getAreLevelsEmpty(p_i45746_2_.getY(), p_i45746_3_.getY())) { this.hasExtendedLevels = false; } } } } /** * set by !chunk.getAreLevelsEmpty */ public boolean extendedLevelsInChunkCache() { return this.hasExtendedLevels; } public TileEntity getTileEntity(BlockPos pos) { int var2 = (pos.getX() >> 4) - this.chunkX; int var3 = (pos.getZ() >> 4) - this.chunkZ; return this.chunkArray[var2][var3].func_177424_a(pos, Chunk.EnumCreateEntityType.IMMEDIATE); } public int getCombinedLight(BlockPos p_175626_1_, int p_175626_2_) { int var3 = this.func_175629_a(EnumSkyBlock.SKY, p_175626_1_); int var4 = this.func_175629_a(EnumSkyBlock.BLOCK, p_175626_1_); if (var4 < p_175626_2_) { var4 = p_175626_2_; } return var3 << 20 | var4 << 4; } public IBlockState getBlockState(BlockPos pos) { if (pos.getY() >= 0 && pos.getY() < 256) { int var2 = (pos.getX() >> 4) - this.chunkX; int var3 = (pos.getZ() >> 4) - this.chunkZ; if (var2 >= 0 && var2 < this.chunkArray.length && var3 >= 0 && var3 < this.chunkArray[var2].length) { Chunk var4 = this.chunkArray[var2][var3]; if (var4 != null) { return var4.getBlockState(pos); } } } return Blocks.air.getDefaultState(); } public BiomeGenBase getBiomeGenForCoords(BlockPos pos) { return this.worldObj.getBiomeGenForCoords(pos); } private int func_175629_a(EnumSkyBlock p_175629_1_, BlockPos p_175629_2_) { if (p_175629_1_ == EnumSkyBlock.SKY && this.worldObj.provider.getHasNoSky()) { return 0; } else if (p_175629_2_.getY() >= 0 && p_175629_2_.getY() < 256) { int var3; if (this.getBlockState(p_175629_2_).getBlock().getUseNeighborBrightness()) { var3 = 0; EnumFacing[] var9 = EnumFacing.values(); int var5 = var9.length; for (int var6 = 0; var6 < var5; ++var6) { EnumFacing var7 = var9[var6]; int var8 = this.func_175628_b(p_175629_1_, p_175629_2_.offset(var7)); if (var8 > var3) { var3 = var8; } if (var3 >= 15) { return var3; } } return var3; } else { var3 = (p_175629_2_.getX() >> 4) - this.chunkX; int var4 = (p_175629_2_.getZ() >> 4) - this.chunkZ; return this.chunkArray[var3][var4].getLightFor(p_175629_1_, p_175629_2_); } } else { return p_175629_1_.defaultLightValue; } } public boolean isAirBlock(BlockPos pos) { return this.getBlockState(pos).getBlock().getMaterial() == Material.air; } public int func_175628_b(EnumSkyBlock p_175628_1_, BlockPos p_175628_2_) { if (p_175628_2_.getY() >= 0 && p_175628_2_.getY() < 256) { int var3 = (p_175628_2_.getX() >> 4) - this.chunkX; int var4 = (p_175628_2_.getZ() >> 4) - this.chunkZ; return this.chunkArray[var3][var4].getLightFor(p_175628_1_, p_175628_2_); } else { return p_175628_1_.defaultLightValue; } } public int getStrongPower(BlockPos pos, EnumFacing direction) { IBlockState var3 = this.getBlockState(pos); return var3.getBlock().isProvidingStrongPower(this, pos, var3, direction); } public WorldType getWorldType() { return this.worldObj.getWorldType(); } }