/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * The BuildCraft API is distributed under the terms of the MIT License. * Please check the contents of the license, which should be located * as "LICENSE.API" in the BuildCraft source code distribution. */ package buildcraft.robotics; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import buildcraft.api.core.BlockIndex; import buildcraft.api.robots.DockingStation; import buildcraft.api.robots.IRequestProvider; import buildcraft.api.robots.IRobotRegistry; import buildcraft.api.robots.ResourceId; import buildcraft.api.robots.ResourceIdRequest; import buildcraft.api.robots.RobotManager; public class StackRequest { private IRequestProvider requester; private int slot; private ItemStack stack; private DockingStation station; private BlockIndex stationIndex; private ForgeDirection stationSide; public StackRequest(IRequestProvider requester, int slot, ItemStack stack) { this.requester = requester; this.slot = slot; this.stack = stack; this.station = null; } private StackRequest(int slot, ItemStack stack, BlockIndex stationIndex, ForgeDirection stationSide) { requester = null; this.slot = slot; this.stack = stack; station = null; this.stationIndex = stationIndex; this.stationSide = stationSide; } public IRequestProvider getRequester(World world) { if (requester == null) { DockingStation dockingStation = getStation(world); if (dockingStation != null) { requester = dockingStation.getRequestProvider(); } } return requester; } public int getSlot() { return slot; } public ItemStack getStack() { return stack; } public DockingStation getStation(World world) { if (station == null) { IRobotRegistry robotRegistry = RobotManager.registryProvider.getRegistry(world); station = robotRegistry.getStation(stationIndex.x, stationIndex.y, stationIndex.z, stationSide); } return station; } public void setStation(DockingStation station) { this.station = station; this.stationIndex = station.index(); this.stationSide = station.side(); } public void writeToNBT(NBTTagCompound nbt) { nbt.setInteger("slot", slot); NBTTagCompound stackNBT = new NBTTagCompound(); stack.writeToNBT(stackNBT); nbt.setTag("stack", stackNBT); if (station != null) { NBTTagCompound stationIndexNBT = new NBTTagCompound(); station.index().writeTo(stationIndexNBT); nbt.setTag("stationIndex", stationIndexNBT); nbt.setByte("stationSide", (byte) station.side().ordinal()); } } public static StackRequest loadFromNBT(NBTTagCompound nbt) { if (nbt.hasKey("stationIndex")) { int slot = nbt.getInteger("slot"); ItemStack stack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("stack")); BlockIndex stationIndex = new BlockIndex(nbt.getCompoundTag("stationIndex")); ForgeDirection stationSide = ForgeDirection.values()[nbt.getByte("stationSide")]; return new StackRequest(slot, stack, stationIndex, stationSide); } else { return null; } } public ResourceId getResourceId(World world) { return getStation(world) != null ? new ResourceIdRequest(getStation(world), slot) : null; } }