/** * 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.robotics; import java.util.List; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraftforge.common.MinecraftForge; import cofh.api.energy.IEnergyContainerItem; import buildcraft.BuildCraftRobotics; import buildcraft.api.boards.RedstoneBoardNBT; import buildcraft.api.boards.RedstoneBoardRegistry; import buildcraft.api.boards.RedstoneBoardRobotNBT; import buildcraft.api.events.RobotEvent; import buildcraft.api.robots.DockingStation; import buildcraft.api.robots.EntityRobotBase; import buildcraft.core.BCCreativeTab; import buildcraft.core.lib.items.ItemBuildCraft; import buildcraft.core.lib.utils.NBTUtils; import buildcraft.core.lib.utils.StringUtils; import buildcraft.transport.BlockGenericPipe; import buildcraft.transport.Pipe; public class ItemRobot extends ItemBuildCraft implements IEnergyContainerItem { public ItemRobot() { super(BCCreativeTab.get("boards")); setMaxStackSize(1); } @Override public int getItemStackLimit(ItemStack stack) { NBTTagCompound cpt = getNBT(stack); RedstoneBoardRobotNBT boardNBT = getRobotNBT(cpt); if (boardNBT != RedstoneBoardRegistry.instance.getEmptyRobotBoard()) { return 1; } else { return 16; } } public EntityRobot createRobot(ItemStack stack, World world) { try { NBTTagCompound nbt = getNBT(stack); RedstoneBoardRobotNBT robotNBT = getRobotNBT(nbt); if (robotNBT == RedstoneBoardRegistry.instance.getEmptyRobotBoard()) { return null; } EntityRobot robot = new EntityRobot(world, robotNBT); robot.getBattery().setEnergy(getEnergy(nbt)); return robot; } catch (Throwable e) { e.printStackTrace(); return null; } } public static RedstoneBoardRobotNBT getRobotNBT(ItemStack stack) { return getRobotNBT(getNBT(stack)); } public static int getEnergy(ItemStack stack) { return getEnergy(getNBT(stack)); } public ResourceLocation getTextureRobot(ItemStack stack) { return getRobotNBT(stack).getRobotTexture(); } @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { NBTTagCompound cpt = getNBT(stack); RedstoneBoardRobotNBT boardNBT = getRobotNBT(cpt); if (boardNBT != RedstoneBoardRegistry.instance.getEmptyRobotBoard()) { boardNBT.addInformation(stack, player, list, advanced); int energy = getEnergy(cpt); int pct = energy * 100 / EntityRobotBase.MAX_ENERGY; String enInfo = pct + "% " + StringUtils.localize("tip.gate.charged"); if (energy == EntityRobotBase.MAX_ENERGY) { enInfo = StringUtils.localize("tip.gate.fullcharge"); } else if (energy == 0) { enInfo = StringUtils.localize("tip.gate.nocharge"); } enInfo = (pct >= 80 ? EnumChatFormatting.GREEN : (pct >= 50 ? EnumChatFormatting.YELLOW : (pct >= 30 ? EnumChatFormatting.GOLD : (pct >= 20 ? EnumChatFormatting.RED : EnumChatFormatting.DARK_RED)))) + enInfo; list.add(enInfo); } } @Override public void registerIcons(IIconRegister par1IconRegister) { // cancels default BC icon registering } public static ItemStack createRobotStack(RedstoneBoardRobotNBT board, int energy) { ItemStack robot = new ItemStack(BuildCraftRobotics.robotItem); NBTTagCompound boardCpt = new NBTTagCompound(); board.createBoard(boardCpt); NBTUtils.getItemData(robot).setTag("board", boardCpt); NBTUtils.getItemData(robot).setInteger("energy", energy); return robot; } @SuppressWarnings({"unchecked", "rawtypes"}) @Override @SideOnly(Side.CLIENT) public void getSubItems(Item item, CreativeTabs par2CreativeTabs, List itemList) { itemList.add(createRobotStack(RedstoneBoardRegistry.instance.getEmptyRobotBoard(), 0)); for (RedstoneBoardNBT boardNBT : RedstoneBoardRegistry.instance.getAllBoardNBTs()) { if (boardNBT instanceof RedstoneBoardRobotNBT) { RedstoneBoardRobotNBT robotNBT = (RedstoneBoardRobotNBT) boardNBT; itemList.add(createRobotStack(robotNBT, 0)); itemList.add(createRobotStack(robotNBT, EntityRobotBase.MAX_ENERGY)); } } } @Override public int receiveEnergy(ItemStack container, int maxReceive, boolean simulate) { NBTTagCompound cpt = getNBT(container); if (getRobotNBT(cpt) == RedstoneBoardRegistry.instance.getEmptyRobotBoard()) { return 0; } int currentEnergy = getEnergy(cpt); int energyReceived = Math.min(EntityRobotBase.MAX_ENERGY - currentEnergy, maxReceive); if (!simulate) { setEnergy(cpt, currentEnergy + energyReceived); } return energyReceived; } @Override public int extractEnergy(ItemStack container, int maxExtract, boolean simulate) { NBTTagCompound cpt = getNBT(container); if (getRobotNBT(cpt) == RedstoneBoardRegistry.instance.getEmptyRobotBoard()) { return 0; } int currentEnergy = getEnergy(cpt); int energyExtracted = Math.min(currentEnergy, maxExtract); if (!simulate) { setEnergy(cpt, currentEnergy - energyExtracted); } return energyExtracted; } @Override public int getEnergyStored(ItemStack container) { return getEnergy(container); } @Override public int getMaxEnergyStored(ItemStack container) { if (getRobotNBT(container) == RedstoneBoardRegistry.instance.getEmptyRobotBoard()) { return 0; } return EntityRobotBase.MAX_ENERGY; } @Override public boolean onItemUse(ItemStack currentItem, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { Block b = world.getBlock(x, y, z); if (!(b instanceof BlockGenericPipe)) { return false; } Pipe<?> pipe = BlockGenericPipe.getPipe(world, x, y, z); if (pipe == null) { return false; } BlockGenericPipe pipeBlock = (BlockGenericPipe) b; BlockGenericPipe.RaytraceResult rayTraceResult = pipeBlock.doRayTrace(world, x, y, z, player); if (rayTraceResult != null && rayTraceResult.hitPart == BlockGenericPipe.Part.Pluggable && pipe.container.getPipePluggable(rayTraceResult.sideHit) instanceof RobotStationPluggable) { RobotStationPluggable pluggable = (RobotStationPluggable) pipe.container.getPipePluggable(rayTraceResult.sideHit); DockingStation station = pluggable.getStation(); if (!station.isTaken()) { RedstoneBoardRobotNBT robotNBT = ItemRobot.getRobotNBT(currentItem); if (robotNBT == RedstoneBoardRegistry.instance.getEmptyRobotBoard()) { return true; } EntityRobot robot = ((ItemRobot) currentItem.getItem()) .createRobot(currentItem, world); RobotEvent.Place robotEvent = new RobotEvent.Place(robot, player); MinecraftForge.EVENT_BUS.post(robotEvent); if (robotEvent.isCanceled()) { return true; } if (robot != null && robot.getRegistry() != null) { robot.setUniqueRobotId(robot.getRegistry().getNextRobotId()); float px = x + 0.5F + rayTraceResult.sideHit.offsetX * 0.5F; float py = y + 0.5F + rayTraceResult.sideHit.offsetY * 0.5F; float pz = z + 0.5F + rayTraceResult.sideHit.offsetZ * 0.5F; robot.setPosition(px, py, pz); station.takeAsMain(robot); robot.dock(robot.getLinkedStation()); world.spawnEntityInWorld(robot); if (!player.capabilities.isCreativeMode) { player.getCurrentEquippedItem().stackSize--; } } } return true; } } return false; } private static NBTTagCompound getNBT(ItemStack stack) { NBTTagCompound cpt = NBTUtils.getItemData(stack); if (!cpt.hasKey("board")) { RedstoneBoardRegistry.instance.getEmptyRobotBoard().createBoard(cpt); } return cpt; } private static RedstoneBoardRobotNBT getRobotNBT(NBTTagCompound cpt) { NBTTagCompound boardCpt = cpt.getCompoundTag("board"); return (RedstoneBoardRobotNBT) RedstoneBoardRegistry.instance.getRedstoneBoard(boardCpt); } private static int getEnergy(NBTTagCompound cpt) { return cpt.getInteger("energy"); } private static void setEnergy(NBTTagCompound cpt, int energy) { cpt.setInteger("energy", energy); } }