use of logisticspipes.interfaces.IInventoryUtil 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.interfaces.IInventoryUtil in project LogisticsPipes by RS485.
the class PipeLogisticsChassi method getSpecificInterests.
@Override
public Set<ItemIdentifier> getSpecificInterests() {
Set<ItemIdentifier> l1 = new TreeSet<>();
//if we don't have a pointed inventory we can't be interested in anything
if (getRealInventory() == null) {
return l1;
}
for (int moduleIndex = 0; moduleIndex < getChassiSize(); moduleIndex++) {
LogisticsModule module = _module.getSubModule(moduleIndex);
if (module != null && module.interestedInAttachedInventory()) {
IInventoryUtil inv = getSneakyInventory(false, module.getSlot(), module.getPositionInt());
if (inv == null) {
continue;
}
Set<ItemIdentifier> items = inv.getItems();
l1.addAll(items);
//also add tag-less variants ... we should probably add a module.interestedIgnoringNBT at some point
l1.addAll(items.stream().map(ItemIdentifier::getIgnoringNBT).collect(Collectors.toList()));
boolean modulesInterestedInUndamged = false;
for (int i = 0; i < getChassiSize(); i++) {
if (_module.getSubModule(moduleIndex).interestedInUndamagedID()) {
modulesInterestedInUndamged = true;
break;
}
}
if (modulesInterestedInUndamged) {
l1.addAll(items.stream().map(ItemIdentifier::getUndamaged).collect(Collectors.toList()));
}
// no need to check other modules for interest in the inventory, when we know that 1 already is.
break;
}
}
for (int i = 0; i < getChassiSize(); i++) {
LogisticsModule module = _module.getSubModule(i);
if (module != null) {
Collection<ItemIdentifier> current = module.getSpecificInterests();
if (current != null) {
l1.addAll(current);
}
}
}
return l1;
}
use of logisticspipes.interfaces.IInventoryUtil in project LogisticsPipes by RS485.
the class ModuleActiveSupplier method tick.
@Override
public void tick() {
if (!_service.isNthTick(100)) {
return;
}
_requestedItems.values().stream().filter(amount -> amount > 0).forEach(amount -> _service.spawnParticle(Particles.VioletParticle, 2));
WorldCoordinatesWrapper worldCoordinates = new WorldCoordinatesWrapper(_world.getWorld(), getX(), getY(), getZ());
//@formatter:off
worldCoordinates.getConnectedAdjacentTileEntities(ConnectionPipeType.ITEM).filter(adjacent -> adjacent.tileEntity instanceof IInventory).filter(adjacent -> ((IInventory) adjacent.tileEntity).getSizeInventory() > 0).forEach(adjacent -> {
ForgeDirection direction = adjacent.direction;
if (_service.getUpgradeManager(slot, positionInt).hasSneakyUpgrade()) {
direction = _service.getUpgradeManager(slot, positionInt).getSneakyOrientation();
}
IInventoryUtil invUtil = SimpleServiceLocator.inventoryUtilFactory.getInventoryUtil((IInventory) adjacent.tileEntity, direction);
if (_service.getUpgradeManager(slot, positionInt).hasPatternUpgrade()) {
createPatternRequest(invUtil);
} else {
createSupplyRequest(invUtil);
}
});
}
use of logisticspipes.interfaces.IInventoryUtil in project LogisticsPipes by RS485.
the class ModulePassiveSupplier method sinksItem.
@Override
public SinkReply sinksItem(ItemIdentifier item, int bestPriority, int bestCustomPriority, boolean allowDefault, boolean includeInTransit) {
if (bestPriority > _sinkReply.fixedPriority.ordinal() || (bestPriority == _sinkReply.fixedPriority.ordinal() && bestCustomPriority >= _sinkReply.customPriority)) {
return null;
}
IInventoryUtil targetUtil = _service.getSneakyInventory(false, slot, positionInt);
if (targetUtil == null) {
return null;
}
if (!_filterInventory.containsItem(item)) {
return null;
}
int targetCount = _filterInventory.itemCount(item);
int haveCount = targetUtil.itemCount(item);
if (targetCount <= haveCount) {
return null;
}
if (_service.canUseEnergy(2)) {
return new SinkReply(_sinkReply, targetCount - haveCount);
}
return null;
}
use of logisticspipes.interfaces.IInventoryUtil in project LogisticsPipes by RS485.
the class ModuleProvider method sendStack.
// returns -1 on permanently failed, don't try another stack this tick
// returns 0 on "unable to do this delivery"
private int sendStack(ItemIdentifierStack stack, int maxCount, int destination, IAdditionalTargetInformation info) {
ItemIdentifier item = stack.getItem();
IInventoryUtil inv = _service.getPointedInventory(_extractionMode, true);
if (inv == null) {
_service.getItemOrderManager().sendFailed();
return 0;
}
int available = inv.itemCount(item);
if (available == 0) {
_service.getItemOrderManager().sendFailed();
return 0;
}
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) {
_service.getItemOrderManager().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) {
_service.getItemOrderManager().deferSend();
return 0;
}
defersend = true;
}
}
if (!_service.canUseEnergy(wanted * neededEnergy())) {
return -1;
}
ItemStack removed = inv.getMultipleItems(item, wanted);
if (removed == null || removed.stackSize == 0) {
_service.getItemOrderManager().sendFailed();
return 0;
}
int sent = removed.stackSize;
_service.useEnergy(sent * neededEnergy());
IRoutedItem sendedItem = _service.sendStack(removed, destination, itemSendMode(), info);
_service.getItemOrderManager().sendSuccessfull(sent, defersend, sendedItem);
return sent;
}
Aggregations