/*
* 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 cpw.mods.fml.common.Optional;
import ic2.api.item.IBoxable;
import mods.railcraft.api.core.WorldCoordinate;
import mods.railcraft.api.signals.IControllerTile;
import mods.railcraft.api.signals.IReceiverTile;
import mods.railcraft.api.signals.SignalController;
import mods.railcraft.api.signals.SignalReceiver;
import mods.railcraft.common.core.RailcraftConfig;
import mods.railcraft.common.items.IActivationBlockingItem;
import mods.railcraft.common.items.ItemCircuit;
import mods.railcraft.common.items.ItemRailcraft;
import mods.railcraft.common.items.RailcraftItem;
import mods.railcraft.common.plugins.forge.*;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;
@Optional.Interface(iface = "ic2.api.item.IBoxable", modid = "IC2")
public class ItemSignalTuner extends ItemRailcraft implements IBoxable, IActivationBlockingItem {
private static Item item;
private ItemSignalTuner() {
super();
setMaxDamage(0);
setHasSubtypes(true);
setMaxStackSize(1);
setCreativeTab(CreativePlugin.RAILCRAFT_TAB);
}
public static void registerItem() {
if (item == null) {
String tag = "railcraft.tool.signal.tuner";
if (RailcraftConfig.isItemEnabled(tag)) {
item = new ItemSignalTuner().setUnlocalizedName(tag);
RailcraftRegistry.register(item);
CraftingPlugin.addShapedRecipe(new ItemStack(item),
" T ",
"BRB",
" ",
'B', Blocks.stone_button,
'R', RailcraftItem.circuit, ItemCircuit.EnumCircuit.RECEIVER,
'T', Blocks.redstone_torch);
LootPlugin.addLootWorkshop(new ItemStack(item), 1, 1, "tool.signal.tuner");
}
}
}
public static ItemStack getItem() {
if (item == null)
return null;
return new ItemStack(item);
}
@Override
public boolean onItemUse(ItemStack item, EntityPlayer player, World world, int i, int j, int k, int side, float par8, float par9, float par10) {
if (Game.isHost(world) && item.hasTagCompound() && player.isSneaking()) {
WorldCoordinate cPos = getControllerData(item);
if (cPos != null) {
TileEntity tile = DimensionManager.getWorld(cPos.dimension).getTileEntity(cPos.x, cPos.y, cPos.z);
if (tile instanceof IControllerTile) {
((IControllerTile) tile).getController().endPairing();
}
}
ChatPlugin.sendLocalizedChatFromServer(player, "railcraft.gui.tuner.abandon.player");
item.setTagCompound(null);
return false;
}
TileEntity tile = world.getTileEntity(i, j, k);
if (tile != null) {
WorldCoordinate cPos = getControllerData(item);
if (tile instanceof IReceiverTile && cPos != null) {
if (Game.isHost(world)) {
SignalReceiver receiver = ((IReceiverTile) tile).getReceiver();
if (i != cPos.x || j != cPos.y || k != cPos.z) {
tile = world.getTileEntity(cPos.x, cPos.y, cPos.z);
if (tile != null && tile instanceof IControllerTile) {
SignalController controller = ((IControllerTile) tile).getController();
if (receiver.getTile() != controller.getTile()) {
controller.registerReceiver(receiver);
controller.endPairing();
ChatPlugin.sendLocalizedChatFromServer(player, "railcraft.gui.tuner.success", controller.getLocalizationTag(), receiver.getLocalizationTag());
item.setTagCompound(null);
return true;
}
} else if (world.blockExists(cPos.x, cPos.y, cPos.z)) {
ChatPlugin.sendLocalizedChatFromServer(player, "railcraft.gui.tuner.abandon.gone");
item.setTagCompound(null);
} else {
ChatPlugin.sendLocalizedChatFromServer(player, "railcraft.gui.tuner.abandon.chunk");
item.setTagCompound(null);
}
}
}
} else if (tile instanceof IControllerTile) {
if (Game.isHost(world)) {
SignalController controller = ((IControllerTile) tile).getController();
if (cPos == null || (i != cPos.x || j != cPos.y || k != cPos.z)) {
ChatPlugin.sendLocalizedChatFromServer(player, "railcraft.gui.tuner.start", controller.getLocalizationTag());
setControllerData(item, tile);
controller.startPairing();
} else {
ChatPlugin.sendLocalizedChatFromServer(player, "railcraft.gui.tuner.stop", controller.getLocalizationTag());
controller.endPairing();
item.setTagCompound(null);
}
}
} else
return false;
return true;
}
return false;
}
private WorldCoordinate getControllerData(ItemStack item) {
WorldCoordinate cPos = null;
NBTTagCompound data = item.getTagCompound();
if (data != null) {
int cDim = data.getInteger("controllerDim");
int cx = data.getInteger("controllerX");
int cy = data.getInteger("controllerY");
int cz = data.getInteger("controllerZ");
cPos = new WorldCoordinate(cDim, cx, cy, cz);
}
return cPos;
}
private void setControllerData(ItemStack item, TileEntity tile) {
NBTTagCompound data = new NBTTagCompound();
data.setInteger("controllerDim", tile.getWorldObj().provider.dimensionId);
data.setInteger("controllerX", tile.xCoord);
data.setInteger("controllerY", tile.yCoord);
data.setInteger("controllerZ", tile.zCoord);
item.setTagCompound(data);
}
@Override
public boolean canBeStoredInToolbox(ItemStack itemstack) {
return true;
}
}