Package mods.railcraft.common.util.inventory

Source Code of mods.railcraft.common.util.inventory.InvTools

/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.util.inventory;

import buildcraft.api.transport.PipeManager;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.oredict.OreDictionary;
import mods.railcraft.api.core.items.IStackFilter;
import mods.railcraft.common.plugins.forge.LocalizationPlugin;
import mods.railcraft.common.plugins.forge.WorldPlugin;
import mods.railcraft.common.util.inventory.filters.ArrayStackFilter;
import mods.railcraft.common.util.inventory.filters.StackFilter;
import mods.railcraft.common.util.inventory.filters.InvertedStackFilter;
import mods.railcraft.common.util.inventory.manipulators.InventoryManipulator;
import mods.railcraft.common.util.inventory.wrappers.*;
import mods.railcraft.common.util.misc.EnumColor;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.misc.ITileFilter;
import mods.railcraft.common.util.misc.MiscTools;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;

public abstract class InvTools {

    private static final String TAG_SLOT = "Slot";

    public static ItemStack makeStack(Item item, int qty, int meta) {
        if (item != null)
            return new ItemStack(item, qty, meta);
        return null;
    }

    public static ItemStack makeStack(Block block, int qty, int meta) {
        if (block != null)
            return new ItemStack(block, qty, meta);
        return null;
    }

    public static List<IInventory> getAdjacentInventories(World world, int i, int j, int k) {
        return getAdjacentInventories(world, i, j, k, null);
    }

    public static List<IInventory> getAdjacentInventories(World world, int i, int j, int k, Class<? extends IInventory> type) {
        List<IInventory> list = new ArrayList<IInventory>(5);
        for (int side = 0; side < 6; side++) {
            IInventory inv = getInventoryFromSide(world, i, j, k, ForgeDirection.getOrientation(side), type, null);
            if (inv != null)
                list.add(inv);
        }
        return list;
    }

    public static Map<Integer, IInventory> getAdjacentInventoryMap(World world, int i, int j, int k) {
        return getAdjacentInventoryMap(world, i, j, k, null);
    }

    public static Map<Integer, IInventory> getAdjacentInventoryMap(World world, int i, int j, int k, Class<? extends IInventory> type) {
        Map<Integer, IInventory> map = new TreeMap<Integer, IInventory>();
        for (int side = 0; side < 6; side++) {
            IInventory inv = getInventoryFromSide(world, i, j, k, ForgeDirection.getOrientation(side), type, null);
            if (inv != null)
                map.put(side, inv);
        }
        return map;
    }

    public static IInventory getInventoryFromSide(World world, int x, int y, int z, ForgeDirection side, final Class<? extends IInventory> type, final Class<? extends IInventory> exclude) {
        return getInventoryFromSide(world, x, y, z, side, new ITileFilter() {
            @Override
            public boolean matches(TileEntity tile) {
                if (type != null && !type.isAssignableFrom(tile.getClass()))
                    return false;
                return exclude == null || !exclude.isAssignableFrom(tile.getClass());
            }

        });
    }

    public static IInventory getInventoryFromSide(World world, int x, int y, int z, ForgeDirection side, ITileFilter filter) {
        TileEntity tile = WorldPlugin.getTileEntityOnSide(world, x, y, z, side);
        if (tile == null || !(tile instanceof IInventory) || !filter.matches(tile))
            return null;
        return getInventoryFromTile(tile, side.getOpposite());
    }

    public static IInventory getInventoryFromTile(TileEntity tile, ForgeDirection side) {
        if (tile == null || !(tile instanceof IInventory))
            return null;

        if (!PipeManager.canExtractItems(null, tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord))
            return null;

        if (tile instanceof TileEntityChest) {
            TileEntityChest chest = (TileEntityChest) tile;
            return new ChestWrapper(chest);
        }
        return getInventory((IInventory) tile, side);
    }

