package buildcraft.api.core; import com.google.common.collect.Maps; import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTBase.NBTPrimitive; import net.minecraft.nbt.NBTTagString; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; import java.util.Locale; import java.util.Map; public enum EnumPipePart implements IStringSerializable,INetworkLoadable_BC8<EnumPipePart> { DOWN(EnumFacing.DOWN), UP(EnumFacing.UP), NORTH(EnumFacing.NORTH), SOUTH(EnumFacing.SOUTH), WEST(EnumFacing.WEST), EAST(EnumFacing.EAST), /** CENTER, UNKNOWN and ALL are all valid uses of this constant. */ CENTER(null); private static final Map<EnumFacing, EnumPipePart> facingMap = Maps.newEnumMap(EnumFacing.class); private static final Map<String, EnumPipePart> nameMap = Maps.newHashMap(); private static final int MAX_VALUES = values().length; public final EnumFacing face; static { for (EnumPipePart part : values()) { nameMap.put(part.name(), part); if (part.face != null) facingMap.put(part.face, part); } } public static int ordinal(EnumFacing face) { return face == null ? 6 : face.ordinal(); } public static EnumPipePart fromFacing(EnumFacing face) { if (face == null) return EnumPipePart.CENTER; return facingMap.get(face); } public static EnumPipePart[] validFaces() { return new EnumPipePart[] { DOWN, UP, NORTH, SOUTH, WEST, EAST }; } public static EnumPipePart fromMeta(int meta) { if (meta < 0 || meta >= MAX_VALUES) return EnumPipePart.CENTER; return values()[meta]; } private EnumPipePart(EnumFacing face) { this.face = face; } public int getIndex() { if (face == null) return 6; return face.getIndex(); } @Override public String getName() { return name().toLowerCase(Locale.ROOT); } public EnumPipePart next() { switch (this) { case DOWN: return EAST; case EAST: return NORTH; case NORTH: return SOUTH; case SOUTH: return UP; case UP: return WEST; case WEST: return DOWN; default: return DOWN; } } public EnumPipePart opposite() { if (this == CENTER) return CENTER; return fromFacing(face.getOpposite()); } public static EnumPipePart readFromNBT(NBTBase base) { if (base == null) return CENTER; if (base instanceof NBTTagString) { NBTTagString nbtString = (NBTTagString) base; String string = nbtString.getString(); return nameMap.containsKey(string) ? nameMap.get(string) : CENTER; } else { byte ord = ((NBTPrimitive) base).getByte(); if (ord < 0 || ord > 6) return CENTER; return values()[ord]; } } public NBTBase writeToNBT() { return new NBTTagString(name()); } @Override public EnumPipePart readFromByteBuf(ByteBuf buf) { byte ord = buf.readByte(); return fromMeta(ord); } @Override public void writeToByteBuf(ByteBuf buf) { buf.writeByte(ordinal()); } }