use of cofh.thermaldynamics.multiblock.Route in project LogisticsPipes by RS485.
the class TDDuctInformationProvider method getDistanceTo.
@Override
public double getDistanceTo(int destinationint, ForgeDirection ignore, ItemIdentifier ident, boolean isActive, double traveled, double max, List<DoubleCoordinates> visited) {
if (traveled >= max) {
return Integer.MAX_VALUE;
}
IRouter destination = SimpleServiceLocator.routerManager.getRouter(destinationint);
if (destination == null) {
return Integer.MAX_VALUE;
}
Iterable<Route> paramIterable = duct.getCache(true).outputRoutes;
double closesedConnection = Integer.MAX_VALUE;
for (Route localRoute1 : paramIterable) {
if (localRoute1.endPoint instanceof LPItemDuct) {
LPItemDuct lpDuct = (LPItemDuct) localRoute1.endPoint;
if (traveled + localRoute1.pathWeight > max) {
continue;
}
DoubleCoordinates pos = new DoubleCoordinates((TileEntity) lpDuct.pipe);
if (visited.contains(pos)) {
continue;
}
visited.add(pos);
double distance = lpDuct.pipe.getDistanceTo(destinationint, ForgeDirection.getOrientation(localRoute1.pathDirections.get(localRoute1.pathDirections.size() - 1)).getOpposite(), ident, isActive, traveled + localRoute1.pathWeight, Math.min(max, closesedConnection), visited);
visited.remove(pos);
if (distance != Integer.MAX_VALUE && distance + localRoute1.pathWeight < closesedConnection) {
closesedConnection = distance + localRoute1.pathWeight;
}
}
}
return closesedConnection;
}
use of cofh.thermaldynamics.multiblock.Route in project LogisticsPipes by RS485.
the class TDDuctInformationProvider method acceptItem.
@Override
public boolean acceptItem(LPTravelingItem item, TileEntity from) {
if (item instanceof LPTravelingItemServer) {
LPTravelingItemServer serverItem = (LPTravelingItemServer) item;
int id = serverItem.getInfo().destinationint;
if (id == -1) {
id = SimpleServiceLocator.routerManager.getIDforUUID(serverItem.getInfo().destinationUUID);
}
IRouter destination = SimpleServiceLocator.routerManager.getRouter(id);
if (destination == null) {
return false;
}
RouteCache routes = duct.getCache(true);
Iterable<Route> paramIterable = routes.outputRoutes;
Route route = null;
Object cache = null;
Triplet<Integer, ItemIdentifier, Boolean> key = new Triplet<>(id, item.getItemIdentifierStack().getItem(), serverItem.getInfo()._transportMode == TransportMode.Active);
if (duct instanceof ILPTEInformation && ((ILPTEInformation) duct).getObject() != null) {
cache = ((ILPTEInformation) duct).getObject().getCacheHolder().getCacheFor(CacheTypes.Routing, key);
}
if (cache instanceof Route) {
route = (Route) cache;
if (!routes.outputRoutes.contains(route)) {
route = null;
}
}
if (route == null) {
Pair<Double, Route> closesedConnection = null;
List<DoubleCoordinates> visited = new ArrayList<>();
visited.add(new DoubleCoordinates(from));
for (Route localRoute1 : paramIterable) {
if (localRoute1.endPoint instanceof LPItemDuct) {
LPItemDuct lpDuct = (LPItemDuct) localRoute1.endPoint;
double max = Integer.MAX_VALUE;
if (closesedConnection != null) {
max = closesedConnection.getValue1();
}
DoubleCoordinates pos = new DoubleCoordinates((TileEntity) lpDuct.pipe);
if (visited.contains(pos)) {
continue;
}
visited.add(pos);
double distance = lpDuct.pipe.getDistanceTo(id, ForgeDirection.getOrientation(localRoute1.pathDirections.get(localRoute1.pathDirections.size() - 1)).getOpposite(), item.getItemIdentifierStack().getItem(), serverItem.getInfo()._transportMode == TransportMode.Active, localRoute1.pathWeight, max, visited);
visited.remove(pos);
if (distance != Integer.MAX_VALUE && (closesedConnection == null || distance + localRoute1.pathDirections.size() < closesedConnection.getValue1())) {
closesedConnection = new Pair<>(distance + localRoute1.pathWeight, localRoute1);
}
}
}
if (closesedConnection != null) {
route = closesedConnection.getValue2();
}
}
if (route != null) {
if (duct instanceof ILPTEInformation && ((ILPTEInformation) duct).getObject() != null) {
((ILPTEInformation) duct).getObject().getCacheHolder().setCache(CacheTypes.Routing, key, route);
}
TravelingItem travelItem = new TravelingItem(item.getItemIdentifierStack().makeNormalStack(), duct, route.copy(), (byte) serverItem.output.ordinal(), (byte) 1);
travelItem.lpRoutingInformation = serverItem.getInfo();
duct.insertNewItem(travelItem);
return true;
}
} else {
return true;
}
return false;
}
use of cofh.thermaldynamics.multiblock.Route in project LogisticsPipes by RS485.
the class TDDuctInformationProvider method getConnectedPipes.
@Override
public List<RouteInfo> getConnectedPipes(ForgeDirection from) {
List<RouteInfo> list = new ArrayList<>();
if (duct.internalGrid == null) {
return null;
}
Iterable<Route> paramIterable = duct.getCache(true).outputRoutes;
for (Route localRoute1 : paramIterable) {
if (localRoute1.endPoint instanceof LPItemDuct) {
LPItemDuct lpDuct = (LPItemDuct) localRoute1.endPoint;
list.add(new RouteInfo(lpDuct.pipe, localRoute1.pathWeight, ForgeDirection.getOrientation(localRoute1.pathDirections.get(localRoute1.pathDirections.size() - 1))));
}
}
return list;
}
Aggregations