package net.minecraft.world.chunk.storage; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.world.chunk.NibbleArray; public class ExtendedBlockStorage { /** * Contains the bottom-most Y block represented by this ExtendedBlockStorage. Typically a multiple of 16. */ private int yBase; /** * A total count of the number of non-air blocks in this block storage's Chunk. */ private int blockRefCount; /** * Contains the number of blocks in this block storage's parent chunk that require random ticking. Used to cull the * Chunk from random tick updates for performance reasons. */ private int tickRefCount; private char[] data; /** The NibbleArray containing a block of Block-light data. */ private NibbleArray blocklightArray; /** The NibbleArray containing a block of Sky-light data. */ private NibbleArray skylightArray; private static final String __OBFID = "CL_00000375"; public ExtendedBlockStorage(int y, boolean storeSkylight) { this.yBase = y; this.data = new char[4096]; this.blocklightArray = new NibbleArray(); if (storeSkylight) { this.skylightArray = new NibbleArray(); } } public IBlockState get(int x, int y, int z) { IBlockState var4 = (IBlockState)Block.BLOCK_STATE_IDS.getByValue(this.data[y << 8 | z << 4 | x]); return var4 != null ? var4 : Blocks.air.getDefaultState(); } public void set(int x, int y, int z, IBlockState state) { IBlockState var5 = this.get(x, y, z); Block var6 = var5.getBlock(); Block var7 = state.getBlock(); if (var6 != Blocks.air) { --this.blockRefCount; if (var6.getTickRandomly()) { --this.tickRefCount; } } if (var7 != Blocks.air) { ++this.blockRefCount; if (var7.getTickRandomly()) { ++this.tickRefCount; } } this.data[y << 8 | z << 4 | x] = (char)Block.BLOCK_STATE_IDS.get(state); } /** * Returns the block for a location in a chunk, with the extended ID merged from a byte array and a NibbleArray to * form a full 12-bit block ID. */ public Block getBlockByExtId(int x, int y, int z) { return this.get(x, y, z).getBlock(); } /** * Returns the metadata associated with the block at the given coordinates in this ExtendedBlockStorage. */ public int getExtBlockMetadata(int x, int y, int z) { IBlockState var4 = this.get(x, y, z); return var4.getBlock().getMetaFromState(var4); } /** * Returns whether or not this block storage's Chunk is fully empty, based on its internal reference count. */ public boolean isEmpty() { return this.blockRefCount == 0; } /** * Returns whether or not this block storage's Chunk will require random ticking, used to avoid looping through * random block ticks when there are no blocks that would randomly tick. */ public boolean getNeedsRandomTick() { return this.tickRefCount > 0; } /** * Returns the Y location of this ExtendedBlockStorage. */ public int getYLocation() { return this.yBase; } /** * Sets the saved Sky-light value in the extended block storage structure. */ public void setExtSkylightValue(int x, int y, int z, int value) { this.skylightArray.set(x, y, z, value); } /** * Gets the saved Sky-light value in the extended block storage structure. */ public int getExtSkylightValue(int x, int y, int z) { return this.skylightArray.get(x, y, z); } /** * Sets the saved Block-light value in the extended block storage structure. */ public void setExtBlocklightValue(int x, int y, int z, int value) { this.blocklightArray.set(x, y, z, value); } /** * Gets the saved Block-light value in the extended block storage structure. */ public int getExtBlocklightValue(int x, int y, int z) { return this.blocklightArray.get(x, y, z); } public void removeInvalidBlocks() { this.blockRefCount = 0; this.tickRefCount = 0; for (int var1 = 0; var1 < 16; ++var1) { for (int var2 = 0; var2 < 16; ++var2) { for (int var3 = 0; var3 < 16; ++var3) { Block var4 = this.getBlockByExtId(var1, var2, var3); if (var4 != Blocks.air) { ++this.blockRefCount; if (var4.getTickRandomly()) { ++this.tickRefCount; } } } } } } public char[] getData() { return this.data; } public void setData(char[] dataArray) { this.data = dataArray; } /** * Returns the NibbleArray instance containing Block-light data. */ public NibbleArray getBlocklightArray() { return this.blocklightArray; } /** * Returns the NibbleArray instance containing Sky-light data. */ public NibbleArray getSkylightArray() { return this.skylightArray; } /** * Sets the NibbleArray instance used for Block-light values in this particular storage block. */ public void setBlocklightArray(NibbleArray newBlocklightArray) { this.blocklightArray = newBlocklightArray; } /** * Sets the NibbleArray instance used for Sky-light values in this particular storage block. */ public void setSkylightArray(NibbleArray newSkylightArray) { this.skylightArray = newSkylightArray; } }