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;
}
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;
}
Aggregations