use of logisticspipes.interfaces.IInventoryUtil in project LogisticsPipes by RS485.
the class ModuleElectricManager method tick.
@Override
public void tick() {
if (++currentTick < ticksToAction) {
return;
}
currentTick = 0;
IInventoryUtil inv = _service.getSneakyInventory(true, slot, positionInt);
if (inv == null) {
return;
}
for (int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack stack = inv.getStackInSlot(i);
if (stack == null) {
return;
}
if (isOfInterest(stack)) {
//If item set to discharge and its fully discharged, then extract it.
if (_dischargeMode && SimpleServiceLocator.IC2Proxy.isFullyDischarged(stack)) {
Triplet<Integer, SinkReply, List<IFilter>> reply = SimpleServiceLocator.logisticsManager.hasDestinationWithMinPriority(ItemIdentifier.get(stack), _service.getSourceID(), true, FixedPriority.ElectricBuffer);
if (reply == null) {
continue;
}
if (_service.useEnergy(10)) {
_service.spawnParticle(Particles.OrangeParticle, 2);
_service.sendStack(inv.decrStackSize(i, 1), reply, ItemSendMode.Normal);
return;
}
}
//If item set to charge and its fully charged, then extract it.
if (!_dischargeMode && SimpleServiceLocator.IC2Proxy.isFullyCharged(stack)) {
Triplet<Integer, SinkReply, List<IFilter>> reply = SimpleServiceLocator.logisticsManager.hasDestinationWithMinPriority(ItemIdentifier.get(stack), _service.getSourceID(), true, FixedPriority.ElectricBuffer);
if (reply == null) {
continue;
}
if (_service.useEnergy(10)) {
_service.spawnParticle(Particles.OrangeParticle, 2);
_service.sendStack(inv.decrStackSize(i, 1), reply, ItemSendMode.Normal);
return;
}
}
}
}
}
use of logisticspipes.interfaces.IInventoryUtil in project LogisticsPipes by RS485.
the class PipeItemsBasicLogistics method getPointedInventory.
@Override
public IInventoryUtil getPointedInventory(boolean forExtraction) {
IInventoryUtil inv = super.getPointedInventory(forExtraction);
if (inv == null) {
Optional<Pair<IInventory, ForgeDirection>> first = new WorldCoordinatesWrapper(container).getConnectedAdjacentTileEntities(ConnectionPipeType.ITEM).filter(adjacent -> adjacent.tileEntity instanceof IInventory).map(adjacentInventory -> new Pair<>(InventoryHelper.getInventory((IInventory) adjacentInventory.tileEntity), adjacentInventory.direction)).filter(inventoryDirectionPair -> inventoryDirectionPair.getValue1() != null).findFirst();
if (first.isPresent()) {
Pair<IInventory, ForgeDirection> p = first.get();
inv = SimpleServiceLocator.inventoryUtilFactory.getInventoryUtil(p.getValue1(), p.getValue2().getOpposite());
}
}
return inv;
}
use of logisticspipes.interfaces.IInventoryUtil in project LogisticsPipes by RS485.
the class PipeTransportLogistics method handleTileReachedServer_internal.
protected final void handleTileReachedServer_internal(LPTravelingItemServer arrivingItem, TileEntity tile, ForgeDirection dir) {
if (isRouted && getPipe().container.tilePart.getBCPipePluggable(dir) != null && getPipe().container.tilePart.getBCPipePluggable(dir).isAcceptingItems(arrivingItem)) {
LPTravelingItemServer remainingItem = getPipe().container.tilePart.getBCPipePluggable(dir).handleItem(arrivingItem);
if (remainingItem != null) {
getRoutedPipe().getRouter().update(true, getRoutedPipe());
this.injectItem(remainingItem, dir);
}
return;
}
if (getPipe() instanceof PipeItemsFluidSupplier) {
((PipeItemsFluidSupplier) getPipe()).endReached(arrivingItem, tile);
if (arrivingItem.getItemIdentifierStack().getStackSize() <= 0) {
return;
}
}
markChunkModified(tile);
if (MainProxy.isServer(getWorld()) && arrivingItem.getInfo() != null && arrivingItem.getArrived() && isRouted) {
getRoutedPipe().notifyOfItemArival(arrivingItem.getInfo());
}
if (getPipe() instanceof FluidRoutedPipe) {
if (((FluidRoutedPipe) getPipe()).endReached(arrivingItem, tile)) {
return;
}
}
boolean isSpecialConnectionInformationTransition = false;
if (MainProxy.isServer(getWorld())) {
if (SimpleServiceLocator.specialtileconnection.needsInformationTransition(tile)) {
isSpecialConnectionInformationTransition = true;
SimpleServiceLocator.specialtileconnection.transmit(tile, arrivingItem);
}
}
if (SimpleServiceLocator.pipeInformationManager.isItemPipe(tile)) {
if (passToNextPipe(arrivingItem, tile)) {
return;
}
} else if (tile instanceof IInventory && isRouted) {
getRoutedPipe().getCacheHolder().trigger(CacheTypes.Inventory);
// items.scheduleRemoval(arrivingItem);
if (MainProxy.isServer(getWorld())) {
// destroy the item on exit if it isn't exitable
if (!isSpecialConnectionInformationTransition && !isItemExitable(arrivingItem.getItemIdentifierStack())) {
return;
}
// last chance for chassi to back out
if (arrivingItem != null) {
if (arrivingItem.getTransportMode() != TransportMode.Active && !getRoutedPipe().getTransportLayer().stillWantItem(arrivingItem)) {
reverseItem(arrivingItem);
return;
}
}
ISlotUpgradeManager slotManager;
{
ModulePositionType slot = null;
int positionInt = -1;
if (arrivingItem.getInfo().targetInfo instanceof ChassiTargetInformation) {
positionInt = ((ChassiTargetInformation) arrivingItem.getInfo().targetInfo).getModuleSlot();
slot = ModulePositionType.SLOT;
} else if (LPConstants.DEBUG && container.pipe instanceof PipeLogisticsChassi) {
System.out.println(arrivingItem);
new RuntimeException("[ItemInsertion] Information weren't ment for a chassi pipe").printStackTrace();
}
slotManager = getRoutedPipe().getUpgradeManager(slot, positionInt);
}
boolean tookSome = false;
if (arrivingItem.getAdditionalTargetInformation() instanceof ITargetSlotInformation) {
ITargetSlotInformation information = (ITargetSlotInformation) arrivingItem.getAdditionalTargetInformation();
IInventory inv = (IInventory) tile;
if (inv instanceof ISidedInventory) {
inv = new SidedInventoryMinecraftAdapter((ISidedInventory) inv, ForgeDirection.UNKNOWN, false);
}
IInventoryUtil util = SimpleServiceLocator.inventoryUtilFactory.getInventoryUtil(inv);
if (util instanceof ISpecialInsertion) {
int slot = information.getTargetSlot();
int amount = information.getAmount();
if (util.getSizeInventory() > slot) {
ItemStack content = util.getStackInSlot(slot);
ItemStack toAdd = arrivingItem.getItemIdentifierStack().makeNormalStack();
toAdd.stackSize = Math.min(toAdd.stackSize, Math.max(0, amount - (content != null ? content.stackSize : 0)));
if (toAdd.stackSize > 0) {
if (util.getSizeInventory() > slot) {
int added = ((ISpecialInsertion) util).addToSlot(toAdd, slot);
arrivingItem.getItemIdentifierStack().lowerStackSize(added);
if (added > 0) {
tookSome = true;
}
}
}
}
if (information.isLimited()) {
if (arrivingItem.getItemIdentifierStack().getStackSize() > 0) {
reverseItem(arrivingItem);
}
return;
}
}
}
// sneaky insertion
if (!getRoutedPipe().getUpgradeManager().hasCombinedSneakyUpgrade() || slotManager.hasOwnSneakyUpgrade()) {
ForgeDirection insertion = arrivingItem.output.getOpposite();
if (slotManager.hasSneakyUpgrade()) {
insertion = slotManager.getSneakyOrientation();
}
ItemStack added = InventoryHelper.getTransactorFor(tile, insertion).add(arrivingItem.getItemIdentifierStack().makeNormalStack(), insertion, true);
arrivingItem.getItemIdentifierStack().lowerStackSize(added.stackSize);
if (added.stackSize > 0 && arrivingItem instanceof IRoutedItem) {
tookSome = true;
arrivingItem.setBufferCounter(0);
}
ItemRoutingInformation info;
if (arrivingItem.getItemIdentifierStack().getStackSize() > 0) {
// we have some leftovers, we are splitting the stack, we need to clone the info
info = arrivingItem.getInfo().clone();
// For InvSysCon
info.getItem().setStackSize(added.stackSize);
insertedItemStack(info, tile);
} else {
info = arrivingItem.getInfo();
info.getItem().setStackSize(added.stackSize);
// For InvSysCon
insertedItemStack(info, tile);
// every item has been inserted.
return;
}
} else {
ForgeDirection[] dirs = getRoutedPipe().getUpgradeManager().getCombinedSneakyOrientation();
for (ForgeDirection insertion : dirs) {
if (insertion == null) {
continue;
}
ItemStack added = InventoryHelper.getTransactorFor(tile, insertion).add(arrivingItem.getItemIdentifierStack().makeNormalStack(), insertion, true);
arrivingItem.getItemIdentifierStack().lowerStackSize(added.stackSize);
if (added.stackSize > 0) {
tookSome = true;
arrivingItem.setBufferCounter(0);
}
ItemRoutingInformation info;
if (arrivingItem.getItemIdentifierStack().getStackSize() > 0) {
// we have some leftovers, we are splitting the stack, we need to clone the info
info = arrivingItem.getInfo().clone();
// For InvSysCon
info.getItem().setStackSize(added.stackSize);
insertedItemStack(info, tile);
} else {
info = arrivingItem.getInfo();
info.getItem().setStackSize(added.stackSize);
// For InvSysCon
insertedItemStack(info, tile);
// every item has been inserted.
return;
}
}
}
if (arrivingItem.getItemIdentifierStack().getStackSize() > 0) {
reverseItem(arrivingItem);
}
}
// the item is handled
return;
}
// end of insert into IInventory
dropItem(arrivingItem);
}
Aggregations