    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    }