use of logisticspipes.utils.tuples.Pair in project LogisticsPipes by RS485.
the class ModuleCCBasedQuickSort method handleSinkResponses.
private void handleSinkResponses(IInventoryUtil invUtil) {
boolean changed = false;
Iterator<Entry<Integer, Pair<Integer, List<CCSinkResponder>>>> iter = sinkResponses.entrySet().iterator();
while (iter.hasNext()) {
Entry<Integer, Pair<Integer, List<CCSinkResponder>>> pair = iter.next();
pair.getValue().setValue1(pair.getValue().getValue1() + 1);
boolean canBeHandled = true;
for (CCSinkResponder response : pair.getValue().getValue2()) {
if (!response.isDone()) {
canBeHandled = false;
break;
}
}
if (canBeHandled || pair.getValue().getValue1() > timeout) {
// skip entry, if slot is not in the inventory (too high).
boolean slotInInventory = pair.getKey() < invUtil.getSizeInventory();
if (slotInInventory && handle(invUtil, pair.getKey(), pair.getValue().getValue2())) {
stalled = false;
lastSuceededStack = pair.getKey();
}
iter.remove();
changed = true;
}
}
if (changed) {
checkSize();
}
}
use of logisticspipes.utils.tuples.Pair in project LogisticsPipes by RS485.
the class ModuleCrafter method spaceFor.
protected int spaceFor(ItemIdentifier item, boolean includeInTransit) {
Pair<String, ItemIdentifier> key = new Pair<>("spaceFor", item);
Object cache = _service.getCacheHolder().getCacheFor(CacheTypes.Inventory, key);
if (cache != null) {
int count = (Integer) cache;
if (includeInTransit) {
count -= _service.countOnRoute(item);
}
return count;
}
WorldCoordinatesWrapper worldCoordinates = new WorldCoordinatesWrapper(getWorld(), _service.getX(), _service.getY(), _service.getZ());
//@formatter:off
int count = worldCoordinates.getConnectedAdjacentTileEntities(ConnectionPipeType.ITEM).filter(adjacent -> adjacent.tileEntity instanceof IInventory).map(adjacent -> new Pair<>((IInventory) adjacent.tileEntity, adjacent.direction)).map(invDirPair -> {
if (invDirPair.getValue1() instanceof ISidedInventory) {
invDirPair.setValue1(new SidedInventoryMinecraftAdapter((ISidedInventory) invDirPair.getValue1(), invDirPair.getValue2().getOpposite(), false));
}
if (getUpgradeManager().hasSneakyUpgrade()) {
invDirPair.setValue2(getUpgradeManager().getSneakyOrientation());
}
IInventoryUtil inv = SimpleServiceLocator.inventoryUtilFactory.getInventoryUtil(invDirPair.getValue1(), invDirPair.getValue2());
return inv.roomForItem(item, 9999);
}).reduce(Integer::sum).orElse(0);
_service.getCacheHolder().setCache(CacheTypes.Inventory, key, count);
if (includeInTransit) {
count -= _service.countOnRoute(item);
}
return count;
}
use of logisticspipes.utils.tuples.Pair in project LogisticsPipes by RS485.
the class LogisticsFluidManager method getBestReply.
@Override
public Pair<Integer, Integer> getBestReply(FluidStack stack, IRouter sourceRouter, List<Integer> jamList) {
for (ExitRoute candidateRouter : sourceRouter.getIRoutersByCost()) {
if (!candidateRouter.containsFlag(PipeRoutingConnectionType.canRouteTo)) {
continue;
}
if (candidateRouter.destination.getSimpleID() == sourceRouter.getSimpleID()) {
continue;
}
if (jamList.contains(candidateRouter.destination.getSimpleID())) {
continue;
}
if (candidateRouter.destination.getPipe() == null || !candidateRouter.destination.getPipe().isEnabled()) {
continue;
}
CoreRoutedPipe pipe = candidateRouter.destination.getPipe();
if (!(pipe instanceof IFluidSink)) {
continue;
}
int amount = ((IFluidSink) pipe).sinkAmount(stack);
if (amount > 0) {
Pair<Integer, Integer> result = new Pair<>(candidateRouter.destination.getSimpleID(), amount);
return result;
}
}
Pair<Integer, Integer> result = new Pair<>(0, 0);
return result;
}
use of logisticspipes.utils.tuples.Pair in project LogisticsPipes by RS485.
the class PipeItemsProviderLogistics method sendStack.
private int sendStack(ItemIdentifierStack stack, int maxCount, int destination, IAdditionalTargetInformation info) {
ItemIdentifier item = stack.getItem();
WorldCoordinatesWrapper worldCoordinates = new WorldCoordinatesWrapper(container);
//@formatter:off
Iterator<Pair<IInventoryUtil, ForgeDirection>> iterator = worldCoordinates.getConnectedAdjacentTileEntities(ConnectionPipeType.ITEM).filter(adjacent -> adjacent.tileEntity instanceof IInventory).filter(adjacent -> !SimpleServiceLocator.pipeInformationManager.isItemPipe(adjacent.tileEntity)).map(adjacent -> new Pair<>(getAdaptedInventoryUtil(adjacent), adjacent.direction)).iterator();
while (iterator.hasNext()) {
Pair<IInventoryUtil, ForgeDirection> next = iterator.next();
int available = next.getValue1().itemCount(item);
if (available == 0) {
continue;
}
int wanted = Math.min(available, stack.getStackSize());
wanted = Math.min(wanted, maxCount);
wanted = Math.min(wanted, item.getMaxStackSize());
IRouter dRtr = SimpleServiceLocator.routerManager.getRouterUnsafe(destination, false);
if (dRtr == null) {
_orderManager.sendFailed();
return 0;
}
SinkReply reply = LogisticsManager.canSink(dRtr, null, true, stack.getItem(), null, true, false);
boolean defersend = false;
if (reply != null) {
// some pipes are not aware of the space in the adjacent inventory, so they return null
if (reply.maxNumberOfItems < wanted) {
wanted = reply.maxNumberOfItems;
if (wanted <= 0) {
_orderManager.deferSend();
return 0;
}
defersend = true;
}
}
if (!canUseEnergy(wanted * neededEnergy())) {
return -1;
}
ItemStack removed = next.getValue1().getMultipleItems(item, wanted);
if (removed == null || removed.stackSize == 0) {
continue;
}
int sent = removed.stackSize;
useEnergy(sent * neededEnergy());
IRoutedItem routedItem = SimpleServiceLocator.routedItemHelper.createNewTravelItem(removed);
routedItem.setDestination(destination);
routedItem.setTransportMode(TransportMode.Active);
routedItem.setAdditionalTargetInformation(info);
super.queueRoutedItem(routedItem, next.getValue2());
_orderManager.sendSuccessfull(sent, defersend, routedItem);
return sent;
}
_orderManager.sendFailed();
return 0;
}
use of logisticspipes.utils.tuples.Pair in project LogisticsPipes by RS485.
the class RequestTreeNode method getCrafters.
private static List<Pair<ICraftingTemplate, List<IFilter>>> getCrafters(IResource iRequestType, List<ExitRoute> validDestinations) {
List<Pair<ICraftingTemplate, List<IFilter>>> crafters = new ArrayList<>(validDestinations.size());
for (ExitRoute r : validDestinations) {
CoreRoutedPipe pipe = r.destination.getPipe();
if (r.containsFlag(PipeRoutingConnectionType.canRequestFrom)) {
if (pipe instanceof ICraft) {
ICraftingTemplate craftable = ((ICraft) pipe).addCrafting(iRequestType);
if (craftable != null) {
for (IFilter filter : r.filters) {
if (filter.isBlocked() == filter.isFilteredItem(craftable.getResultItem()) || filter.blockCrafting()) {
continue;
}
}
List<IFilter> list = new LinkedList<>();
list.addAll(r.filters);
crafters.add(new Pair<>(craftable, list));
}
}
}
}
// Collections.sort(crafters,new CraftingTemplate.PairPrioritizer());
return crafters;
}
Aggregations