/**
* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
* <p/>
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.core;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.BlockIndex;
import buildcraft.api.core.IAreaProvider;
import buildcraft.api.core.IBox;
import buildcraft.api.core.IPathProvider;
import buildcraft.api.core.IZone;
import buildcraft.api.items.IMapLocation;
import buildcraft.core.lib.items.ItemBuildCraft;
import buildcraft.core.lib.utils.NBTUtils;
import buildcraft.core.lib.utils.StringUtils;
import buildcraft.robotics.ZonePlan;
public class ItemMapLocation extends ItemBuildCraft implements IMapLocation {
public ItemMapLocation() {
super(BCCreativeTab.get("main"));
}
@Override
public int getItemStackLimit(ItemStack stack) {
return NBTUtils.getItemData(stack).hasKey("kind") ? 1 : 16;
}
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) {
NBTTagCompound cpt = NBTUtils.getItemData(stack);
if (cpt.hasKey("name")) {
String name = cpt.getString("name");
if (name.length() > 0) {
list.add(name);
}
}
if (cpt.hasKey("kind")) {
switch (cpt.getByte("kind")) {
case 0: {
int x = cpt.getInteger("x");
int y = cpt.getInteger("y");
int z = cpt.getInteger("z");
ForgeDirection side = ForgeDirection.values()[cpt.getByte("side")];
list.add(StringUtils.localize("{" + x + ", " + y + ", " + z + ", " + side + "}"));
break;
}
case 1: {
int x = cpt.getInteger("xMin");
int y = cpt.getInteger("yMin");
int z = cpt.getInteger("zMin");
int xLength = cpt.getInteger("xMax") - x + 1;
int yLength = cpt.getInteger("yMax") - y + 1;
int zLength = cpt.getInteger("zMax") - z + 1;
list.add(StringUtils.localize("{" + x + ", " + y + ", " + z + "} + {" + xLength + " x " + yLength + " x " + zLength + "}"));
break;
}
case 2: {
NBTTagList pathNBT = cpt.getTagList("path", Constants.NBT.TAG_COMPOUND);
BlockIndex first = new BlockIndex(pathNBT.getCompoundTagAt(0));
int x = first.x;
int y = first.y;
int z = first.z;
list.add(StringUtils.localize("{" + x + ", " + y + ", " + z + "} + " + pathNBT.tagCount() + " elements"));
break;
}
case 3: {
break;
}
}
}
}
@Override
public IIcon getIconIndex(ItemStack stack) {
NBTTagCompound cpt = NBTUtils.getItemData(stack);
if (!cpt.hasKey("kind")) {
return icons[0];
} else {
return getIconFromDamage(cpt.getByte("kind") + 1);
}
}
@Override
public String[] getIconNames() {
return new String[]{"mapLocation/clean", "mapLocation/spot", "mapLocation/area", "mapLocation/path", "mapLocation/zone"};
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister par1IconRegister) {
super.registerIcons(par1IconRegister);
}
@Override
public boolean onItemUse(ItemStack stack, EntityPlayer par2EntityPlayer, World world, int x,
int y, int z, int side, float par8, float par9, float par10) {
TileEntity tile = world.getTileEntity(x, y, z);
NBTTagCompound cpt = NBTUtils.getItemData(stack);
if (tile instanceof IPathProvider) {
cpt.setByte("kind", (byte) 2);
NBTTagList pathNBT = new NBTTagList();
for (BlockIndex index : ((IPathProvider) tile).getPath()) {
NBTTagCompound nbt = new NBTTagCompound();
index.writeTo(nbt);
pathNBT.appendTag(nbt);
}
cpt.setTag("path", pathNBT);
} else if (tile instanceof IAreaProvider) {
cpt.setByte("kind", (byte) 1);
IAreaProvider areaTile = (IAreaProvider) tile;
cpt.setInteger("xMin", areaTile.xMin());
cpt.setInteger("yMin", areaTile.yMin());
cpt.setInteger("zMin", areaTile.zMin());
cpt.setInteger("xMax", areaTile.xMax());
cpt.setInteger("yMax", areaTile.yMax());
cpt.setInteger("zMax", areaTile.zMax());
} else {
cpt.setByte("kind", (byte) 0);
cpt.setByte("side", (byte) side);
cpt.setInteger("x", x);
cpt.setInteger("y", y);
cpt.setInteger("z", z);
}
return true;
}
@Override
public IBox getBox(ItemStack item) {
NBTTagCompound cpt = NBTUtils.getItemData(item);
if (cpt.hasKey("kind") && cpt.getByte("kind") == 1) {
int xMin = cpt.getInteger("xMin");
int yMin = cpt.getInteger("yMin");
int zMin = cpt.getInteger("zMin");
int xMax = cpt.getInteger("xMax");
int yMax = cpt.getInteger("yMax");
int zMax = cpt.getInteger("zMax");
return new Box(xMin, yMin, zMin, xMax, yMax, zMax);
} else if (cpt.hasKey("kind") && cpt.getByte("kind") == 0) {
return getPointBox(item);
} else {
return null;
}
}
public static IBox getPointBox(ItemStack item) {
NBTTagCompound cpt = NBTUtils.getItemData(item);
if (cpt.hasKey("kind") && cpt.getByte("kind") == 0) {
int x = cpt.getInteger("x");
int y = cpt.getInteger("y");
int z = cpt.getInteger("z");
return new Box(x, y, z, x, y, z);
} else {
return null;
}
}
@Override
public ForgeDirection getPointSide(ItemStack item) {
NBTTagCompound cpt = NBTUtils.getItemData(item);
if (cpt.hasKey("kind") && cpt.getByte("kind") == 0) {
return ForgeDirection.values()[cpt.getByte("side")];
} else {
return ForgeDirection.UNKNOWN;
}
}
@Override
public BlockIndex getPoint(ItemStack item) {
NBTTagCompound cpt = NBTUtils.getItemData(item);
if (cpt.hasKey("kind") && cpt.getByte("kind") == 0) {
return new BlockIndex(cpt.getInteger("x"), cpt.getInteger("y"), cpt.getInteger("z"));
} else {
return null;
}
}
@Override
public IZone getZone(ItemStack item) {
NBTTagCompound cpt = NBTUtils.getItemData(item);
if (cpt.hasKey("kind") && cpt.getByte("kind") == 3) {
ZonePlan plan = new ZonePlan();
plan.readFromNBT(cpt);
return plan;
} else if (cpt.hasKey("kind") && cpt.getByte("kind") == 1) {
return getBox(item);
} else if (cpt.hasKey("kind") && cpt.getByte("kind") == 0) {
return getPointBox(item);
} else {
return null;
}
}
@Override
public List<BlockIndex> getPath(ItemStack item) {
NBTTagCompound cpt = NBTUtils.getItemData(item);
if (cpt.hasKey("kind") && cpt.getByte("kind") == 2) {
List<BlockIndex> indexList = new ArrayList<BlockIndex>();
NBTTagList pathNBT = cpt.getTagList("path", Constants.NBT.TAG_COMPOUND);
for (int i = 0; i < pathNBT.tagCount(); i++) {
indexList.add(new BlockIndex(pathNBT.getCompoundTagAt(i)));
}
return indexList;
} else if (cpt.hasKey("kind") && cpt.getByte("kind") == 0) {
List<BlockIndex> indexList = new ArrayList<BlockIndex>();
indexList.add(new BlockIndex(cpt.getInteger("x"), cpt.getInteger("y"), cpt.getInteger("z")));
return indexList;
} else {
return null;
}
}
public static void setZone(ItemStack item, ZonePlan plan) {
NBTTagCompound cpt = NBTUtils.getItemData(item);
cpt.setByte("kind", (byte) 3);
plan.writeToNBT(cpt);
}
@Override
public String getName(ItemStack item) {
return NBTUtils.getItemData(item).getString("name");
}
@Override
public boolean setName(ItemStack item, String name) {
NBTTagCompound cpt = NBTUtils.getItemData(item);
cpt.setString("name", name);
return true;
}
@Override
public MapLocationType getType(ItemStack stack) {
NBTTagCompound cpt = NBTUtils.getItemData(stack);
return MapLocationType.values()[cpt.getByte("kind")];
}
}