001 package net.minecraft.world.chunk;
002
003 public class NibbleArray
004 {
005 /**
006 * Byte array of data stored in this holder. Possibly a light map or some chunk data. Data is accessed in 4-bit
007 * pieces.
008 */
009 public final byte[] data;
010
011 /**
012 * Log base 2 of the chunk height (128); applied as a shift on Z coordinate
013 */
014 private final int depthBits;
015
016 /**
017 * Log base 2 of the chunk height (128) * width (16); applied as a shift on X coordinate
018 */
019 private final int depthBitsPlusFour;
020
021 public NibbleArray(int par1, int par2)
022 {
023 this.data = new byte[par1 >> 1];
024 this.depthBits = par2;
025 this.depthBitsPlusFour = par2 + 4;
026 }
027
028 public NibbleArray(byte[] par1ArrayOfByte, int par2)
029 {
030 this.data = par1ArrayOfByte;
031 this.depthBits = par2;
032 this.depthBitsPlusFour = par2 + 4;
033 }
034
035 /**
036 * Returns the nibble of data corresponding to the passed in x, y, z. y is at most 6 bits, z is at most 4.
037 */
038 public int get(int par1, int par2, int par3)
039 {
040 int var4 = par2 << this.depthBitsPlusFour | par3 << this.depthBits | par1;
041 int var5 = var4 >> 1;
042 int var6 = var4 & 1;
043 return var6 == 0 ? this.data[var5] & 15 : this.data[var5] >> 4 & 15;
044 }
045
046 /**
047 * Arguments are x, y, z, val. Sets the nibble of data at x << 11 | z << 7 | y to val.
048 */
049 public void set(int par1, int par2, int par3, int par4)
050 {
051 int var5 = par2 << this.depthBitsPlusFour | par3 << this.depthBits | par1;
052 int var6 = var5 >> 1;
053 int var7 = var5 & 1;
054
055 if (var7 == 0)
056 {
057 this.data[var6] = (byte)(this.data[var6] & 240 | par4 & 15);
058 }
059 else
060 {
061 this.data[var6] = (byte)(this.data[var6] & 15 | (par4 & 15) << 4);
062 }
063 }
064 }