/**
* 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 io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import cpw.mods.fml.relauncher.Side;
import buildcraft.BuildCraftCore;
import buildcraft.api.robots.IRequestProvider;
import buildcraft.core.lib.block.TileBuildCraft;
import buildcraft.core.lib.inventory.SimpleInventory;
import buildcraft.core.lib.inventory.StackHelper;
import buildcraft.core.lib.network.command.CommandWriter;
import buildcraft.core.lib.network.command.ICommandReceiver;
import buildcraft.core.lib.network.command.PacketCommand;
import buildcraft.core.lib.utils.NetworkUtils;
public class TileRequester extends TileBuildCraft implements IInventory, IRequestProvider, ICommandReceiver {
public static final int NB_ITEMS = 20;
private SimpleInventory inv = new SimpleInventory(NB_ITEMS, "items", 64);
private SimpleInventory requests = new SimpleInventory(NB_ITEMS, "requests", 64);
public TileRequester() {
}
public void setRequest(final int index, final ItemStack stack) {
if (worldObj.isRemote) {
BuildCraftCore.instance.sendToServer(new PacketCommand(this, "setRequest", new CommandWriter() {
public void write(ByteBuf data) {
data.writeByte(index);
NetworkUtils.writeStack(data, stack);
}
}));
} else {
requests.setInventorySlotContents(index, stack);
}
}
@Override
public void receiveCommand(String command, Side side, Object sender, ByteBuf stream) {
if (side.isServer() && "setRequest".equals(command)) {
setRequest(stream.readUnsignedByte(), NetworkUtils.readStack(stream));
}
}
public ItemStack getRequestTemplate(int index) {
return requests.getStackInSlot(index);
}
@Override
public int getSizeInventory() {
return inv.getSizeInventory();
}
@Override
public ItemStack getStackInSlot(int slotId) {
return inv.getStackInSlot(slotId);
}
@Override
public ItemStack decrStackSize(int slotId, int count) {
return inv.decrStackSize(slotId, count);
}
@Override
public ItemStack getStackInSlotOnClosing(int slotId) {
return inv.getStackInSlotOnClosing(slotId);
}
@Override
public void setInventorySlotContents(int slotId, ItemStack itemStack) {
inv.setInventorySlotContents(slotId, itemStack);
}
@Override
public String getInventoryName() {
return inv.getInventoryName();
}
@Override
public boolean hasCustomInventoryName() {
return inv.hasCustomInventoryName();
}
@Override
public int getInventoryStackLimit() {
return inv.getInventoryStackLimit();
}
@Override
public boolean isUseableByPlayer(EntityPlayer entityPlayer) {
return inv.isUseableByPlayer(entityPlayer);
}
@Override
public void openInventory() {
inv.openInventory();
}
@Override
public void closeInventory() {
inv.closeInventory();
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemStack) {
if (requests.getStackInSlot(i) == null) {
return false;
} else if (!StackHelper.isMatchingItemOrList(requests.getStackInSlot(i), itemStack)) {
return false;
} else {
return inv.isItemValidForSlot(i, itemStack);
}
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
NBTTagCompound invNBT = new NBTTagCompound();
inv.writeToNBT(invNBT);
nbt.setTag("inv", invNBT);
NBTTagCompound reqNBT = new NBTTagCompound();
requests.writeToNBT(reqNBT);
nbt.setTag("req", reqNBT);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
inv.readFromNBT(nbt.getCompoundTag("inv"));
requests.readFromNBT(nbt.getCompoundTag("req"));
}
public boolean isFulfilled(int i) {
if (requests.getStackInSlot(i) == null) {
return true;
} else if (inv.getStackInSlot(i) == null) {
return false;
} else {
return StackHelper.isMatchingItemOrList(requests.getStackInSlot(i), inv.getStackInSlot(i))
&& inv.getStackInSlot(i).stackSize >= requests.getStackInSlot(i).stackSize;
}
}
@Override
public int getRequestsCount() {
return NB_ITEMS;
}
@Override
public ItemStack getRequest(int i) {
if (requests.getStackInSlot(i) == null) {
return null;
} else if (isFulfilled(i)) {
return null;
} else {
ItemStack request = requests.getStackInSlot(i).copy();
ItemStack existingStack = inv.getStackInSlot(i);
if (existingStack == null) {
return request;
}
if (!StackHelper.isMatchingItemOrList(request, existingStack)) {
return null;
}
request.stackSize -= existingStack.stackSize;
if (request.stackSize <= 0) {
return null;
}
return request;
}
}
@Override
public ItemStack offerItem(int i, ItemStack stack) {
ItemStack existingStack = inv.getStackInSlot(i);
if (requests.getStackInSlot(i) == null) {
return stack;
} else if (existingStack == null) {
if (!StackHelper.isMatchingItemOrList(stack, requests.getStackInSlot(i))) {
return stack;
}
int maxQty = requests.getStackInSlot(i).stackSize;
if (stack.stackSize <= maxQty) {
inv.setInventorySlotContents(i, stack);
return null;
} else {
ItemStack newStack = stack.copy();
newStack.stackSize = maxQty;
stack.stackSize -= maxQty;
inv.setInventorySlotContents(i, newStack);
return stack;
}
} else if (!StackHelper.isMatchingItemOrList(stack, existingStack)) {
return stack;
} else if (StackHelper.isMatchingItemOrList(stack, requests.getStackInSlot(i))) {
int maxQty = requests.getStackInSlot(i).stackSize;
if (existingStack.stackSize + stack.stackSize <= maxQty) {
existingStack.stackSize += stack.stackSize;
return null;
} else {
stack.stackSize -= maxQty - existingStack.stackSize;
existingStack.stackSize = maxQty;
return stack;
}
} else {
return stack;
}
}
}