/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.blocks.signals; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import mods.railcraft.api.signals.SignalAspect; import mods.railcraft.common.util.network.IGuiReturnHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; /** * * @author CovertJaguar <http://www.railcraft.info/> */ public abstract class TileBoxActionManager extends TileBoxSecured implements IAspectActionManager, IGuiReturnHandler { private final boolean[] powerOnAspects = new boolean[SignalAspect.values().length]; public TileBoxActionManager() { powerOnAspects[SignalAspect.GREEN.ordinal()] = true; } @Override public boolean doesActionOnAspect(SignalAspect aspect) { return powerOnAspects[aspect.ordinal()]; } @Override public void doActionOnAspect(SignalAspect aspect, boolean trigger) { powerOnAspects[aspect.ordinal()] = trigger; } @Override public void writeToNBT(NBTTagCompound data) { super.writeToNBT(data); byte[] array = new byte[powerOnAspects.length]; for (int i = 0; i < powerOnAspects.length; i++) { array[i] = (byte) (powerOnAspects[i] ? 1 : 0); } data.setByteArray("powerOnAspects", array); } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); if (data.hasKey("PowerOnAspect")) { byte[] array = data.getByteArray("PowerOnAspect"); for (int i = 0; i < powerOnAspects.length; i++) { powerOnAspects[i] = array[i] == 1; } } else if (data.hasKey("powerOnAspects")) { byte[] array = data.getByteArray("powerOnAspects"); for (int i = 0; i < powerOnAspects.length; i++) { powerOnAspects[i] = array[i] == 1; } } } @Override public void writePacketData(DataOutputStream data) throws IOException { super.writePacketData(data); writeActionInfo(data); } @Override public void readPacketData(DataInputStream data) throws IOException { super.readPacketData(data); readActionInfo(data.readByte()); } @Override public void writeGuiData(DataOutputStream data) throws IOException { super.writeGuiData(data); writeActionInfo(data); } @Override public void readGuiData(DataInputStream data, EntityPlayer sender) throws IOException { super.readGuiData(data, sender); byte bits = data.readByte(); if (sender == null || canAccess(sender.getGameProfile())) { readActionInfo(bits); } } private void writeActionInfo(DataOutputStream data) throws IOException { byte bits = 0; for (int i = 0; i < powerOnAspects.length; i++) { bits |= (powerOnAspects[i] ? 1 : 0) << i; } data.writeByte(bits); } private void readActionInfo(byte bits) { for (int bit = 0; bit < powerOnAspects.length; bit++) { powerOnAspects[bit] = ((bits >> bit) & 1) == 1; } } }