Search in sources :

Example 1 with IFilter

use of logisticspipes.interfaces.routing.IFilter in project LogisticsPipes by RS485.

the class LogisticsPowerProviderTileEntity method sendPowerLaserPackets.

private void sendPowerLaserPackets(IRouter sourceRouter, IRouter destinationRouter, ForgeDirection exitOrientation, boolean addBall) {
    if (sourceRouter == destinationRouter) {
        return;
    }
    LinkedList<Triplet<IRouter, ForgeDirection, Boolean>> todo = new LinkedList<>();
    todo.add(new Triplet<>(sourceRouter, exitOrientation, addBall));
    while (!todo.isEmpty()) {
        Triplet<IRouter, ForgeDirection, Boolean> part = todo.pollFirst();
        List<ExitRoute> exits = part.getValue1().getRoutersOnSide(part.getValue2());
        for (ExitRoute exit : exits) {
            if (exit.containsFlag(PipeRoutingConnectionType.canPowerSubSystemFrom)) {
                // Find only result (caused by only straight connections)
                int distance = part.getValue1().getDistanceToNextPowerPipe(exit.exitOrientation);
                CoreRoutedPipe pipe = part.getValue1().getPipe();
                if (pipe != null && pipe.isInitialized()) {
                    pipe.container.addLaser(exit.exitOrientation, distance, getLaserColor(), false, part.getValue3());
                }
                // Use new sourceRouter
                IRouter nextRouter = exit.destination;
                if (nextRouter == destinationRouter) {
                    return;
                }
                outerRouters: for (ExitRoute newExit : nextRouter.getDistanceTo(destinationRouter)) {
                    if (newExit.containsFlag(PipeRoutingConnectionType.canPowerSubSystemFrom)) {
                        for (IFilter filter : newExit.filters) {
                            if (filter.blockPower()) {
                                continue outerRouters;
                            }
                        }
                        todo.addLast(new Triplet<>(nextRouter, newExit.exitOrientation, newExit.exitOrientation != exit.exitOrientation));
                    }
                }
            }
        }
    }
}
Also used : Triplet(logisticspipes.utils.tuples.Triplet) CoreRoutedPipe(logisticspipes.pipes.basic.CoreRoutedPipe) LinkedList(java.util.LinkedList) IRouter(logisticspipes.routing.IRouter) IFilter(logisticspipes.interfaces.routing.IFilter) ForgeDirection(net.minecraftforge.common.util.ForgeDirection) ExitRoute(logisticspipes.routing.ExitRoute)

Example 2 with IFilter

use of logisticspipes.interfaces.routing.IFilter in project LogisticsPipes by RS485.

the class LogisticsPowerProviderTileEntity method updateEntity.

