package advancedsystemsmanager.flow.execution.commands; import advancedsystemsmanager.api.IConditionStuffMenu; import advancedsystemsmanager.flow.Connection; import advancedsystemsmanager.flow.FlowComponent; import advancedsystemsmanager.flow.menus.*; import advancedsystemsmanager.flow.setting.Setting; import advancedsystemsmanager.registry.ConnectionOption; import advancedsystemsmanager.registry.ConnectionSet; import advancedsystemsmanager.util.SystemCoord; import net.minecraft.item.ItemStack; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public abstract class CommandCondition<Type, Menu extends MenuTarget> extends CommandBase<Type> { public CommandCondition(int id, String name) { super(id, name, CommandType.COMMAND_CONTROL, ConnectionSet.STANDARD_CONDITION); } @Override @SuppressWarnings("unchecked") public List<Connection> getActiveChildren(FlowComponent command, int connectionId) { MenuStuff<Type> menuItem = (MenuStuff<Type>)command.getMenus().get(2); List<Setting<Type>> settings = getValidSettings(menuItem.getSettings()); Set<Setting<Type>> found = new HashSet<Setting<Type>>(); searchForStuff(getContainers(command.getManager(), (MenuContainer)command.getMenus().get(0)), settings, (Menu)command.getMenus().get(1), found); boolean findAll = ((IConditionStuffMenu)menuItem).requiresAll(); boolean success = findAll; for (Setting<Type> setting : found) { if (findAll && setting.getAmountLeft() > 0) { success = false; break; } else if (!findAll && setting.getAmountLeft() < 1) { success = true; break; } } List<Connection> active = new ArrayList<Connection>(); for (int i = 0; i < command.getConnectionSet().getConnections().length; ++i) { Connection connection = command.getConnection(i); ConnectionOption option = command.getConnectionSet().getConnections()[i]; if (connection != null && !option.isInput() && (option == ConnectionOption.CONDITION_TRUE) == success) { active.add(connection); break; } } return active; } public void searchForStuff(List<SystemCoord> blocks, List<Setting<Type>> settings, Menu targets, Set<Setting<Type>> found) { for (SystemCoord block : blocks) { if (settings.isEmpty()) break; searchForStuff(block, settings, targets, found); } } public abstract void searchForStuff(SystemCoord block, List<Setting<Type>> settings, Menu targets, Set<Setting<Type>> found); }