    001package net.minecraft.world.chunk;
    002
    003public 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 l = par2 << this.depthBitsPlusFour | par3 << this.depthBits | par1;
    041        int i1 = l >> 1;
    042        int j1 = l & 1;
    043        return j1 == 0 ? this.data[i1] & 15 : this.data[i1] >> 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 i1 = par2 << this.depthBitsPlusFour | par3 << this.depthBits | par1;
    052        int j1 = i1 >> 1;
    053        int k1 = i1 & 1;
    054
    055        if (k1 == 0)
    056        {
    057            this.data[j1] = (byte)(this.data[j1] & 240 | par4 & 15);
    058        }
    059        else
    060        {
    061            this.data[j1] = (byte)(this.data[j1] & 15 | (par4 & 15) << 4);
    062        }
    063    }
    064}