/** * 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 buildcraft.api.core.IZone; import buildcraft.api.robots.AIRobot; import buildcraft.api.robots.DockingStation; import buildcraft.api.robots.EntityRobotBase; import buildcraft.robotics.IStationFilter; import buildcraft.robotics.statements.ActionStationForbidRobot; public class AIRobotSearchStation extends AIRobot { public DockingStation targetStation; private IStationFilter filter; private IZone zone; public AIRobotSearchStation(EntityRobotBase iRobot) { super(iRobot); } public AIRobotSearchStation(EntityRobotBase iRobot, IStationFilter iFilter, IZone iZone) { this(iRobot); filter = iFilter; zone = iZone; } @Override public void start() { if (robot.getDockingStation() != null && filter.matches(robot.getDockingStation())) { targetStation = robot.getDockingStation(); terminate(); return; } double potentialStationDistance = Float.MAX_VALUE; DockingStation potentialStation = null; for (DockingStation station : robot.getRegistry().getStations()) { if (!station.isInitialized()) { continue; } if (station.isTaken() && station.robotIdTaking() != robot.getRobotId()) { continue; } if (zone != null && !zone.contains(station.x(), station.y(), station.z())) { continue; } if (filter.matches(station)) { if (ActionStationForbidRobot.isForbidden(station, robot)) { continue; } double dx = robot.posX - station.x(); double dy = robot.posY - station.y(); double dz = robot.posZ - station.z(); double distance = dx * dx + dy * dy + dz * dz; if (potentialStation == null || distance < potentialStationDistance) { potentialStation = station; potentialStationDistance = distance; } } } if (potentialStation != null) { targetStation = potentialStation; } terminate(); } @Override public void delegateAIEnded(AIRobot ai) { terminate(); } @Override public boolean success() { return targetStation != null; } }