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 }