    public static IInventory getInventory(IInventory inv, ForgeDirection side) {
        if (inv == null)
            return null;

//        if (inv instanceof ISpecialInventory)
//            inv = new SpecialInventoryMapper((ISpecialInventory) inv, side);
        else if (inv instanceof ISidedInventory)
            inv = new SidedInventoryMapper((ISidedInventory) inv, side);
        return inv;
    }

    public static int[] buildSlotArray(int start, int size) {
        int[] slots = new int[size];
        for (int i = 0; i < size; i++) {
            slots[i] = start + i;
        }
        return slots;
    }

    public static EnumColor getItemColor(ItemStack stack) {
        if (stack == null)
            return null;
        if (isStackEqualToBlock(stack, Blocks.wool))
            return EnumColor.fromId(15 - stack.getItemDamage());
        if (stack.getItem() == Items.dye)
            return EnumColor.fromId(stack.getItemDamage());
        NBTTagCompound nbt = stack.getTagCompound();
        if (nbt != null && nbt.hasKey("color"))
            return EnumColor.fromId(nbt.getByte("color"));
        return null;
    }

    public static ItemStack setItemColor(ItemStack stack, EnumColor color) {
        if (color == null) return stack;
        NBTTagCompound nbt = getItemData(stack);
        nbt.setByte("color", (byte) color.ordinal());
        return stack;
    }

    public static boolean isSynthetic(ItemStack stack) {
        NBTTagCompound nbt = stack.getTagCompound();
        return nbt != null && nbt.hasKey("synthetic");
    }

    public static void markItemSynthetic(ItemStack stack) {
        NBTTagCompound nbt = getItemData(stack);
        nbt.setBoolean("synthetic", true);
        NBTTagCompound display = nbt.getCompoundTag("display");
        nbt.setTag("display", display);
        NBTTagList lore = display.getTagList("Lore", 8);
        display.setTag("Lore", lore);
        lore.appendTag(new NBTTagString("\u00a77\u00a7o" + LocalizationPlugin.translate("item.synthetic")));
    }

    public static void addItemToolTip(ItemStack stack, String msg) {
        NBTTagCompound nbt = getItemData(stack);
        NBTTagCompound display = nbt.getCompoundTag("display");
        nbt.setTag("display", display);
        NBTTagList lore = display.getTagList("Lore", 8);
        display.setTag("Lore", lore);
        lore.appendTag(new NBTTagString(msg));
    }

    public static NBTTagCompound getItemData(ItemStack stack) {
        NBTTagCompound nbt = stack.getTagCompound();
        if (nbt == null) {
            nbt = new NBTTagCompound();
            stack.setTagCompound(nbt);
        }
        return nbt;
    }

    public static ItemStack depleteItem(ItemStack stack) {
        if (stack.stackSize == 1)
            return stack.getItem().getContainerItem(stack);
        else {
            stack.splitStack(1);
            return stack;
        }
    }

    public static ItemStack damageItem(ItemStack stack, int damage) {
        if (!stack.isItemStackDamageable()) return stack;
        int curDamage = stack.getItemDamage();
        curDamage += damage;
        stack.setItemDamage(curDamage);
        if (stack.getItemDamage() > stack.getMaxDamage()) {
            stack.stackSize--;
            stack.setItemDamage(0);
        }
        if (stack.stackSize <= 0)
            stack = null;
        return stack;
    }

    public static void dropItem(ItemStack stack, World world, double x, double y, double z) {
        if (stack == null || stack.stackSize < 1)
            return;
        EntityItem entityItem = new EntityItem(world, x, y + 1.5, z, stack);
        entityItem.delayBeforeCanPickup = 10;
        world.spawnEntityInWorld(entityItem);
    }

