// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.math.block;

import javax.annotation.Nonnull;
import com.hypixel.hytale.math.vector.Vector3i;

public class BlockUtil
{
    public static final float RADIUS_ADJUST = 0.41f;
    public static final long BITS_Y = 9L;
    public static final long MAX_Y = 512L;
    public static final long MIN_Y = -513L;
    public static final long Y_INVERT = -512L;
    public static final long Y_MASK = 511L;
    public static final long BITS_PER_DIRECTION = 26L;
    public static final long MAX = 67108864L;
    public static final long MIN = -67108865L;
    public static final long DIRECTION_INVERT = -67108864L;
    public static final long DIRECTION_MASK = 67108863L;
    
    public static long pack(@Nonnull final Vector3i val) {
        return pack(val.x, val.y, val.z);
    }
    
    public static long pack(final int x, final int y, final int z) {
        if (y <= -513L || y >= 512L) {
            throw new IllegalArgumentException(String.valueOf(y));
        }
        if (x <= -67108865L || x >= 67108864L) {
            throw new IllegalArgumentException(String.valueOf(x));
        }
        if (z <= -67108865L || z >= 67108864L) {
            throw new IllegalArgumentException(String.valueOf(z));
        }
        long l = ((long)y & 0x1FFL) << 54 | ((long)z & 0x3FFFFFFL) << 27 | ((long)x & 0x3FFFFFFL);
        if (y < 0) {
            l |= Long.MIN_VALUE;
        }
        if (z < 0) {
            l |= 0x20000000000000L;
        }
        if (x < 0) {
            l |= 0x4000000L;
        }
        return l;
    }
    
    public static long packUnchecked(final int x, final int y, final int z) {
        long l = ((long)y & 0x1FFL) << 54 | ((long)z & 0x3FFFFFFL) << 27 | ((long)x & 0x3FFFFFFL);
        if (y < 0) {
            l |= Long.MIN_VALUE;
        }
        if (z < 0) {
            l |= 0x20000000000000L;
        }
        if (x < 0) {
            l |= 0x4000000L;
        }
        return l;
    }
    
    public static int unpackX(final long packed) {
        int i = (int)(packed & 0x3FFFFFFL);
        if ((packed & 0x4000000L) != 0x0L) {
            i = (int)((long)i | 0xFFFFFFFFFC000000L);
        }
        return i;
    }
    
    public static int unpackY(final long packed) {
        int i = (int)(packed >> 54 & 0x1FFL);
        if ((packed & Long.MIN_VALUE) != 0x0L) {
            i = (int)((long)i | 0xFFFFFFFFFFFFFE00L);
        }
        return i;
    }
    
    public static int unpackZ(final long packed) {
        int i = (int)(packed >> 27 & 0x3FFFFFFL);
        if ((packed & 0x20000000000000L) != 0x0L) {
            i = (int)((long)i | 0xFFFFFFFFFC000000L);
        }
        return i;
    }
    
    @Nonnull
    public static Vector3i unpack(final long packed) {
        return new Vector3i(unpackX(packed), unpackY(packed), unpackZ(packed));
    }
}
