buildcraft.robotics.TileRequester.java Source code

Java tutorial

Introduction

Here is the source code for buildcraft.robotics.TileRequester.java

Source

/**
 * 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;
        }
    }
}