/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.robotics.ai; import java.util.ArrayList; import java.util.Collection; import java.util.List; import net.minecraft.item.ItemStack; import buildcraft.api.robots.AIRobot; import buildcraft.api.robots.DockingStation; import buildcraft.api.robots.EntityRobotBase; import buildcraft.api.robots.IRequestProvider; import buildcraft.core.lib.inventory.StackHelper; import buildcraft.core.lib.inventory.filters.IStackFilter; import buildcraft.robotics.IStationFilter; import buildcraft.robotics.StackRequest; public class AIRobotSearchStackRequest extends AIRobot { public StackRequest request = null; public DockingStation station = null; private Collection<ItemStack> blackList; private IStackFilter filter; public AIRobotSearchStackRequest(EntityRobotBase iRobot) { super(iRobot); } public AIRobotSearchStackRequest(EntityRobotBase iRobot, IStackFilter iFilter, Collection<ItemStack> iBlackList) { this(iRobot); blackList = iBlackList; filter = iFilter; } @Override public void start() { startDelegateAI(new AIRobotSearchStation(robot, new StationProviderFilter(), robot.getZoneToWork())); } @Override public void delegateAIEnded(AIRobot ai) { if (ai instanceof AIRobotSearchStation) { if (ai.success()) { request = getOrderFromRequestingStation(((AIRobotSearchStation) ai).targetStation, true); } terminate(); } } @Override public boolean success() { return request != null; } private boolean isBlacklisted(ItemStack stack) { for (ItemStack black : blackList) { if (StackHelper.isMatchingItem(stack, black)) { return true; } } return false; } private StackRequest getOrderFromRequestingStation(DockingStation station, boolean take) { for (StackRequest req : getAvailableRequests(station)) { if (!isBlacklisted(req.getStack()) && filter.matches(req.getStack())) { req.setStation(station); if (take) { if (robot.getRegistry().take(req.getResourceId(robot.worldObj), robot)) { return req; } } else { return req; } } } return null; } private Collection<StackRequest> getAvailableRequests(DockingStation station) { List<StackRequest> result = new ArrayList<StackRequest>(); IRequestProvider provider = station.getRequestProvider(); if (provider == null) { return result; } for (int i = 0; i < provider.getRequestsCount(); i++) { if (provider.getRequest(i) == null) { continue; } StackRequest req = new StackRequest(provider, i, provider.getRequest(i)); req.setStation(station); if (!robot.getRegistry().isTaken(req.getResourceId(robot.worldObj))) { result.add(req); } } return result; } private class StationProviderFilter implements IStationFilter { @Override public boolean matches(DockingStation station) { return getOrderFromRequestingStation(station, false) != null; } } }