/*
* 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.tracks.ITrackSwitch;
import mods.railcraft.common.gui.EnumGui;
import mods.railcraft.common.gui.GuiHandler;
import mods.railcraft.common.gui.buttons.MultiButtonController;
import mods.railcraft.common.items.ItemRoutingTable;
import mods.railcraft.common.util.inventory.InvTools;
import mods.railcraft.common.util.inventory.StandaloneInventory;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.block.Block;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
public class TileSwitchRouting extends TileSwitchSecured implements IRouter, IRoutingTile {
private final StandaloneInventory inv = new StandaloneInventory(1, this);
private final MultiButtonController<RoutingButtonState> routingController = new MultiButtonController<RoutingButtonState>(0, RoutingButtonState.values());
private RoutingLogic logic;
@Override
public MultiButtonController<RoutingButtonState> getRoutingController() {
return routingController;
}
@Override
public EnumSignal getSignalType() {
return EnumSignal.SWITCH_ROUTING;
}
@Override
public boolean blockActivated(int side, EntityPlayer player) {
if (Game.isHost(worldObj)) {
ItemStack current = player.inventory.getCurrentItem();
if (current != null && current.getItem() instanceof ItemRoutingTable)
if (inv.getStackInSlot(0) == null) {
ItemStack copy = current.copy();
copy.stackSize = 1;
inv.setInventorySlotContents(0, copy);
if (!player.capabilities.isCreativeMode) {
player.inventory.setInventorySlotContents(player.inventory.currentItem, InvTools.depleteItem(current));
player.inventory.markDirty();
}
return true;
}
GuiHandler.openGui(EnumGui.ROUTING, player, worldObj, xCoord, yCoord, zCoord);
}
return true;
}
@Override
public void onBlockRemoval() {
super.onBlockRemoval();
InvTools.dropInventory(inv, worldObj, xCoord, yCoord, zCoord);
}
@Override
public void onNeighborBlockChange(Block block) {
super.onNeighborBlockChange(block);
boolean power = isBeingPoweredByRedstone();
if (isPowered() != power)
setPowered(power);
}
@Override
public void onBlockPlacedBy(EntityLivingBase entityliving, ItemStack stack) {
super.onBlockPlacedBy(entityliving, stack);
boolean power = isBeingPoweredByRedstone();
if (isPowered() != power)
setPowered(power);
}
@Override
public void markDirty() {
super.markDirty();
resetLogic();
}
@Override
public RoutingLogic getLogic() {
refreshLogic();
return logic;
}
@Override
public void resetLogic() {
logic = null;
}
private void refreshLogic() {
if (logic == null && inv.getStackInSlot(0) != null)
logic = ItemRoutingTable.getLogic(inv.getStackInSlot(0));
}
@Override
public void writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
inv.writeToNBT("inv", data);
routingController.writeToNBT(data, "railwayType");
}
@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
inv.readFromNBT("inv", data);
routingController.readFromNBT(data, "railwayType");
}
@Override
public IInventory getInventory() {
return inv;
}
@Override
public boolean shouldSwitch(ITrackSwitch switchTrack, EntityMinecart cart) {
RoutingLogic logic = getLogic();
if (logic != null && logic.isValid())
return logic.matches(this, cart);
else
return false;
}
}