    public static void dropInventory(IInventory inv, World world, int x, int y, int z) {
        if (Game.isNotHost(world)) return;
        for (int slot = 0; slot < inv.getSizeInventory(); slot++) {
            ItemStack stack = inv.getStackInSlot(slot);
            if (stack != null) {
                float xOffset = MiscTools.getRand().nextFloat() * 0.8F + 0.1F;
                float yOffset = MiscTools.getRand().nextFloat() * 0.8F + 0.1F;
                float zOffset = MiscTools.getRand().nextFloat() * 0.8F + 0.1F;
                while (stack.stackSize > 0) {
                    int numToDrop = MiscTools.getRand().nextInt(21) + 10;
                    if (numToDrop > stack.stackSize)
                        numToDrop = stack.stackSize;
                    ItemStack newStack = stack.copy();
                    newStack.stackSize = numToDrop;
                    stack.stackSize -= numToDrop;
                    EntityItem entityItem = new EntityItem(world, (float) x + xOffset, (float) y + yOffset, (float) z + zOffset, newStack);
                    float variance = 0.05F;
                    entityItem.motionX = (float) MiscTools.getRand().nextGaussian() * variance;
                    entityItem.motionY = (float) MiscTools.getRand().nextGaussian() * variance + 0.2F;
                    entityItem.motionZ = (float) MiscTools.getRand().nextGaussian() * variance;
                    world.spawnEntityInWorld(entityItem);
                }
                inv.setInventorySlotContents(slot, null);
            }
        }
    }

    public static boolean isInventoryEmpty(IInventory inv, ForgeDirection side) {
        return isInventoryEmpty(getInventory(inv, side));
    }

    public static boolean isInventoryEmpty(IInventory inv) {
        ItemStack stack = null;
        for (IInvSlot slot : InventoryIterator.getIterable(inv)) {
            stack = slot.getStackInSlot();
            if (stack != null)
                break;
        }
        return stack == null;
    }

    public static boolean isAccessibleInventoryEmpty(IInventory inv, ForgeDirection side) {
        return isInventoryEmpty(getInventory(inv, side));
    }

    public static boolean isAccessibleInventoryEmpty(IInventory inv) {
        for (IInvSlot slot : InventoryIterator.getIterable(inv)) {
            ItemStack stack = slot.getStackInSlot();
            if (stack != null && slot.canTakeStackFromSlot(stack))
                return false;
        }
        return true;
    }

    public static boolean isInventoryFull(IInventory inv, ForgeDirection side) {
        return isInventoryFull(getInventory(inv, side));
    }

    public static boolean isInventoryFull(IInventory inv) {
        ItemStack stack = null;
        for (IInvSlot slot : InventoryIterator.getIterable(inv)) {
            stack = slot.getStackInSlot();
            if (stack == null)
                break;
        }
        return stack != null;
    }

    /**
     * Counts the number of items.
     *
     * @param inv
     * @return
     */
    public static int countItems(IInventory inv) {
        int count = 0;
        for (IInvSlot slot : InventoryIterator.getIterable(inv)) {
            ItemStack stack = slot.getStackInSlot();
            if (stack != null)
                count += stack.stackSize;
        }
        return count;
    }

    public static int countMaxItemStackSize(IInventory inv) {
        int count = 0;
        for (IInvSlot slot : InventoryIterator.getIterable(inv)) {
            ItemStack stack = slot.getStackInSlot();
            if (stack != null)
                count += stack.getMaxStackSize();
        }
        return count;
    }

    public static int countItems(IInventory inv, IStackFilter filter) {
        int count = 0;
        for (IInvSlot slot : InventoryIterator.getIterable(inv)) {
            ItemStack stack = slot.getStackInSlot();
            if (stack != null && filter.matches(stack))
                count += stack.stackSize;
        }
        return count;
    }

    public static boolean numItemsMoreThan(IInventory inv, int amount) {
        int count = 0;
        for (IInvSlot slot : InventoryIterator.getIterable(inv)) {
            ItemStack stack = slot.getStackInSlot();
            if (stack != null)
                count += stack.stackSize;
            if (count >= amount)
                return true;
        }
        return false;
    }

    /**
     * Counts the number of items that match the filter.
     *
     * @param inv
     * @param filters
     * @return
     */
    public static int countItems(IInventory inv, ItemStack... filters) {
        return countItems(inv, new ArrayStackFilter(filters));
    }

