/*
* 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 mods.railcraft.api.signals.IReceiverTile;
import mods.railcraft.api.signals.SignalAspect;
import mods.railcraft.api.signals.SignalController;
import mods.railcraft.api.signals.SimpleSignalReceiver;
import mods.railcraft.api.tracks.ITrackSwitch;
import mods.railcraft.common.gui.EnumGui;
import mods.railcraft.common.gui.GuiHandler;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.network.IGuiReturnHandler;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class TileSwitchMotor extends TileSwitchSecured implements IAspectActionManager, IGuiReturnHandler, IReceiverTile {
private final SimpleSignalReceiver receiver = new SimpleSignalReceiver(getLocalizationTag(), this);
private boolean[] switchOnAspects = new boolean[SignalAspect.values().length];
private boolean switchAspect;
private boolean switchOnRedstone = true;
public TileSwitchMotor() {
switchOnAspects[SignalAspect.RED.ordinal()] = true;
}
@Override
public EnumSignal getSignalType() {
return EnumSignal.SWITCH_MOTOR;
}
@Override
public boolean blockActivated(int side, EntityPlayer player) {
if (Game.isHost(worldObj))
GuiHandler.openGui(EnumGui.SWITCH_MOTOR, player, worldObj, xCoord, yCoord, zCoord);
return true;
}
@Override
public void updateEntity() {
super.updateEntity();
if (Game.isNotHost(worldObj)) {
receiver.tickClient();
return;
}
receiver.tickServer();
boolean active = isSwitchAspect();
if (switchAspect != active) {
switchAspect = active;
}
}
@Override
public void onControllerAspectChange(SignalController con, SignalAspect aspect) {
}
@Override
public void onNeighborBlockChange(Block block) {
super.onNeighborBlockChange(block);
boolean power = isBeingPoweredByRedstone();
if (isPowered() != power) {
setPowered(power);
}
}
@Override
public boolean canConnectRedstone(int dir) {
return true;
}
private boolean isSwitchAspect() {
return switchOnAspects[receiver.getAspect().ordinal()];
}
@Override
public void writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
byte[] array = new byte[switchOnAspects.length];
for (int i = 0; i < switchOnAspects.length; i++) {
array[i] = (byte) (switchOnAspects[i] ? 1 : 0);
}
data.setByteArray("PowerOnAspect", array);
data.setBoolean("switchAspect", switchAspect);
data.setBoolean("switchOnRedstone", switchOnRedstone);
receiver.writeToNBT(data);
}
@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
if (data.hasKey("PowerOnAspect")) {
byte[] array = data.getByteArray("PowerOnAspect");
for (int i = 0; i < switchOnAspects.length; i++) {
switchOnAspects[i] = array[i] == 1;
}
}
switchAspect = data.getBoolean("switchAspect");
if (data.hasKey("switchOnRedstone"))
switchOnRedstone = data.getBoolean("switchOnRedstone");
receiver.readFromNBT(data);
}
@Override
public void writePacketData(DataOutputStream data) throws IOException {
super.writePacketData(data);
receiver.writePacketData(data);
writeGuiData(data);
}
@Override
public void readPacketData(DataInputStream data) throws IOException {
super.readPacketData(data);
receiver.readPacketData(data);
readGuiData(data, null);
markBlockForUpdate();
}
@Override
public void writeGuiData(DataOutputStream data) throws IOException {
super.writeGuiData(data);
byte bits = 0;
for (int i = 0; i < switchOnAspects.length; i++) {
bits |= (switchOnAspects[i] ? 1 : 0) << i;
}
data.writeByte(bits);
data.writeBoolean(switchOnRedstone);
}
@Override
public void readGuiData(DataInputStream data, EntityPlayer sender) throws IOException {
super.readGuiData(data, sender);
byte bits = data.readByte();
for (int bit = 0; bit < switchOnAspects.length; bit++) {
switchOnAspects[bit] = ((bits >> bit) & 1) == 1;
}
switchOnRedstone = data.readBoolean();
}
@Override
public boolean doesActionOnAspect(SignalAspect aspect) {
return switchOnAspects[aspect.ordinal()];
}
@Override
public void doActionOnAspect(SignalAspect aspect, boolean trigger) {
switchOnAspects[aspect.ordinal()] = trigger;
}
@Override
public SimpleSignalReceiver getReceiver() {
return receiver;
}
@Override
public boolean shouldSwitch(ITrackSwitch switchTrack, EntityMinecart cart) {
return switchAspect || (shouldSwitchOnRedstone() && isPowered());
}
public boolean shouldSwitchOnRedstone() {
return switchOnRedstone;
}
public void setSwitchOnRedstone(boolean switchOnRedstone) {
this.switchOnRedstone = switchOnRedstone;
}
}