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

package com.hypixel.hytale.server.npc.blackboard.view;

import com.hypixel.hytale.math.util.MathUtil;
import javax.annotation.Nonnull;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.math.util.ChunkUtil;

public abstract class BlockRegionView<ViewType extends IBlackboardView<ViewType>> implements IBlackboardView<ViewType>
{
    public static final int BITS = 7;
    public static final int SIZE = 128;
    public static final int SIZE_MASK = 127;
    public static final int BITS2 = 14;
    
    public static int toRegionalBlackboardCoordinate(final int pos) {
        return pos >> 7;
    }
    
    public static int toWorldCoordinate(final int pos) {
        return pos << 7;
    }
    
    public static int chunkToRegionalBlackboardCoordinate(final int pos) {
        return pos >> 2;
    }
    
    public static long indexView(final int x, final int z) {
        return ChunkUtil.indexChunk(x, z);
    }
    
    public static int indexSection(final int y) {
        return y >> 7;
    }
    
    public static int xOfViewIndex(final long index) {
        return ChunkUtil.xOfChunkIndex(index);
    }
    
    public static int zOfViewIndex(final long index) {
        return ChunkUtil.zOfChunkIndex(index);
    }
    
    public static long indexViewFromChunkCoordinates(final int x, final int z) {
        return indexView(toRegionalBlackboardCoordinate(x), toRegionalBlackboardCoordinate(z));
    }
    
    public static long indexViewFromWorldPosition(@Nonnull final Vector3d pos) {
        final int blackboardX = toRegionalBlackboardCoordinate(MathUtil.floor(pos.getX()));
        final int blackboardZ = toRegionalBlackboardCoordinate(MathUtil.floor(pos.getZ()));
        return indexView(blackboardX, blackboardZ);
    }
    
    public static int indexBlock(final int x, final int y, final int z) {
        return (y & 0x7F) << 14 | (z & 0x7F) << 7 | (x & 0x7F);
    }
    
    public static int xFromIndex(final int index) {
        return index & 0x7F;
    }
    
    public static int yFromIndex(final int index) {
        return index >> 14 & 0x7F;
    }
    
    public static int zFromIndex(final int index) {
        return index >> 7 & 0x7F;
    }
}