    public static int countItems(Collection<IInventory> inventories, ItemStack... filter) {
        int count = 0;
        for (IInventory inv : inventories) {
            count += InvTools.countItems(inv, filter);
        }
        return count;
    }

    /**
     * Returns true if the inventory contains the specified item.
     *
     * @param inv  The IIinventory to check
     * @param item The ItemStack to look for
     * @return true is exists
     */
    public static boolean containsItem(IInventory inv, ItemStack item) {
        return countItems(inv, item) > 0;
    }

    /**
     * Returns a map backed by an <code>ItemStackMap</code> that lists the total
     * number of each type of item in the inventory.
     *
     * @param inv The <code>IInventory</code> to generate the manifest for
     * @return A <code>Map</code> that lists how many of each item is in * * *
     *         the <code>IInventory</code>
     * @see ItemStackMap
     */
    public static Map<ItemStack, Integer> getManifest(IInventory inv) {
        Map<ItemStack, Integer> manifest = new ItemStackMap<Integer>();
        for (int i = 0; i < inv.getSizeInventory(); i++) {
            ItemStack slot = inv.getStackInSlot(i);
            if (slot != null) {
                Integer count = manifest.get(slot);
                if (count == null)
                    count = 0;
                count += slot.stackSize;
                manifest.put(slot, count);
            }
        }
        return manifest;
    }

    /**
     * Attempts to move a single item from one inventory to another.
     *
     * @param source
     * @param dest
     * @return null if nothing was moved, the stack moved otherwise
     */
    public static ItemStack moveOneItem(IInventory source, IInventory dest) {
        return moveOneItem(source, dest, StackFilter.ALL);
    }

    /**
     * Attempts to move a single item from one inventory to another.
     *
     * @param source
     * @param dest
     * @param filters ItemStack to match against
     * @return null if nothing was moved, the stack moved otherwise
     */
    public static ItemStack moveOneItem(IInventory source, IInventory dest, ItemStack... filters) {
        return moveOneItem(source, dest, new ArrayStackFilter(filters));
    }

    /**
     * Attempts to move a single item from one inventory to another.
     *
     * @param source
     * @param dest
     * @param filter an IStackFilter to match against
     * @return null if nothing was moved, the stack moved otherwise
     */
    public static ItemStack moveOneItem(IInventory source, IInventory dest, IStackFilter filter) {
        InventoryManipulator imSource = InventoryManipulator.get(source);
        return imSource.moveItem(dest, filter);
    }

    /**
     * Attempts to move one item from a collection of inventories.
     *
     * @param sources
     * @param dest
     * @param filters ItemStack to match against
     * @return
     */
    public static ItemStack moveOneItem(Collection<IInventory> sources, IInventory dest, ItemStack... filters) {
        for (IInventory inv : sources) {
            ItemStack moved = InvTools.moveOneItem(inv, dest, filters);
            if (moved != null)
                return moved;
        }
        return null;
    }

    /**
     * Attempts to move one item from a collection of inventories.
     *
     * @param sources
     * @param dest
     * @param filter  an IStackFilter to match against
     * @return
     */
    public static ItemStack moveOneItem(Collection<IInventory> sources, IInventory dest, IStackFilter filter) {
        for (IInventory inv : sources) {
            ItemStack moved = InvTools.moveOneItem(inv, dest, filter);
            if (moved != null)
                return moved;
        }
        return null;
    }

    /**
     * Attempts to move one item to a collection of inventories.
     *
     * @param source
     * @param destinations
     * @param filters      ItemStack to match against
     * @return
     */
    public static ItemStack moveOneItem(IInventory source, Collection<IInventory> destinations, ItemStack... filters) {
        for (IInventory dest : destinations) {
            ItemStack moved = InvTools.moveOneItem(source, dest, filters);
            if (moved != null)
                return moved;
        }
        return null;
    }

