use of logisticspipes.routing.order.LogisticsFluidOrder in project LogisticsPipes by RS485.
the class PipeFluidProvider method enabledUpdateEntity.
@Override
public void enabledUpdateEntity() {
super.enabledUpdateEntity();
if (!getFluidOrderManager().hasOrders(ResourceType.PROVIDER) || !isNthTick(6)) {
return;
}
LogisticsFluidOrder order = getFluidOrderManager().peekAtTopRequest(ResourceType.PROVIDER);
AtomicInteger amountToSend = new AtomicInteger();
AtomicInteger attemptedAmount = new AtomicInteger();
amountToSend.set(Math.min(order.getAmount(), 5000));
attemptedAmount.set(Math.min(order.getAmount(), 5000));
for (Pair<NeighborTileEntity<TileEntity>, ITankUtil> pair : PipeFluidUtil.INSTANCE.getAdjacentTanks(this, false)) {
if (amountToSend.get() <= 0) {
break;
}
boolean fallback = true;
if (pair.getValue2() instanceof ISpecialTankUtil) {
ISpecialTankUtil util = (ISpecialTankUtil) pair.getValue2();
fallback = false;
ISpecialTankAccessHandler handler = util.getSpecialHandler();
FluidStack drained = handler.drainFrom(pair.getValue1().getTileEntity(), order.getFluid(), amountToSend.get(), false);
if (drained != null && drained.amount > 0 && order.getFluid().equals(FluidIdentifier.get(drained))) {
drained = handler.drainFrom(pair.getValue1().getTileEntity(), order.getFluid(), amountToSend.get(), true);
int amount = drained.amount;
amountToSend.addAndGet(-amount);
ItemIdentifierStack stack = SimpleServiceLocator.logisticsFluidManager.getFluidContainer(FluidIdentifierStack.getFromStack(drained));
IRoutedItem item = SimpleServiceLocator.routedItemHelper.createNewTravelItem(stack);
item.setDestination(order.getRouter().getSimpleID());
item.setTransportMode(TransportMode.Active);
this.queueRoutedItem(item, pair.getValue1().getDirection());
getFluidOrderManager().sendSuccessfull(amount, false, item);
if (amountToSend.get() <= 0) {
break;
}
}
}
if (fallback) {
if (pair.getValue2().containsTanks()) {
pair.getValue2().tanks().map(tank -> FluidIdentifierStack.getFromStack(tank.getContents())).forEach(fluidStack -> {
if (amountToSend.get() <= 0) {
return;
}
if (fluidStack != null && fluidStack.getFluid() != null) {
if (order.getFluid().equals(fluidStack.getFluid())) {
int amount = Math.min(fluidStack.getAmount(), amountToSend.get());
FluidIdentifierStack drained = pair.getValue2().drain(amount, false);
if (drained != null && drained.getAmount() > 0 && order.getFluid().equals(drained.getFluid())) {
drained = pair.getValue2().drain(amount, true);
while (drained.getAmount() < amountToSend.get()) {
FluidIdentifierStack addition = pair.getValue2().drain(amountToSend.get() - drained.getAmount(), false);
if (addition != null && addition.getAmount() > 0 && order.getFluid().equals(addition.getFluid())) {
addition = pair.getValue2().drain(amountToSend.get() - drained.getAmount(), true);
drained.raiseAmount(addition.getAmount());
} else {
break;
}
}
amount = drained.getAmount();
amountToSend.addAndGet(-amount);
ItemIdentifierStack stack = SimpleServiceLocator.logisticsFluidManager.getFluidContainer(drained);
IRoutedItem item = SimpleServiceLocator.routedItemHelper.createNewTravelItem(stack);
item.setDestination(order.getRouter().getSimpleID());
item.setTransportMode(TransportMode.Active);
queueRoutedItem(item, pair.getValue1().getDirection());
getFluidOrderManager().sendSuccessfull(amount, false, item);
}
}
}
});
}
}
}
if (amountToSend.get() >= attemptedAmount.get()) {
getFluidOrderManager().sendFailed();
}
}
Aggregations