Java tutorial
package buildcraftAdditions.api.configurableOutput; import java.util.Collections; import java.util.EnumMap; import java.util.EnumSet; import io.netty.buffer.ByteBuf; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; import buildcraftAdditions.api.nbt.INBTSaveable; import buildcraftAdditions.api.networking.ISyncObject; /** * Copyright (c) 2014-2015, AEnterprise * http://buildcraftadditions.wordpress.com/ * Buildcraft Additions is distributed under the terms of GNU GPL v3.0 * Please check the contents of the license located in * http://buildcraftadditions.wordpress.com/wiki/licensing-stuff/ */ public class SideConfiguration implements ISyncObject, INBTSaveable { private static final EnumSet<ForgeDirection> VALID_DIRECTIONS = EnumSet.noneOf(ForgeDirection.class); private final EnumMap<ForgeDirection, EnumSideStatus> configurations = new EnumMap<ForgeDirection, EnumSideStatus>( ForgeDirection.class); private final EnumMap<ForgeDirection, EnumPriority> priorities = new EnumMap<ForgeDirection, EnumPriority>( ForgeDirection.class); public SideConfiguration() { this(EnumSideStatus.BOTH, EnumPriority.NORMAL); } public SideConfiguration(EnumSideStatus status) { this(status, EnumPriority.NORMAL); } public SideConfiguration(EnumPriority priority) { this(EnumSideStatus.BOTH, priority); } public SideConfiguration(EnumSideStatus status, EnumPriority priority) { setAllStatus(status); setAllPriority(priority); } private static boolean isValidDirection(ForgeDirection direction) { return direction != null && VALID_DIRECTIONS.contains(direction); } static { Collections.addAll(VALID_DIRECTIONS, ForgeDirection.VALID_DIRECTIONS); } @Override public void writeToByteBuff(ByteBuf buf) { for (ForgeDirection direction : VALID_DIRECTIONS) { buf.writeByte(getStatus(direction).ordinal()); buf.writeByte(getPriority(direction).ordinal()); } } @Override public void readFromByteBuff(ByteBuf buf) { for (ForgeDirection direction : VALID_DIRECTIONS) { setStatus(EnumSideStatus.values()[buf.readByte()], direction); setPriority(EnumPriority.values()[buf.readByte()], direction); } } //TODO: Remove Integer reading. @Override public void readFromNBT(NBTTagCompound tag) { for (ForgeDirection direction : VALID_DIRECTIONS) { if (tag.hasKey("configuration" + direction.ordinal(), Constants.NBT.TAG_INT)) setStatus(EnumSideStatus.values()[tag.getInteger("configuration" + direction.ordinal())], direction); if (tag.hasKey("configuration" + direction.ordinal(), Constants.NBT.TAG_BYTE)) setStatus(EnumSideStatus.values()[tag.getByte("configuration" + direction.ordinal())], direction); if (tag.hasKey("priority" + direction.ordinal(), Constants.NBT.TAG_INT)) setPriority(EnumPriority.values()[tag.getInteger("priority" + direction.ordinal())], direction); if (tag.hasKey("priority" + direction.ordinal(), Constants.NBT.TAG_BYTE)) setPriority(EnumPriority.values()[tag.getByte("priority" + direction.ordinal())], direction); } } @Override public void writeToNBT(NBTTagCompound tag) { for (ForgeDirection direction : VALID_DIRECTIONS) { tag.setByte("configuration" + direction.ordinal(), (byte) (0xFF & getStatus(direction).ordinal())); tag.setByte("priority" + direction.ordinal(), (byte) (0xFF & getPriority(direction).ordinal())); } } public void load(IConfigurableOutput configurableOutput) { configurations.putAll(configurableOutput.getSideConfiguration().configurations); priorities.putAll(configurableOutput.getSideConfiguration().priorities); } public void load(SideConfiguration configuration) { configurations.putAll(configuration.configurations); priorities.putAll(configuration.priorities); } public boolean canReceive(ForgeDirection side) { return getStatus(side).canReceive(); } public boolean canSend(ForgeDirection side) { return getStatus(side).canSend(); } public void changeStatus(ForgeDirection side) { setStatus(getNextStatus(side), side); } public void changePriority(ForgeDirection side) { setPriority(getNextPriority(side), side); } public EnumSideStatus getStatus(ForgeDirection side) { return isValidDirection(side) ? configurations.get(side) : EnumSideStatus.DISABLED; } public EnumSideStatus getNextStatus(ForgeDirection side) { return getStatus(side).getNextStatus(); } public EnumPriority getPriority(ForgeDirection side) { return isValidDirection(side) ? priorities.get(side) : EnumPriority.NORMAL; } public EnumPriority getNextPriority(ForgeDirection side) { return getPriority(side).getNextPriority(); } public void setStatus(EnumSideStatus status, ForgeDirection side) { if (isValidDirection(side)) configurations.put(side, status); } public void setPriority(EnumPriority priority, ForgeDirection side) { if (isValidDirection(side)) priorities.put(side, priority); } public void setAllStatus(EnumSideStatus status) { for (ForgeDirection side : VALID_DIRECTIONS) setStatus(status, side); } public void setAllPriority(EnumPriority priority) { for (ForgeDirection side : VALID_DIRECTIONS) setPriority(priority, side); } public void invalidate() { setAllStatus(EnumSideStatus.BOTH); setAllPriority(EnumPriority.NORMAL); } @Override public String toString() { String string = "SideConfiguration[ "; for (ForgeDirection direction : VALID_DIRECTIONS) { string += direction.name() + ":{ "; string += getStatus(direction) + ", "; string += getPriority(direction) + " }, "; } return string + " ]"; } }