    /**
     * Attempts to move a single item from one inventory to another.
     *
     * Will not move any items in the filter.
     *
     * @param source
     * @param dest
     * @param filters an ItemStack[] to exclude
     * @return null if nothing was moved, the stack moved otherwise
     */
    public static ItemStack moveOneItemExcept(IInventory source, IInventory dest, ItemStack... filters) {
        return moveOneItem(source, dest, new InvertedStackFilter(new ArrayStackFilter(filters)));
    }

    /**
     * Attempts to move one item from a collection of inventories.
     *
     * @param sources
     * @param dest
     * @param filters
     * @return
     */
    public static ItemStack moveOneItemExcept(Collection<IInventory> sources, IInventory dest, ItemStack... filters) {
        for (IInventory inv : sources) {
            ItemStack moved = InvTools.moveOneItemExcept(inv, dest, filters);
            if (moved != null)
                return moved;
        }
        return null;
    }

    /**
     * Attempts to move one item to a collection of inventories.
     *
     * @param source
     * @param destinations
     * @param filters
     * @return
     */
    public static ItemStack moveOneItemExcept(IInventory source, Collection<IInventory> destinations, ItemStack... filters) {
        for (IInventory dest : destinations) {
            ItemStack moved = InvTools.moveOneItemExcept(source, dest, filters);
            if (moved != null)
                return moved;
        }
        return null;
    }

    public static boolean isWildcard(ItemStack stack) {
        return isWildcard(stack.getItemDamage());
    }

    public static boolean isWildcard(int damage) {
        return damage == -1 || damage == OreDictionary.WILDCARD_VALUE;
    }

    /**
     * A more robust item comparison function.
     *
     * Compares stackSize as well.
     *
     * Two null stacks will return true, unlike the other functions.
     *
     * This function is primarily intended to be used to track changes to an
     * ItemStack.
     *
     * @param a An ItemStack
     * @param b An ItemStack
     * @return True if equal
     */
    public static boolean isItemEqualStrict(ItemStack a, ItemStack b) {
        if (a == null && b == null)
            return true;
        if (a == null || b == null)
            return false;
        if (a.getItem() != b.getItem())
            return false;
        if (a.stackSize != b.stackSize)
            return false;
        if (a.getItemDamage() != b.getItemDamage())
            return false;
        return a.stackTagCompound == null || a.stackTagCompound.equals(b.stackTagCompound);
    }

    /**
     * A more robust item comparison function.
     *
     * Compares stackSize as well.
     *
     * Two null stacks will return true, unlike the other functions.
     *
     * This function is primarily intended to be used to track changes to an
     * ItemStack.
     *
     * @param a An ItemStack
     * @param b An ItemStack
     * @return True if equal
     */
    public static boolean isItemEqualSemiStrict(ItemStack a, ItemStack b) {
        if (a == null && b == null)
            return true;
        if (a == null || b == null)
            return false;
        if (a.getItem() != b.getItem())
            return false;
        if (a.getItemDamage() != b.getItemDamage())
            return false;
        return a.stackTagCompound == null || a.stackTagCompound.equals(b.stackTagCompound);
    }

    /**
     * A more robust item comparison function. Supports items with damage = -1
     * matching any sub-type.
     *
     * @param a An ItemStack
     * @param b An ItemStack
     * @return True if equal
     */
    public static boolean isItemEqual(ItemStack a, ItemStack b) {
        return isItemEqual(a, b, true, true);
    }

    /**
     * A more robust item comparison function. Supports items with damage = -1
     * matching any sub-type.
     *
     * @param a An ItemStack
     * @param b An ItemStack
     * @return True if equal
     */
    public static boolean isItemEqualIgnoreNBT(ItemStack a, ItemStack b) {
        return isItemEqual(a, b, true, false);
    }

    public static boolean isItemEqual(final ItemStack a, final ItemStack b, final boolean matchDamage, final boolean matchNBT) {
        if (a == null || b == null)
            return false;
        if (a.getItem() != b.getItem())
            return false;
        if (matchNBT && !ItemStack.areItemStackTagsEqual(a, b))
            return false;
        if (matchDamage && a.getHasSubtypes()) {
            if (isWildcard(a) || isWildcard(b))
                return true;
            if (a.getItemDamage() != b.getItemDamage())
                return false;
        }
        return true;
    }

