package com.carpentersblocks.data; import static net.minecraftforge.common.util.ForgeDirection.DOWN; import static net.minecraftforge.common.util.ForgeDirection.EAST; import static net.minecraftforge.common.util.ForgeDirection.NORTH; import static net.minecraftforge.common.util.ForgeDirection.SOUTH; import static net.minecraftforge.common.util.ForgeDirection.UP; import static net.minecraftforge.common.util.ForgeDirection.WEST; import java.util.ArrayList; import java.util.List; import net.minecraftforge.common.util.ForgeDirection; public class Stairs { /** * 16-bit data components: * * [0000000000000000] * stairsID */ public final static byte ID_NORMAL_SE = 0; public final static byte ID_NORMAL_NW = 1; public final static byte ID_NORMAL_NE = 2; public final static byte ID_NORMAL_SW = 3; public final static byte ID_NORMAL_NEG_N = 4; public final static byte ID_NORMAL_NEG_S = 5; public final static byte ID_NORMAL_NEG_W = 6; public final static byte ID_NORMAL_NEG_E = 7; public final static byte ID_NORMAL_POS_N = 8; public final static byte ID_NORMAL_POS_S = 9; public final static byte ID_NORMAL_POS_W = 10; public final static byte ID_NORMAL_POS_E = 11; public final static byte ID_NORMAL_INT_NEG_SE = 12; public final static byte ID_NORMAL_INT_NEG_NW = 13; public final static byte ID_NORMAL_INT_NEG_NE = 14; public final static byte ID_NORMAL_INT_NEG_SW = 15; public final static byte ID_NORMAL_INT_POS_SE = 16; public final static byte ID_NORMAL_INT_POS_NW = 17; public final static byte ID_NORMAL_INT_POS_NE = 18; public final static byte ID_NORMAL_INT_POS_SW = 19; public final static byte ID_NORMAL_EXT_NEG_SE = 20; public final static byte ID_NORMAL_EXT_NEG_NW = 21; public final static byte ID_NORMAL_EXT_NEG_NE = 22; public final static byte ID_NORMAL_EXT_NEG_SW = 23; public final static byte ID_NORMAL_EXT_POS_SE = 24; public final static byte ID_NORMAL_EXT_POS_NW = 25; public final static byte ID_NORMAL_EXT_POS_NE = 26; public final static byte ID_NORMAL_EXT_POS_SW = 27; public enum Type { NORMAL_SIDE, NORMAL, NORMAL_INT, NORMAL_EXT } /** Array containing registered stairs. */ public static final Stairs[] stairsList = new Stairs[28]; /** ID of the stairs. */ public final int stairsID; /** Stairs type. */ public final Type stairsType; /** * Holds stairs face shape. * * [DOWN, UP, NORTH, SOUTH, WEST, EAST] */ private final int[] faceShape; /** * If faceShape indicates side is STAGGERED, * this will indicate which corner of face * is the "corner." * * Not currently used. * * Stores MIN/MAX of staggered corner. * Stored as [X/Y], [Z/Y], or [X/Z]. * * [DOWN, UP, NORTH, SOUTH, WEST, EAST] */ private final int[] staggeredCorner; /** * Are the stairs facing up. * A quick reference since it's called often. */ public final boolean isPositive; /** Stairs direction. */ public final List<ForgeDirection> facings; public static final byte NO_FACE = 0; public static final byte FULL = 1; public static final byte STAGGERED = 2; public static final byte MIN_MIN = 1; public static final byte MIN_MAX = 2; public static final byte MAX_MIN = 3; public static final byte MAX_MAX = 4; public Stairs(int stairsID, Type stairsType, ForgeDirection[] facings, int[] faceShape, int[] staggeredCorner) { this.stairsID = stairsID; stairsList[stairsID] = this; this.stairsType = stairsType; this.faceShape = faceShape; this.staggeredCorner = staggeredCorner; this.facings = new ArrayList<ForgeDirection>(); for (ForgeDirection face : facings) { this.facings.add(face); } isPositive = this.facings.contains(UP); } public static final Stairs NORMAL_NW = new Stairs(ID_NORMAL_NW, Type.NORMAL_SIDE, new ForgeDirection[] { NORTH, WEST }, new int[] { STAGGERED, STAGGERED, NO_FACE, FULL, NO_FACE, FULL }, new int[] { MAX_MAX, MAX_MAX, 0, 0, 0, 0 }); public static final Stairs NORMAL_NE = new Stairs(ID_NORMAL_NE, Type.NORMAL_SIDE, new ForgeDirection[] { NORTH, EAST }, new int[] { STAGGERED, STAGGERED, NO_FACE, FULL, FULL, NO_FACE }, new int[] { MIN_MAX, MIN_MAX, 0, 0, 0, 0 }); public static final Stairs NORMAL_SW = new Stairs(ID_NORMAL_SW, Type.NORMAL_SIDE, new ForgeDirection[] { SOUTH, WEST }, new int[] { STAGGERED, STAGGERED, FULL, NO_FACE, NO_FACE, FULL }, new int[] { MAX_MIN, MAX_MIN, 0, 0, 0, 0 }); public static final Stairs NORMAL_SE = new Stairs(ID_NORMAL_SE, Type.NORMAL_SIDE, new ForgeDirection[] { SOUTH, EAST }, new int[] { STAGGERED, STAGGERED, FULL, NO_FACE, FULL, NO_FACE }, new int[] { MIN_MIN, MIN_MIN, 0, 0, 0, 0 }); public static final Stairs NORMAL_NEG_N = new Stairs(ID_NORMAL_NEG_N, Type.NORMAL, new ForgeDirection[] { DOWN, NORTH }, new int[] { NO_FACE, FULL, NO_FACE, FULL, STAGGERED, STAGGERED }, new int[] { 0, 0, 0, 0, MAX_MAX, MAX_MAX }); public static final Stairs NORMAL_NEG_S = new Stairs(ID_NORMAL_NEG_S, Type.NORMAL, new ForgeDirection[] { DOWN, SOUTH }, new int[] { NO_FACE, FULL, FULL, NO_FACE, STAGGERED, STAGGERED }, new int[] { 0, 0, 0, 0, MIN_MAX, MIN_MAX }); public static final Stairs NORMAL_NEG_W = new Stairs(ID_NORMAL_NEG_W, Type.NORMAL, new ForgeDirection[] { DOWN, WEST }, new int[] { NO_FACE, FULL, STAGGERED, STAGGERED, NO_FACE, FULL }, new int[] { 0, 0, MAX_MAX, MAX_MAX, 0, 0 }); public static final Stairs NORMAL_NEG_E = new Stairs(ID_NORMAL_NEG_E, Type.NORMAL, new ForgeDirection[] { DOWN, EAST }, new int[] { NO_FACE, FULL, STAGGERED, STAGGERED, FULL, NO_FACE }, new int[] { 0, 0, MIN_MAX, MIN_MAX, 0, 0 }); public static final Stairs NORMAL_POS_N = new Stairs(ID_NORMAL_POS_N, Type.NORMAL, new ForgeDirection[] { UP, NORTH }, new int[] { FULL, NO_FACE, NO_FACE, FULL, STAGGERED, STAGGERED }, new int[] { 0, 0, 0, 0, MAX_MIN, MAX_MIN }); public static final Stairs NORMAL_POS_S = new Stairs(ID_NORMAL_POS_S, Type.NORMAL, new ForgeDirection[] { UP, SOUTH }, new int[] { FULL, NO_FACE, FULL, NO_FACE, STAGGERED, STAGGERED }, new int[] { 0, 0, 0, 0, MIN_MIN, MIN_MIN }); public static final Stairs NORMAL_POS_W = new Stairs(ID_NORMAL_POS_W, Type.NORMAL, new ForgeDirection[] { UP, WEST }, new int[] { FULL, NO_FACE, STAGGERED, STAGGERED, NO_FACE, FULL }, new int[] { 0, 0, MAX_MIN, MAX_MIN, 0, 0 }); public static final Stairs NORMAL_POS_E = new Stairs(ID_NORMAL_POS_E, Type.NORMAL, new ForgeDirection[] { UP, EAST }, new int[] { FULL, NO_FACE, STAGGERED, STAGGERED, FULL, NO_FACE }, new int[] { 0, 0, MIN_MIN, MIN_MIN, 0, 0 }); public static final Stairs NORMAL_INT_NEG_NW = new Stairs(ID_NORMAL_INT_NEG_NW, Type.NORMAL_INT, new ForgeDirection[] { DOWN, NORTH, WEST }, new int[] { NO_FACE, FULL, STAGGERED, FULL, STAGGERED, FULL }, new int[] { 0, 0, MAX_MAX, 0, MAX_MAX, 0 }); public static final Stairs NORMAL_INT_NEG_NE = new Stairs(ID_NORMAL_INT_NEG_NE, Type.NORMAL_INT, new ForgeDirection[] { DOWN, NORTH, EAST }, new int[] { NO_FACE, FULL, STAGGERED, FULL, FULL, STAGGERED }, new int[] { 0, 0, MIN_MAX, 0, 0, MAX_MAX }); public static final Stairs NORMAL_INT_NEG_SW = new Stairs(ID_NORMAL_INT_NEG_SW, Type.NORMAL_INT, new ForgeDirection[] { DOWN, SOUTH, WEST }, new int[] { NO_FACE, FULL, FULL, STAGGERED, STAGGERED, FULL }, new int[] { 0, 0, 0, MAX_MAX, MIN_MAX, 0 }); public static final Stairs NORMAL_INT_NEG_SE = new Stairs(ID_NORMAL_INT_NEG_SE, Type.NORMAL_INT, new ForgeDirection[] { DOWN, SOUTH, EAST }, new int[] { NO_FACE, FULL, FULL, STAGGERED, FULL, STAGGERED }, new int[] { 0, 0, 0, MIN_MAX, 0, MIN_MAX }); public static final Stairs NORMAL_INT_POS_NW = new Stairs(ID_NORMAL_INT_POS_NW, Type.NORMAL_INT, new ForgeDirection[] { UP, NORTH, WEST }, new int[] { FULL, NO_FACE, STAGGERED, FULL, STAGGERED, FULL }, new int[] { 0, 0, MAX_MIN, 0, MAX_MIN, 0 }); public static final Stairs NORMAL_INT_POS_NE = new Stairs(ID_NORMAL_INT_POS_NE, Type.NORMAL_INT, new ForgeDirection[] { UP, NORTH, EAST }, new int[] { FULL, NO_FACE, STAGGERED, FULL, FULL, STAGGERED }, new int[] { 0, 0, MIN_MIN, 0, 0, MAX_MIN }); public static final Stairs NORMAL_INT_POS_SW = new Stairs(ID_NORMAL_INT_POS_SW, Type.NORMAL_INT, new ForgeDirection[] { UP, SOUTH, WEST }, new int[] { FULL, NO_FACE, FULL, STAGGERED, STAGGERED, FULL }, new int[] { 0, 0, 0, MAX_MIN, MIN_MIN, 0 }); public static final Stairs NORMAL_INT_POS_SE = new Stairs(ID_NORMAL_INT_POS_SE, Type.NORMAL_INT, new ForgeDirection[] { UP, SOUTH, EAST }, new int[] { FULL, NO_FACE, FULL, STAGGERED, FULL, STAGGERED }, new int[] { 0, 0, 0, MIN_MIN, 0, MIN_MIN }); public static final Stairs NORMAL_EXT_NEG_NW = new Stairs(ID_NORMAL_EXT_NEG_NW, Type.NORMAL_EXT, new ForgeDirection[] { DOWN, NORTH, WEST }, new int[] { NO_FACE, FULL, NO_FACE, STAGGERED, NO_FACE, STAGGERED }, new int[] { 0, 0, 0, MAX_MAX, 0, MAX_MAX }); public static final Stairs NORMAL_EXT_NEG_NE = new Stairs(ID_NORMAL_EXT_NEG_NE, Type.NORMAL_EXT, new ForgeDirection[] { DOWN, NORTH, EAST }, new int[] { NO_FACE, FULL, NO_FACE, STAGGERED, STAGGERED, NO_FACE }, new int[] { 0, 0, 0, MIN_MAX, MAX_MAX, 0 }); public static final Stairs NORMAL_EXT_NEG_SW = new Stairs(ID_NORMAL_EXT_NEG_SW, Type.NORMAL_EXT, new ForgeDirection[] { DOWN, SOUTH, WEST }, new int[] { NO_FACE, FULL, STAGGERED, NO_FACE, NO_FACE, STAGGERED }, new int[] { 0, 0, MAX_MAX, 0, 0, MIN_MAX }); public static final Stairs NORMAL_EXT_NEG_SE = new Stairs(ID_NORMAL_EXT_NEG_SE, Type.NORMAL_EXT, new ForgeDirection[] { DOWN, SOUTH, EAST }, new int[] { NO_FACE, FULL, STAGGERED, NO_FACE, STAGGERED, NO_FACE }, new int[] { 0, 0, MIN_MAX, 0, MIN_MAX, 0 }); public static final Stairs NORMAL_EXT_POS_NW = new Stairs(ID_NORMAL_EXT_POS_NW, Type.NORMAL_EXT, new ForgeDirection[] { UP, NORTH, WEST }, new int[] { FULL, NO_FACE, NO_FACE, STAGGERED, NO_FACE, STAGGERED }, new int[] { 0, 0, 0, MAX_MIN, 0, MAX_MIN }); public static final Stairs NORMAL_EXT_POS_NE = new Stairs(ID_NORMAL_EXT_POS_NE, Type.NORMAL_EXT, new ForgeDirection[] { UP, NORTH, EAST }, new int[] { FULL, NO_FACE, NO_FACE, STAGGERED, STAGGERED, NO_FACE }, new int[] { 0, 0, 0, MIN_MIN, MAX_MIN, 0 }); public static final Stairs NORMAL_EXT_POS_SW = new Stairs(ID_NORMAL_EXT_POS_SW, Type.NORMAL_EXT, new ForgeDirection[] { UP, SOUTH, WEST }, new int[] { FULL, NO_FACE, STAGGERED, NO_FACE, NO_FACE, STAGGERED }, new int[] { 0, 0, MAX_MIN, 0, 0, MIN_MIN }); public static final Stairs NORMAL_EXT_POS_SE = new Stairs(ID_NORMAL_EXT_POS_SE, Type.NORMAL_EXT, new ForgeDirection[] { UP, SOUTH, EAST }, new int[] { FULL, NO_FACE, STAGGERED, NO_FACE, STAGGERED, NO_FACE }, new int[] { 0, 0, MIN_MIN, 0, MIN_MIN, 0 }); public boolean isFaceFull(ForgeDirection side) { return faceShape[side.ordinal()] == FULL; } public int staggeredOrientation(ForgeDirection side) { return staggeredCorner[side.ordinal()]; } }