Skip to content

Commit

Permalink
Implementing Module system for PipeFluidExtractor, PipeFluidInsertion…
Browse files Browse the repository at this point in the history
…, PipeFluidSatellite, PipeFluidSupplierMk2, PipeItemsFluidSupplier. Change conditions stuff in PipeItemsSatelliteLogistics (Commit for: RS485#1679)
  • Loading branch information
KorewaLidesu committed Mar 10, 2023
1 parent bdd1aba commit 6ff8fd8
Show file tree
Hide file tree
Showing 11 changed files with 425 additions and 372 deletions.
62 changes: 62 additions & 0 deletions common/logisticspipes/modules/ModuleFluidExtractor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package logisticspipes.modules;

import java.util.Collections;
import java.util.List;

import org.jetbrains.annotations.NotNull;

import net.minecraft.util.EnumFacing;

import net.minecraftforge.fluids.FluidStack;

import logisticspipes.interfaces.ITankUtil;
import logisticspipes.pipes.PipeFluidUtil;
import logisticspipes.transport.PipeFluidTransportLogistics;
import logisticspipes.utils.FluidIdentifierStack;
import network.rs485.logisticspipes.property.IntListProperty;
import network.rs485.logisticspipes.property.Property;

public class ModuleFluidExtractor extends ModuleFluidInsertion {

private static final int flowRate = 500;
private static final int energyPerFlow = 5;

public final IntListProperty liquidToExtract = new IntListProperty("liquidToExtract");

@NotNull
@Override
public String getLPName() {
throw new RuntimeException("Cannot get LP name for " + this);
}

@NotNull
@Override
public List<Property<?>> getProperties() {
return Collections.singletonList(liquidToExtract);
}

@Override
public void tick() {
PipeFluidUtil.INSTANCE.getAdjacentTanks(fluidPipe, false)
.forEach(tankData -> extractFrom(tankData.getValue2(), tankData.getValue1().getDirection()));
}

private void extractFrom(ITankUtil container, EnumFacing side) {
int sideID = side.ordinal();
FluidStack contained = ((PipeFluidTransportLogistics) fluidPipe.transport).getTankProperties(side)[0].getContents();
int amountMissing = ((PipeFluidTransportLogistics) fluidPipe.transport).getSideCapacity() - (contained != null ? contained.amount : 0);
if (liquidToExtract.get(sideID) < Math.min(ModuleFluidExtractor.flowRate, amountMissing)) {
if (fluidPipe.useEnergy(ModuleFluidExtractor.energyPerFlow)) {
liquidToExtract.set(sideID, Math.min(ModuleFluidExtractor.flowRate, amountMissing));
}
}
FluidIdentifierStack extracted = container.drain(Math.min(liquidToExtract.get(sideID), ModuleFluidExtractor.flowRate), false);

int inserted = 0;
if (extracted != null) {
inserted = ((PipeFluidTransportLogistics) fluidPipe.transport).fill(side, extracted.makeFluidStack(), true);
container.drain(inserted, true);
}
liquidToExtract.increase(sideID, -inserted);
}
}
108 changes: 108 additions & 0 deletions common/logisticspipes/modules/ModuleFluidInsertion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package logisticspipes.modules;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import com.google.common.collect.ImmutableList;
import org.jetbrains.annotations.NotNull;

import net.minecraft.util.EnumFacing;

import net.minecraftforge.fluids.FluidStack;

import logisticspipes.logisticspipes.IRoutedItem;
import logisticspipes.pipes.basic.fluid.FluidRoutedPipe;
import logisticspipes.proxy.SimpleServiceLocator;
import logisticspipes.transport.PipeFluidTransportLogistics;
import logisticspipes.utils.FluidIdentifierStack;
import logisticspipes.utils.FluidSinkReply;
import logisticspipes.utils.item.ItemIdentifierStack;
import logisticspipes.utils.tuples.Pair;
import network.rs485.logisticspipes.property.IntListProperty;
import network.rs485.logisticspipes.property.Property;

public class ModuleFluidInsertion extends LogisticsModule {

protected final FluidRoutedPipe fluidPipe = (FluidRoutedPipe) Objects.requireNonNull(_service, "service object was null in " + this);
public final IntListProperty nextSendMax = new IntListProperty("nextSendMax");
public final IntListProperty nextSendMin = new IntListProperty("nextSendMin");

@NotNull
@Override
public String getLPName() {
throw new RuntimeException("Cannot get LP name for " + this);
}

@NotNull
@Override
public List<Property<?>> getProperties() {
return ImmutableList.<Property<?>>builder()
.add(nextSendMax)
.add(nextSendMin)
.build();
}

@Override
public void tick() {
PipeFluidTransportLogistics transport = (PipeFluidTransportLogistics) fluidPipe.transport;
for (EnumFacing dir : EnumFacing.VALUES) {
FluidStack stack = transport.sideTanks[dir.ordinal()].getFluid();
if (stack == null) {
continue;
}
stack = stack.copy();

if (this.nextSendMax.get(dir.ordinal()) > 0 && stack.amount < transport.sideTanks[dir.ordinal()].getCapacity()) {
this.nextSendMax.increase(dir.ordinal(), -1);
continue;
}
if (nextSendMin.get(dir.ordinal()) > 0) {
this.nextSendMin.increase(dir.ordinal(), -1);
continue;
}

Pair<Integer, FluidSinkReply> result = SimpleServiceLocator.logisticsFluidManager.getBestReply(FluidIdentifierStack.getFromStack(stack), fluidPipe.getRouter(), new ArrayList<>());
if (result == null || result.getValue2().sinkAmount <= 0) {
this.nextSendMax.set(dir.ordinal(), 100);
this.nextSendMin.set(dir.ordinal(), 10);
continue;
}

if (!fluidPipe.useEnergy((int) (0.01 * result.getValue2().getSinkAmountInt()))) {
this.nextSendMax.set(dir.ordinal(), 100);
this.nextSendMin.set(dir.ordinal(), 10);
continue;
}

FluidStack toSend = transport.sideTanks[dir.ordinal()].drain(result.getValue2().getSinkAmountInt(), true);
ItemIdentifierStack liquidContainer = SimpleServiceLocator.logisticsFluidManager.getFluidContainer(FluidIdentifierStack.getFromStack(toSend));
IRoutedItem routed = SimpleServiceLocator.routedItemHelper.createNewTravelItem(liquidContainer);
routed.setDestination(result.getValue1());
routed.setTransportMode(IRoutedItem.TransportMode.Passive);
fluidPipe.queueRoutedItem(routed, dir);
this.nextSendMax.set(dir.ordinal(), 100);
this.nextSendMin.set(dir.ordinal(), 5);
}
}

@Override
public boolean hasGenericInterests() {
return false;
}

@Override
public boolean interestedInAttachedInventory() {
return false;
}

@Override
public boolean interestedInUndamagedID() {
return false;
}

@Override
public boolean receivePassive() {
return false;
}
}
151 changes: 146 additions & 5 deletions common/logisticspipes/modules/ModuleFluidSupplier.java
Original file line number Diff line number Diff line change
@@ -1,33 +1,52 @@
package logisticspipes.modules;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.*;
import javax.annotation.Nonnull;

import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;

import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidUtil;

import logisticspipes.interfaces.IClientInformationProvider;
import logisticspipes.interfaces.IPipeServiceProvider;
import logisticspipes.interfaces.ITankUtil;
import logisticspipes.interfaces.routing.IRequestItems;
import logisticspipes.network.NewGuiHandler;
import logisticspipes.network.abstractguis.ModuleCoordinatesGuiProvider;
import logisticspipes.network.abstractguis.ModuleInHandGuiProvider;
import logisticspipes.network.guis.module.inpipe.FluidSupplierSlot;
import logisticspipes.pipefxhandlers.Particles;
import logisticspipes.pipes.PipeLogisticsChassis.ChassiTargetInformation;
import logisticspipes.pipes.PipeItemsFluidSupplier;
import logisticspipes.pipes.basic.fluid.FluidRoutedPipe;
import logisticspipes.request.RequestTree;
import logisticspipes.utils.item.ItemIdentifierStack;
import logisticspipes.utils.FluidIdentifier;
import logisticspipes.utils.FluidIdentifierStack;
import logisticspipes.utils.SinkReply;
import logisticspipes.utils.SinkReply.FixedPriority;
import logisticspipes.utils.item.ItemIdentifier;
import logisticspipes.utils.item.ItemIdentifierInventory;

import network.rs485.logisticspipes.connection.LPNeighborTileEntityKt;
import network.rs485.logisticspipes.connection.NeighborTileEntity;
import network.rs485.logisticspipes.module.Gui;
import network.rs485.logisticspipes.property.BooleanProperty;
import network.rs485.logisticspipes.property.InventoryProperty;
import network.rs485.logisticspipes.property.Property;

public class ModuleFluidSupplier extends LogisticsModule implements IClientInformationProvider, Gui {

private final InventoryProperty filterInventory = new InventoryProperty(
protected final FluidRoutedPipe fluidPipe = (FluidRoutedPipe) Objects.requireNonNull(_service, "service object was null in " + this);

private final HashMap<ItemIdentifier, Integer> _requestedItems = new HashMap<>();

public final InventoryProperty filterInventory = new InventoryProperty(
new ItemIdentifierInventory(9, "Requested liquids", 1), "");
public final BooleanProperty _requestPartials = new BooleanProperty(false, "requestpartials");

private SinkReply _sinkReply;

Expand Down Expand Up @@ -78,7 +97,129 @@ public SinkReply sinksItem(@Nonnull ItemStack stack, ItemIdentifier item, int be
}

@Override
public void tick() {}
public void tick() {
for (NeighborTileEntity<TileEntity> neighbor : fluidPipe.getAdjacent().fluidTanks()) {
final ITankUtil tankUtil = LPNeighborTileEntityKt.getTankUtil(neighbor);
if (tankUtil == null || !tankUtil.containsTanks()) {
continue;
}

//How much do I want?
Map<ItemIdentifier, Integer> wantContainers = this.filterInventory.getItemsAndCount();
HashMap<FluidIdentifier, Integer> wantFluids = new HashMap<>();
for (Map.Entry<ItemIdentifier, Integer> item : wantContainers.entrySet()) {
ItemStack wantItem = item.getKey().unsafeMakeNormalStack(1);
FluidStack liquidstack = FluidUtil.getFluidContained(wantItem);
if (liquidstack == null) {
continue;
}
wantFluids.put(FluidIdentifier.get(liquidstack), item.getValue() * liquidstack.amount);
}

//How much do I have?
HashMap<FluidIdentifier, Integer> haveFluids = new HashMap<>();

tankUtil.tanks()
.map(tank -> FluidIdentifierStack.getFromStack(tank.getContents()))
.filter(Objects::nonNull)
.forEach(fluid -> {
if (wantFluids.containsKey(fluid.getFluid())) {
haveFluids.merge(fluid.getFluid(), fluid.getAmount(), Integer::sum);
}
});

//HashMap<Integer, Integer> needFluids = new HashMap<Integer, Integer>();
//Reduce what I have and what have been requested already
for (Map.Entry<FluidIdentifier, Integer> liquidId : wantFluids.entrySet()) {
Integer haveCount = haveFluids.get(liquidId.getKey());
if (haveCount != null) {
liquidId.setValue(liquidId.getValue() - haveCount);
}
}
for (Map.Entry<ItemIdentifier, Integer> requestedItem : _requestedItems.entrySet()) {
ItemStack wantItem = requestedItem.getKey().unsafeMakeNormalStack(1);
FluidStack requestedFluidId = FluidUtil.getFluidContained(wantItem);
if (requestedFluidId == null) {
continue;
}
FluidIdentifier requestedFluid = FluidIdentifier.get(requestedFluidId);
Integer want = wantFluids.get(requestedFluid);
if (want != null) {
wantFluids.put(requestedFluid, want - requestedItem.getValue() * requestedFluidId.amount);
}
}

((PipeItemsFluidSupplier) Objects.requireNonNull(fluidPipe.container).pipe).setRequestFailed(false);

//Make request

for (ItemIdentifier need : wantContainers.keySet()) {
FluidStack requestedFluidId = FluidUtil.getFluidContained(need.unsafeMakeNormalStack(1));
if (requestedFluidId == null) {
continue;
}
if (!wantFluids.containsKey(FluidIdentifier.get(requestedFluidId))) {
continue;
}
int countToRequest = wantFluids.get(FluidIdentifier.get(requestedFluidId)) / requestedFluidId.amount;
if (countToRequest < 1) {
continue;
}

if (!fluidPipe.useEnergy(11)) {
break;
}

boolean success = false;

if (this._requestPartials.getValue()) {
countToRequest = RequestTree.requestPartial(need.makeStack(countToRequest), (IRequestItems) fluidPipe.container.pipe, null);
if (countToRequest > 0) {
success = true;
}
} else {
success = RequestTree.request(need.makeStack(countToRequest), (IRequestItems) fluidPipe.container.pipe, null, null);
}

if (success) {
Integer currentRequest = _requestedItems.get(need);
if (currentRequest == null) {
_requestedItems.put(need, countToRequest);
} else {
_requestedItems.put(need, currentRequest + countToRequest);
}
} else {
((PipeItemsFluidSupplier) fluidPipe.container.pipe).setRequestFailed(true);
}
}
}
}

public void decreaseRequested(ItemIdentifierStack item) {
int remaining = item.getStackSize();
//see if we can get an exact match
Integer count = _requestedItems.get(item.getItem());
if (count != null) {
_requestedItems.put(item.getItem(), Math.max(0, count - remaining));
remaining -= count;
}
if (remaining <= 0) {
return;
}
//still remaining... was from fuzzyMatch on a crafter
for (Map.Entry<ItemIdentifier, Integer> e : _requestedItems.entrySet()) {
if (e.getKey().item == item.getItem().item && e.getKey().itemDamage == item.getItem().itemDamage) {
int expected = e.getValue();
e.setValue(Math.max(0, expected - remaining));
remaining -= expected;
}
if (remaining <= 0) {
return;
}
}
//we have no idea what this is, log it.
fluidPipe.debug.log("liquid supplier got unexpected item " + item);
}

@Override
public @Nonnull
Expand Down
31 changes: 31 additions & 0 deletions common/logisticspipes/modules/ModuleFluidSupplierMK2.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package logisticspipes.modules;

import java.util.List;

import com.google.common.collect.ImmutableList;
import org.jetbrains.annotations.NotNull;

import logisticspipes.pipes.PipeFluidSupplierMk2;
import logisticspipes.utils.item.ItemIdentifierInventory;
import network.rs485.logisticspipes.property.*;

public class ModuleFluidSupplierMK2 extends ModuleFluidSupplier {

public final InventoryProperty dummyInventory = new InventoryProperty(
new ItemIdentifierInventory(1, "Fluid to keep stocked", 127, true), "");
public final IntegerProperty amount = new IntegerProperty(0, "amount");
public final BooleanProperty _requestPartials = new BooleanProperty(false, "requestpartials");
public final EnumProperty<PipeFluidSupplierMk2.MinMode> _bucketMinimum = new EnumProperty<>(PipeFluidSupplierMk2.MinMode.ONEBUCKET,
"_bucketMinimum", PipeFluidSupplierMk2.MinMode.values());

@NotNull
@Override
public List<Property<?>> getProperties() {
return ImmutableList.<Property<?>>builder()
.add(dummyInventory)
.add(amount)
.add(_requestPartials)
.add(_bucketMinimum)
.build();
}
}
Loading

0 comments on commit 6ff8fd8

Please sign in to comment.