@Override
public void updateEntity() {
    super.updateEntity();
    pauseRequesting = false;
    if (!init) {
        if (MainProxy.isClient(getWorld())) {
            LogisticsHUDRenderer.instance().add(this);
        }
        init = true;
    }
    double globalRequest = orders.values().stream().reduce(Double::sum).orElse(0.0);
    if (globalRequest > 0) {
        double fullfillRatio = Math.min(1, Math.min(internalStorage, getMaxProvidePerTick()) / globalRequest);
        if (fullfillRatio > 0) {
            for (Entry<Integer, Double> order : orders.entrySet()) {
                double toSend = order.getValue() * fullfillRatio;
                if (toSend > internalStorage) {
                    toSend = internalStorage;
                }
                IRouter destinationRouter = SimpleServiceLocator.routerManager.getRouter(order.getKey());
                if (destinationRouter != null && destinationRouter.getPipe() != null) {
                    WorldCoordinatesWrapper worldCoordinates = new WorldCoordinatesWrapper(this);
                    outerTiles: for (AdjacentTileEntity adjacent : worldCoordinates.getAdjacentTileEntities().collect(Collectors.toList())) {
                        if (adjacent.tileEntity instanceof LogisticsTileGenericPipe) {
                            if (((LogisticsTileGenericPipe) adjacent.tileEntity).pipe instanceof CoreRoutedPipe) {
                                if (((CoreRoutedPipe) ((LogisticsTileGenericPipe) adjacent.tileEntity).pipe).stillNeedReplace()) {
                                    continue;
                                }
                                IRouter sourceRouter = ((CoreRoutedPipe) ((LogisticsTileGenericPipe) adjacent.tileEntity).pipe).getRouter();
                                if (sourceRouter != null) {
                                    outerRouters: for (ExitRoute exit : sourceRouter.getDistanceTo(destinationRouter)) {
                                        if (exit.containsFlag(PipeRoutingConnectionType.canPowerSubSystemFrom)) {
                                            for (IFilter filter : exit.filters) {
                                                if (filter.blockPower()) {
                                                    continue outerRouters;
                                                }
                                            }
                                            CoreRoutedPipe pipe = sourceRouter.getPipe();
                                            if (pipe != null && pipe.isInitialized()) {
                                                pipe.container.addLaser(adjacent.direction.getOpposite(), 1, getLaserColor(), true, true);
                                            }
                                            sendPowerLaserPackets(sourceRouter, destinationRouter, exit.exitOrientation, exit.exitOrientation != adjacent.direction);
                                            internalStorage -= toSend;
                                            handlePower(destinationRouter.getPipe(), toSend);
                                            break outerTiles;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    orders.clear();
    if (MainProxy.isServer(worldObj)) {
        if (internalStorage != lastUpdateStorage) {
            updateClients();
            lastUpdateStorage = internalStorage;
        }
    }
}
Also used : IRouter(logisticspipes.routing.IRouter) IFilter(logisticspipes.interfaces.routing.IFilter) LogisticsTileGenericPipe(logisticspipes.pipes.basic.LogisticsTileGenericPipe) CoreRoutedPipe(logisticspipes.pipes.basic.CoreRoutedPipe) WorldCoordinatesWrapper(network.rs485.logisticspipes.world.WorldCoordinatesWrapper) ExitRoute(logisticspipes.routing.ExitRoute) AdjacentTileEntity(network.rs485.logisticspipes.world.WorldCoordinatesWrapper.AdjacentTileEntity)

Example 3 with IFilter

use of logisticspipes.interfaces.routing.IFilter in project LogisticsPipes by RS485.

the class ModuleCCBasedQuickSort method createSinkMessage.

private void createSinkMessage(int slot, ItemIdentifierStack stack) {
    List<CCSinkResponder> respones = new ArrayList<>();
    IRouter sourceRouter = _service.getRouter();
    if (sourceRouter == null) {
        return;
    }
    // get only pipes with generic interest
    BitSet routersIndex = ServerRouter.getRoutersInterestedIn((ItemIdentifier) null);
    // get the routing table
    List<ExitRoute> validDestinations = new ArrayList<>();
    for (int i = routersIndex.nextSetBit(0); i >= 0; i = routersIndex.nextSetBit(i + 1)) {
        IRouter r = SimpleServiceLocator.routerManager.getRouterUnsafe(i, false);
        List<ExitRoute> exits = sourceRouter.getDistanceTo(r);
        if (exits != null) {
            validDestinations.addAll(exits.stream().filter(e -> e.containsFlag(PipeRoutingConnectionType.canRouteTo)).collect(Collectors.toList()));
        }
    }
    Collections.sort(validDestinations);
    outer: for (ExitRoute candidateRouter : validDestinations) {
        if (candidateRouter.destination.getId().equals(sourceRouter.getId())) {
            continue;
        }
        for (IFilter filter : candidateRouter.filters) {
            if (filter.blockRouting() || (filter.isBlocked() == filter.isFilteredItem(stack.getItem()))) {
                continue outer;
            }
        }
        if (candidateRouter.destination != null && candidateRouter.destination.getLogisticsModule() != null) {
            respones.addAll(candidateRouter.destination.getLogisticsModule().queueCCSinkEvent(stack));
        }
    }
    sinkResponses.put(slot, new Pair<>(0, respones));
}
Also used : IRouter(logisticspipes.routing.IRouter) IFilter(logisticspipes.interfaces.routing.IFilter) ArrayList(java.util.ArrayList) BitSet(java.util.BitSet) CCSinkResponder(logisticspipes.proxy.computers.objects.CCSinkResponder) ExitRoute(logisticspipes.routing.ExitRoute)

Example 4 with IFilter

use of logisticspipes.interfaces.routing.IFilter in project LogisticsPipes by RS485.

the class LogisticsManager method getAvailableItems.

/**
	 * @param validDestinations
	 *            a list of ExitRoute of valid destinations.
	 * @return HashMap with ItemIdentifier and Integer item count of available
	 *         items.
	 */
@Override
public HashMap<ItemIdentifier, Integer> getAvailableItems(List<ExitRoute> validDestinations) {
    //TODO: Replace this entire function wiht a fetch from the pre-built arrays (path incoming later)
    List<Map<ItemIdentifier, Integer>> items = new ArrayList<>(ServerRouter.getBiggestSimpleID());
    for (int i = 0; i < ServerRouter.getBiggestSimpleID(); i++) {
        items.add(new HashMap<>());
    }
    BitSet used = new BitSet(ServerRouter.getBiggestSimpleID());
    outer: for (ExitRoute r : validDestinations) {
        if (r == null) {
            continue;
        }
        if (!r.containsFlag(PipeRoutingConnectionType.canRequestFrom)) {
            continue;
        }
        if (!(r.destination.getPipe() instanceof IProvideItems)) {
            continue;
        }
        for (IFilter filter : r.filters) {
            if (filter.blockProvider()) {
                continue outer;
            }
        }
        IProvideItems provider = (IProvideItems) r.destination.getPipe();
        provider.getAllItems(items.get(r.destination.getSimpleID()), r.filters);
        used.set(r.destination.getSimpleID(), true);
    }
    //TODO: Fix this doubly nested list
    HashMap<ItemIdentifier, Integer> allAvailableItems = new HashMap<>();
    for (Map<ItemIdentifier, Integer> allItems : items) {
        for (Entry<ItemIdentifier, Integer> item : allItems.entrySet()) {
            Integer currentItem = allAvailableItems.get(item.getKey());
            if (currentItem == null) {
                allAvailableItems.put(item.getKey(), item.getValue());
            } else {
                allAvailableItems.put(item.getKey(), currentItem + item.getValue());
            }
        }
    }
    return allAvailableItems;
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) BitSet(java.util.BitSet) IProvideItems(logisticspipes.interfaces.routing.IProvideItems) ItemIdentifier(logisticspipes.utils.item.ItemIdentifier) IFilter(logisticspipes.interfaces.routing.IFilter) ExitRoute(logisticspipes.routing.ExitRoute) HashMap(java.util.HashMap) Map(java.util.Map)

Example 5 with IFilter

use of logisticspipes.interfaces.routing.IFilter in project LogisticsPipes by RS485.

the class LogisticsManager method getAmountFor.

@Override
public int getAmountFor(ItemIdentifier itemType, List<ExitRoute> validDestinations) {
    // TODO: Replace this entire function wiht a fetch from the pre-built arrays (path incoming later)
    List<Map<ItemIdentifier, Integer>> items = new ArrayList<>(ServerRouter.getBiggestSimpleID());
    for (int i = 0; i < ServerRouter.getBiggestSimpleID(); i++) {
        items.add(new HashMap<>());
    }
    BitSet used = new BitSet(ServerRouter.getBiggestSimpleID());
    outer: for (ExitRoute r : validDestinations) {
        if (r == null) {
            continue;
        }
        if (!r.containsFlag(PipeRoutingConnectionType.canRequestFrom)) {
            continue;
        }
        if (!(r.destination.getPipe() instanceof IProvideItems)) {
            continue;
        }
        for (IFilter filter : r.filters) {
            if (filter.blockProvider()) {
                continue outer;
            }
        }
        IProvideItems provider = (IProvideItems) r.destination.getPipe();
        provider.getAllItems(items.get(r.destination.getSimpleID()), r.filters);
        used.set(r.destination.getSimpleID(), true);
    }
    // TODO: Fix this doubly nested list
    int amount = 0;
    for (Map<ItemIdentifier, Integer> allItems : items) {
        for (Entry<ItemIdentifier, Integer> item : allItems.entrySet()) {
            if (item.getKey().equals(itemType)) {
                amount += item.getValue();
            }
        }
    }
    return amount;
}
Also used : ArrayList(java.util.ArrayList) BitSet(java.util.BitSet) IProvideItems(logisticspipes.interfaces.routing.IProvideItems) ItemIdentifier(logisticspipes.utils.item.ItemIdentifier) IFilter(logisticspipes.interfaces.routing.IFilter) ExitRoute(logisticspipes.routing.ExitRoute) HashMap(java.util.HashMap) Map(java.util.Map)

Aggregations

IFilter (logisticspipes.interfaces.routing.IFilter)21 ArrayList (java.util.ArrayList)13 ExitRoute (logisticspipes.routing.ExitRoute)12 LinkedList (java.util.LinkedList)9 IRouter (logisticspipes.routing.IRouter)9 ItemIdentifier (logisticspipes.utils.item.ItemIdentifier)9 List (java.util.List)8 BitSet (java.util.BitSet)7 CoreRoutedPipe (logisticspipes.pipes.basic.CoreRoutedPipe)7 HashMap (java.util.HashMap)6 Map (java.util.Map)6 Entry (java.util.Map.Entry)6 Pair (logisticspipes.utils.tuples.Pair)6 DictResource (logisticspipes.request.resources.DictResource)5 IResource (logisticspipes.request.resources.IResource)5 Iterator (java.util.Iterator)4 Collectors (java.util.stream.Collectors)4 IProvideItems (logisticspipes.interfaces.routing.IProvideItems)4 LogisticsModule (logisticspipes.modules.abstractmodules.LogisticsModule)4 SimpleServiceLocator (logisticspipes.proxy.SimpleServiceLocator)4