package advancedsystemsmanager.flow.execution.commands; import advancedsystemsmanager.api.tileentities.IInternalInventory; import advancedsystemsmanager.flow.Connection; import advancedsystemsmanager.flow.FlowComponent; import advancedsystemsmanager.flow.menus.Menu; import advancedsystemsmanager.flow.menus.MenuInventoryCondition; import advancedsystemsmanager.flow.menus.MenuItemCondition; import advancedsystemsmanager.flow.menus.MenuTargetInventory; import advancedsystemsmanager.flow.setting.Setting; import advancedsystemsmanager.reference.Names; import advancedsystemsmanager.registry.ConnectionOption; import advancedsystemsmanager.util.SystemCoord; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class CommandItemCondition extends CommandCondition<ItemStack, MenuTargetInventory> { public CommandItemCondition() { super(ITEM_CONDITION, Names.ITEM_CONDITION); } @Override public void searchForStuff(SystemCoord block, List<Setting<ItemStack>> settings, MenuTargetInventory target, Set<Setting<ItemStack>> found) { TileEntity entity = block.getTileEntity(); if (entity instanceof IInternalInventory) { } else { IInventory inventory = (IInventory)entity; List<Integer> checkedSlots = new ArrayList<Integer>(); int maxSize = inventory.getSizeInventory(); for (int i = 0; i < 6; i++) { if (target.activatedDirections[i]) { int start = target.advancedDirections[i] ? target.getStart(i) : 0; int end = target.advancedDirections[i] ? target.getEnd(i) : maxSize - 1; int[] slots; if (inventory instanceof ISidedInventory) { slots = ((ISidedInventory)inventory).getAccessibleSlotsFromSide(i); } else { slots = new int[end - start + 1]; for (int j = 0; j < slots.length; ) slots[j + start] = j++; } scanSlots(inventory, checkedSlots, slots, settings, start, end, found); } } } } private void scanSlots(IInventory inventory, List<Integer> checked, int[] toScan, List<Setting<ItemStack>> settings, int start, int end, Set<Setting<ItemStack>> found) { for (int slot : toScan) { if (slot < start || checked.contains(slot)) continue; if (slot > end) return; ItemStack stack = inventory.getStackInSlot(slot); if (stack == null) continue; Setting<ItemStack> setting = isValid(settings, stack); if (setting != null) { if (found != null) { found.add(setting); } setting.reduceAmount(stack.stackSize); } checked.add(slot); } } @Override public void getMenus(FlowComponent component, List<Menu> menus) { menus.add(new MenuInventoryCondition(component)); menus.add(new MenuTargetInventory(component)); menus.add(new MenuItemCondition(component)); } }