Search in sources :

Example 1 with IList

use of buildcraft.api.items.IList in project BuildCraft by BuildCraft.

the class TriggerInventory method isTriggerActive.

@Override
public boolean isTriggerActive(TileEntity tile, EnumFacing side, IStatementContainer container, IStatementParameter[] parameters) {
    ItemStack searchedStack = StackUtil.EMPTY;
    if (parameters != null && parameters.length >= 1 && parameters[0] != null) {
        searchedStack = parameters[0].getItemStack();
    }
    IItemHandler handler = tile.getCapability(CapUtil.CAP_ITEMS, side.getOpposite());
    if (handler != null) {
        boolean hasSlots = false;
        boolean foundItems = false;
        boolean foundSpace = false;
        for (int i = 0; i < handler.getSlots(); i++) {
            hasSlots = true;
            ItemStack stack = handler.getStackInSlot(i);
            // TODO: Replace some of this with
            foundItems |= !stack.isEmpty() && (searchedStack.isEmpty() || StackUtil.canStacksOrListsMerge(stack, searchedStack));
            foundSpace |= // 
            (stack.isEmpty() || (StackUtil.canStacksOrListsMerge(stack, searchedStack) && stack.getCount() < stack.getMaxStackSize())) && (searchedStack.isEmpty() || searchedStack.getItem() instanceof IList || handler.insertItem(i, searchedStack, true).isEmpty());
        // On the test above, we deactivate item list as inventories
        // typically don't check for lists possibility. This is a
        // heuristic which is more desirable than expensive computation
        // of list components or possibility of extension
        }
        if (!hasSlots) {
            return false;
        }
        switch(state) {
            case EMPTY:
                return !foundItems;
            case CONTAINS:
                return foundItems;
            case SPACE:
                return foundSpace;
            default:
                return !foundSpace;
        }
    }
    return false;
}
Also used : IItemHandler(net.minecraftforge.items.IItemHandler) StatementParameterItemStack(buildcraft.api.statements.StatementParameterItemStack) ItemStack(net.minecraft.item.ItemStack) IList(buildcraft.api.items.IList)

Example 2 with IList

use of buildcraft.api.items.IList in project BuildCraft by BuildCraft.

the class TriggerInventoryLevel method isTriggerActive.

@Override
public boolean isTriggerActive(TileEntity tile, EnumFacing side, IStatementContainer container, IStatementParameter[] parameters) {
    IItemHandler itemHandler = tile.getCapability(CapUtil.CAP_ITEMS, side.getOpposite());
    if (itemHandler == null) {
        return false;
    }
    IItemHandlerFiltered filters = ObjectUtilBC.castOrNull(itemHandler, IItemHandlerFiltered.class);
    StatementParameterItemStack param = getParam(0, parameters, new StatementParameterItemStack());
    ItemStack searchStack = param.getItemStack();
    int itemSpace = 0;
    int foundItems = 0;
    for (int slot = 0; slot < itemHandler.getSlots(); slot++) {
        ItemStack stackInSlot = itemHandler.getStackInSlot(slot);
        if (stackInSlot.isEmpty()) {
            if (searchStack.isEmpty()) {
                itemSpace += itemHandler.getSlotLimit(slot);
            } else {
                if (searchStack.getItem() instanceof IList) {
                    // Unfortunately lists are too generic to work properly
                    // without a simple filtered inventory.
                    ItemStack filter = filters == null ? ItemStack.EMPTY : filters.getFilter(slot);
                    if (StackUtil.matchesStackOrList(searchStack, filter)) {
                        itemSpace += Math.min(filter.getMaxStackSize(), itemHandler.getSlotLimit(slot));
                    }
                } else {
                    ItemStack stack = searchStack.copy();
                    int count = Math.min(itemHandler.getSlotLimit(slot), searchStack.getMaxStackSize());
                    stack.setCount(count);
                    ItemStack leftOver = itemHandler.insertItem(slot, stack, true);
                    if (leftOver.isEmpty()) {
                        itemSpace += count;
                    } else {
                        itemSpace += count - leftOver.getCount();
                    }
                }
            }
        } else {
            if (searchStack.isEmpty() || StackUtil.matchesStackOrList(searchStack, stackInSlot)) {
                itemSpace += Math.min(stackInSlot.getMaxStackSize(), itemHandler.getSlotLimit(slot));
                foundItems += stackInSlot.getCount();
            }
        }
    }
    if (itemSpace > 0) {
        float percentage = foundItems / (float) itemSpace;
        return percentage < type.level;
    }
    return false;
}
Also used : IItemHandler(net.minecraftforge.items.IItemHandler) IItemHandlerFiltered(buildcraft.api.inventory.IItemHandlerFiltered) StatementParameterItemStack(buildcraft.api.statements.StatementParameterItemStack) StatementParameterItemStack(buildcraft.api.statements.StatementParameterItemStack) ItemStack(net.minecraft.item.ItemStack) IList(buildcraft.api.items.IList)

Aggregations

IList (buildcraft.api.items.IList)2 StatementParameterItemStack (buildcraft.api.statements.StatementParameterItemStack)2 ItemStack (net.minecraft.item.ItemStack)2 IItemHandler (net.minecraftforge.items.IItemHandler)2 IItemHandlerFiltered (buildcraft.api.inventory.IItemHandlerFiltered)1