    /**
     * Returns true if the item is equal to any one of several possible matches.
     *
     * @param stack
     * @param matches
     * @return
     */
    public static boolean isItemEqual(ItemStack stack, ItemStack... matches) {
        for (ItemStack match : matches) {
            if (isItemEqual(stack, match))
                return true;
        }
        return false;
    }

    /**
     * Returns true if the item is equal to any one of several possible matches.
     *
     * @param stack
     * @param matches
     * @return
     */
    public static boolean isItemEqual(ItemStack stack, Collection<ItemStack> matches) {
        for (ItemStack match : matches) {
            if (isItemEqual(stack, match))
                return true;
        }
        return false;
    }

    public static boolean isItemGreaterOrEqualThan(ItemStack stackA, ItemStack stackB) {
        if (!isItemEqual(stackA, stackB))
            return false;
        return stackA.stackSize >= stackB.stackSize;
    }

    public static boolean isItemLessThanOrEqualTo(ItemStack stackA, ItemStack stackB) {
        if (!isItemEqual(stackA, stackB))
            return false;
        return stackA.stackSize <= stackB.stackSize;
    }

    /**
     * Places an ItemStack in a destination IInventory. Will attempt to move as
     * much of the stack as possible, returning any remainder.
     *
     * @param stack The ItemStack to put in the inventory.
     * @param dest  The destination IInventory.
     * @return Null if itemStack was completely moved, a new itemStack with
     *         remaining stackSize if part or none of the stack was moved.
     */
    public static ItemStack moveItemStack(ItemStack stack, IInventory dest) {
        InventoryManipulator im = InventoryManipulator.get(dest);
        return im.addStack(stack);
    }

    /**
     * Checks if there is room for the ItemStack in the inventory.
     *
     * @param stack The ItemStack
     * @param dest  The IInventory
     * @return true if room for stack
     */
    public static boolean isRoomForStack(ItemStack stack, IInventory dest) {
        if (stack == null || dest == null)
            return false;
        InventoryManipulator im = InventoryManipulator.get(dest);
        return im.canAddStack(stack);
    }

    /**
     * Removes a up to numItems worth of items from the inventory, not caring
     * about what the items are.
     *
     * @param inv
     * @param numItems
     * @return
     */
    public static ItemStack[] removeItems(IInventory inv, int numItems) {
//        if (inv instanceof ISpecialInventory)
//            return ((ISpecialInventory) inv).extractItem(true, ForgeDirection.UNKNOWN, numItems);
        StandaloneInventory output = new StandaloneInventory(27);
        for (int i = 0; i < inv.getSizeInventory(); i++) {
            if (numItems <= 0)
                break;
            ItemStack slot = inv.getStackInSlot(i);
            if (slot == null)
                continue;
            ItemStack removed = inv.decrStackSize(i, numItems);
            numItems -= removed.stackSize;
            ItemStack remainder = moveItemStack(removed, output);
            if (remainder != null) {
                moveItemStack(remainder, inv);
                numItems += remainder.stackSize;
                break;
            }
        }

        List<ItemStack> list = new LinkedList<ItemStack>();
        for (ItemStack stack : output.getContents()) {
            if (stack != null)
                list.add(stack);
        }
        return list.toArray(new ItemStack[0]);
    }

    /**
     * Removes and returns a single item from the inventory.
     *
     * @param inv The inventory
     * @return An ItemStack
     */
    public static ItemStack removeOneItem(IInventory inv) {
        return removeOneItem(inv, StackFilter.ALL);
    }

    /**
     * Removes and returns a single item from the inventory that matches the
     * filter.
     *
     * @param inv    The inventory
     * @param filter ItemStack to match against
     * @return An ItemStack
     */
    public static ItemStack removeOneItem(IInventory inv, ItemStack... filter) {
        return removeOneItem(inv, new ArrayStackFilter(filter));
    }

    /**
     * Removes and returns a single item from the inventory that matches the
     * filter.
     *
     * @param inv    The inventory
     * @param filter EnumItemType to match against
     * @return An ItemStack
     */
    public static ItemStack removeOneItem(IInventory inv, IStackFilter filter) {
        InventoryManipulator im = InventoryManipulator.get(inv);
        return im.removeItem(filter);
    }

    /**
     * Removes and returns a single item from the inventory that matches the
     * filter.
     *
     * @param invs   The inventories
     * @param filter EnumItemType to match against
     * @return An ItemStack
     */
    public static ItemStack removeOneItem(Collection<IInventory> invs, IStackFilter filter) {
        for (IInventory inv : invs) {
            ItemStack stack = removeOneItem(inv, filter);
            if (stack != null)
                return stack;
        }
        return null;
    }

    /**
     * Removes a specified number of items matching the filter, but only if the
     * operation can be completed. If the function returns false, the inventory
     * will not be modified.
     *
     * @param inv
     * @param amount
     * @param filter
     * @return true if there are enough items that can be removed, false
     *         otherwise.
     */
    public static boolean removeItemsAbsolute(IInventory inv, int amount, ItemStack... filter) {
        return removeItemsAbsolute(inv, amount, new ArrayStackFilter(filter));
    }

    /**
     * Removes a specified number of items matching the filter, but only if the
     * operation can be completed. If the function returns false, the inventory
     * will not be modified.
     *
     * @param inv
     * @param amount
     * @param filter
     * @return true if there are enough items that can be removed, false
     *         otherwise.
     */
    public static boolean removeItemsAbsolute(IInventory inv, int amount, IStackFilter filter) {
        InventoryManipulator im = InventoryManipulator.get(inv);
        if (im.canRemoveItems(filter, amount)) {
            im.removeItems(filter, amount);
            return true;
        }
        return false;
    }

    public static void writeInvToNBT(IInventory inv, String tag, NBTTagCompound data) {
        NBTTagList list = new NBTTagList();
        for (byte slot = 0; slot < inv.getSizeInventory(); slot++) {
            ItemStack stack = inv.getStackInSlot(slot);
            if (stack != null) {
                NBTTagCompound itemTag = new NBTTagCompound();
                itemTag.setByte(TAG_SLOT, slot);
                writeItemToNBT(stack, itemTag);
                list.appendTag(itemTag);
            }
        }
        data.setTag(tag, list);
    }

    public static void readInvFromNBT(IInventory inv, String tag, NBTTagCompound data) {
        NBTTagList list = data.getTagList(tag, 10);
        for (byte entry = 0; entry < list.tagCount(); entry++) {
            NBTTagCompound itemTag = list.getCompoundTagAt(entry);
            int slot = itemTag.getByte(TAG_SLOT);
            if (slot >= 0 && slot < inv.getSizeInventory()) {
                ItemStack stack = readItemFromNBT(itemTag);
                inv.setInventorySlotContents(slot, stack);
            }
        }
    }

    public static void writeItemToNBT(ItemStack stack, NBTTagCompound data) {
        if (stack == null || stack.stackSize <= 0)
            return;
        if (stack.stackSize > 127)
            stack.stackSize = 127;
        stack.writeToNBT(data);
    }

    public static ItemStack readItemFromNBT(NBTTagCompound data) {
        return ItemStack.loadItemStackFromNBT(data);
    }

    public static boolean isStackEqualToBlock(ItemStack stack, Block block) {
        if (stack == null || block == null)
            return false;
        if (stack.getItem() instanceof ItemBlock)
            return ((ItemBlock) stack.getItem()).field_150939_a == block;
        return false;
    }

    public static Block getBlockFromStack(ItemStack stack) {
        if (stack.getItem() instanceof ItemBlock)
            return ((ItemBlock) stack.getItem()).field_150939_a;
        return null;
    }

}
TOP

Related Classes of mods.railcraft.common.util.inventory.InvTools

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.