diff --git a/common/logisticspipes/modules/ModuleFluidExtractor.java b/common/logisticspipes/modules/ModuleFluidExtractor.java new file mode 100644 index 000000000..4a8fd89cd --- /dev/null +++ b/common/logisticspipes/modules/ModuleFluidExtractor.java @@ -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> 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); + } +} diff --git a/common/logisticspipes/modules/ModuleFluidInsertion.java b/common/logisticspipes/modules/ModuleFluidInsertion.java new file mode 100644 index 000000000..83bfa2d24 --- /dev/null +++ b/common/logisticspipes/modules/ModuleFluidInsertion.java @@ -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> getProperties() { + return ImmutableList.>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 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; + } +} diff --git a/common/logisticspipes/modules/ModuleFluidSupplier.java b/common/logisticspipes/modules/ModuleFluidSupplier.java index 2b901b833..1a94aad90 100644 --- a/common/logisticspipes/modules/ModuleFluidSupplier.java +++ b/common/logisticspipes/modules/ModuleFluidSupplier.java @@ -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 _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; @@ -78,7 +97,129 @@ public SinkReply sinksItem(@Nonnull ItemStack stack, ItemIdentifier item, int be } @Override - public void tick() {} + public void tick() { + for (NeighborTileEntity neighbor : fluidPipe.getAdjacent().fluidTanks()) { + final ITankUtil tankUtil = LPNeighborTileEntityKt.getTankUtil(neighbor); + if (tankUtil == null || !tankUtil.containsTanks()) { + continue; + } + + //How much do I want? + Map wantContainers = this.filterInventory.getItemsAndCount(); + HashMap wantFluids = new HashMap<>(); + for (Map.Entry 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 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 needFluids = new HashMap(); + //Reduce what I have and what have been requested already + for (Map.Entry liquidId : wantFluids.entrySet()) { + Integer haveCount = haveFluids.get(liquidId.getKey()); + if (haveCount != null) { + liquidId.setValue(liquidId.getValue() - haveCount); + } + } + for (Map.Entry 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 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 diff --git a/common/logisticspipes/modules/ModuleFluidSupplierMK2.java b/common/logisticspipes/modules/ModuleFluidSupplierMK2.java new file mode 100644 index 000000000..856ec96ec --- /dev/null +++ b/common/logisticspipes/modules/ModuleFluidSupplierMK2.java @@ -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 _bucketMinimum = new EnumProperty<>(PipeFluidSupplierMk2.MinMode.ONEBUCKET, + "_bucketMinimum", PipeFluidSupplierMk2.MinMode.values()); + + @NotNull + @Override + public List> getProperties() { + return ImmutableList.>builder() + .add(dummyInventory) + .add(amount) + .add(_requestPartials) + .add(_bucketMinimum) + .build(); + } +} diff --git a/common/logisticspipes/pipes/PipeFluidExtractor.java b/common/logisticspipes/pipes/PipeFluidExtractor.java index 9b2344254..1f33cb77c 100644 --- a/common/logisticspipes/pipes/PipeFluidExtractor.java +++ b/common/logisticspipes/pipes/PipeFluidExtractor.java @@ -1,26 +1,22 @@ package logisticspipes.pipes; import net.minecraft.item.Item; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; -import net.minecraftforge.fluids.FluidStack; - -import logisticspipes.interfaces.ITankUtil; +import logisticspipes.modules.LogisticsModule; +import logisticspipes.modules.ModuleFluidExtractor; +import logisticspipes.pipes.basic.fluid.FluidRoutedPipe; import logisticspipes.textures.Textures; import logisticspipes.textures.Textures.TextureType; -import logisticspipes.transport.PipeFluidTransportLogistics; -import logisticspipes.utils.FluidIdentifierStack; - -public class PipeFluidExtractor extends PipeFluidInsertion { - private int[] liquidToExtract = new int[6]; +public class PipeFluidExtractor extends FluidRoutedPipe { - private static final int flowRate = 500; - private static final int energyPerFlow = 5; + private final ModuleFluidExtractor moduleFluidExtractor; public PipeFluidExtractor(Item item) { super(item); + moduleFluidExtractor = new ModuleFluidExtractor(); + moduleFluidExtractor.registerHandler(this, this); + moduleFluidExtractor.registerPosition(LogisticsModule.ModulePositionType.IN_PIPE, 0); } @Override @@ -29,46 +25,26 @@ public void enabledUpdateEntity() { if (!isNthTick(10)) { return; } - PipeFluidUtil.INSTANCE.getAdjacentTanks(this, false) - .forEach(tankData -> extractFrom(tankData.getValue2(), tankData.getValue1().getDirection())); + moduleFluidExtractor.tick(); } - private void extractFrom(ITankUtil container, EnumFacing side) { - int sideID = side.ordinal(); - FluidStack contained = ((PipeFluidTransportLogistics) transport).getTankProperties(side)[0].getContents(); - int amountMissing = ((PipeFluidTransportLogistics) transport).getSideCapacity() - (contained != null ? contained.amount : 0); - if (liquidToExtract[sideID] < Math.min(PipeFluidExtractor.flowRate, amountMissing)) { - if (this.useEnergy(PipeFluidExtractor.energyPerFlow)) { - liquidToExtract[sideID] += Math.min(PipeFluidExtractor.flowRate, amountMissing); - } - } - FluidIdentifierStack extracted = container.drain(Math.min(liquidToExtract[sideID], PipeFluidExtractor.flowRate), false); - - int inserted = 0; - if (extracted != null) { - inserted = ((PipeFluidTransportLogistics) transport).fill(side, extracted.makeFluidStack(), true); - container.drain(inserted, true); - } - liquidToExtract[sideID] -= inserted; + @Override + public TextureType getCenterTexture() { + return Textures.LOGISTICSPIPE_LIQUID_EXTRACTOR; } @Override - public void writeToNBT(NBTTagCompound nbttagcompound) { - super.writeToNBT(nbttagcompound); - nbttagcompound.setIntArray("liquidToExtract", liquidToExtract); + public boolean canInsertToTanks() { + return false; } @Override - public void readFromNBT(NBTTagCompound nbttagcompound) { - super.readFromNBT(nbttagcompound); - liquidToExtract = nbttagcompound.getIntArray("liquidToExtract"); - if (liquidToExtract.length < 6) { - liquidToExtract = new int[6]; - } + public boolean canInsertFromSideToTanks() { + return false; } @Override - public TextureType getCenterTexture() { - return Textures.LOGISTICSPIPE_LIQUID_EXTRACTOR; + public boolean canReceiveFluid() { + return true; } } diff --git a/common/logisticspipes/pipes/PipeFluidInsertion.java b/common/logisticspipes/pipes/PipeFluidInsertion.java index 2cc6d78e5..47ae022cb 100644 --- a/common/logisticspipes/pipes/PipeFluidInsertion.java +++ b/common/logisticspipes/pipes/PipeFluidInsertion.java @@ -1,114 +1,28 @@ package logisticspipes.pipes; -import java.util.ArrayList; -import java.util.List; -import javax.annotation.Nonnull; - import net.minecraft.item.Item; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumFacing; - -import net.minecraftforge.fluids.FluidStack; -import logisticspipes.logisticspipes.IRoutedItem; -import logisticspipes.logisticspipes.IRoutedItem.TransportMode; +import logisticspipes.modules.LogisticsModule; +import logisticspipes.modules.ModuleFluidInsertion; import logisticspipes.pipes.basic.fluid.FluidRoutedPipe; -import logisticspipes.proxy.SimpleServiceLocator; import logisticspipes.textures.Textures; import logisticspipes.textures.Textures.TextureType; -import logisticspipes.transport.PipeFluidTransportLogistics; -import logisticspipes.utils.FluidIdentifierStack; -import logisticspipes.utils.FluidSinkReply; -import logisticspipes.utils.item.ItemIdentifierStack; -import logisticspipes.utils.tuples.Pair; public class PipeFluidInsertion extends FluidRoutedPipe { - private final List> localJamList = new ArrayList<>(); - private int[] nextSendMax = new int[EnumFacing.VALUES.length]; - private int[] nextSendMin = new int[EnumFacing.VALUES.length]; + private final ModuleFluidInsertion moduleFluidInsertion; public PipeFluidInsertion(Item item) { super(item); + moduleFluidInsertion = new ModuleFluidInsertion(); + moduleFluidInsertion.registerHandler(this, this); + moduleFluidInsertion.registerPosition(LogisticsModule.ModulePositionType.IN_PIPE, 0); } @Override public void enabledUpdateEntity() { super.enabledUpdateEntity(); - List tempJamList = new ArrayList<>(); - if (!localJamList.isEmpty()) { - List> toRemove = new ArrayList<>(); - for (Pair part : localJamList) { - part.setValue2(part.getValue2() - 1); - if (part.getValue2() <= 0) { - toRemove.add(part); - } else { - tempJamList.add(part.getValue1()); - } - } - if (!toRemove.isEmpty()) { - localJamList.removeAll(toRemove); - } - } - PipeFluidTransportLogistics transport = (PipeFluidTransportLogistics) this.transport; - for (EnumFacing dir : EnumFacing.VALUES) { - FluidStack stack = transport.sideTanks[dir.ordinal()].getFluid(); - if (stack == null) { - continue; - } - stack = stack.copy(); - - if (nextSendMax[dir.ordinal()] > 0 && stack.amount < transport.sideTanks[dir.ordinal()].getCapacity()) { - nextSendMax[dir.ordinal()]--; - continue; - } - if (nextSendMin[dir.ordinal()] > 0) { - nextSendMin[dir.ordinal()]--; - continue; - } - - Pair result = SimpleServiceLocator.logisticsFluidManager.getBestReply(FluidIdentifierStack.getFromStack(stack), getRouter(), tempJamList); - if (result == null || result.getValue2().sinkAmount <= 0) { - nextSendMax[dir.ordinal()] = 100; - nextSendMin[dir.ordinal()] = 10; - continue; - } - - if (!useEnergy((int) (0.01 * result.getValue2().getSinkAmountInt()))) { - nextSendMax[dir.ordinal()] = 100; - nextSendMin[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(TransportMode.Passive); - this.queueRoutedItem(routed, dir); - nextSendMax[dir.ordinal()] = 100; - nextSendMin[dir.ordinal()] = 5; - } - } - - @Override - public void writeToNBT(@Nonnull NBTTagCompound tag) { - super.writeToNBT(tag); - tag.setIntArray("nextSendMax", nextSendMax); - tag.setIntArray("nextSendMin", nextSendMin); - } - - @Override - public void readFromNBT(@Nonnull NBTTagCompound tag) { - super.readFromNBT(tag); - nextSendMax = tag.getIntArray("nextSendMax"); - if (nextSendMax.length < 6) { - nextSendMax = new int[6]; - } - nextSendMin = tag.getIntArray("nextSendMin"); - if (nextSendMin.length < 6) { - nextSendMin = new int[6]; - } + moduleFluidInsertion.tick(); } @Override diff --git a/common/logisticspipes/pipes/PipeFluidSatellite.java b/common/logisticspipes/pipes/PipeFluidSatellite.java index aa263281d..d7e2de188 100644 --- a/common/logisticspipes/pipes/PipeFluidSatellite.java +++ b/common/logisticspipes/pipes/PipeFluidSatellite.java @@ -16,9 +16,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; -import net.minecraft.nbt.NBTTagCompound; - -import lombok.Getter; import logisticspipes.LogisticsPipes; import logisticspipes.gui.hud.HUDSatellite; @@ -48,6 +45,8 @@ import logisticspipes.utils.item.ItemIdentifierStack; import network.rs485.logisticspipes.SatellitePipe; +import org.jetbrains.annotations.NotNull; + public class PipeFluidSatellite extends FluidRoutedPipe implements IRequestFluid, IRequireReliableFluidTransport, IHeadUpDisplayRendererProvider, IChestContentReceiver, SatellitePipe { // from baseLogicLiquidSatellite @@ -65,9 +64,6 @@ public static void cleanup() { protected final Map _lostItems = new HashMap<>(); private final ModuleSatellite moduleSatellite; - @Getter - private String satellitePipeName = ""; - public PipeFluidSatellite(Item item) { super(item); throttleTime = 40; @@ -150,7 +146,8 @@ public void stopWatching() { public void playerStartWatching(EntityPlayer player, int mode) { if (mode == 1) { localModeWatchers.add(player); - final ModernPacket packet = PacketHandler.getPacket(SyncSatelliteNamePacket.class).setString((this).satellitePipeName).setPosX(getX()).setPosY(getY()).setPosZ(getZ()); + final ModernPacket packet = PacketHandler.getPacket(SyncSatelliteNamePacket.class) + .setString(this.moduleSatellite.satellitePipeName.getValue()).setPosX(getX()).setPosY(getY()).setPosZ(getZ()); MainProxy.sendPacketToPlayer(packet, player); updateInv(true); } else { @@ -164,28 +161,8 @@ public void playerStopWatching(EntityPlayer player, int mode) { localModeWatchers.remove(player); } - @Override - public void readFromNBT(NBTTagCompound nbttagcompound) { - super.readFromNBT(nbttagcompound); - if (nbttagcompound.hasKey("satelliteid")) { - int satelliteId = nbttagcompound.getInteger("satelliteid"); - satellitePipeName = Integer.toString(satelliteId); - } else { - satellitePipeName = nbttagcompound.getString("satellitePipeName"); - } - if (MainProxy.isServer(getWorld())) { - ensureAllSatelliteStatus(); - } - } - - @Override - public void writeToNBT(NBTTagCompound nbttagcompound) { - nbttagcompound.setString("satellitePipeName", satellitePipeName); - super.writeToNBT(nbttagcompound); - } - public void ensureAllSatelliteStatus() { - if (satellitePipeName.isEmpty()) { + if (this.moduleSatellite.satellitePipeName.isEmpty()) { PipeFluidSatellite.AllSatellites.remove(this); } else { PipeFluidSatellite.AllSatellites.add(this); @@ -195,7 +172,7 @@ public void ensureAllSatelliteStatus() { public void updateWatchers() { final LogisticsTileGenericPipe container = Objects.requireNonNull(getContainer()); CoordinatesPacket packet = PacketHandler.getPacket(SyncSatelliteNamePacket.class) - .setString(satellitePipeName) + .setString(this.moduleSatellite.satellitePipeName.getValue()) .setTilePos(container); MainProxy.sendToPlayerList(packet, localModeWatchers); MainProxy.sendPacketToAllWatchingChunk(container, packet); @@ -212,7 +189,8 @@ public void onAllowedRemoval() { @Override public void onWrenchClicked(EntityPlayer entityplayer) { // Send the satellite id when opening gui - final ModernPacket packet = PacketHandler.getPacket(SyncSatelliteNamePacket.class).setString(satellitePipeName).setPosX(getX()).setPosY(getY()).setPosZ(getZ()); + final ModernPacket packet = PacketHandler.getPacket(SyncSatelliteNamePacket.class) + .setString(this.moduleSatellite.satellitePipeName.getValue()).setPosX(getX()).setPosY(getY()).setPosZ(getZ()); MainProxy.sendPacketToPlayer(packet, entityplayer); entityplayer.openGui(LogisticsPipes.instance, GuiIDs.GUI_SatellitePipe_ID, getWorld(), getX(), getY(), getZ()); } @@ -266,9 +244,15 @@ public Set getSatellitesOfType() { return Collections.unmodifiableSet(AllSatellites); } + @NotNull + @Override + public String getSatellitePipeName() { + return this.moduleSatellite.satellitePipeName.getValue(); + } + @Override public void setSatellitePipeName(@Nonnull String satellitePipeName) { - this.satellitePipeName = satellitePipeName; + this.moduleSatellite.satellitePipeName.setValue(satellitePipeName); } @Nonnull diff --git a/common/logisticspipes/pipes/PipeFluidSupplierMk2.java b/common/logisticspipes/pipes/PipeFluidSupplierMk2.java index 9c8e1d766..71f86cb04 100644 --- a/common/logisticspipes/pipes/PipeFluidSupplierMk2.java +++ b/common/logisticspipes/pipes/PipeFluidSupplierMk2.java @@ -8,7 +8,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; -import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.FluidTank; @@ -17,6 +16,8 @@ import logisticspipes.LogisticsPipes; import logisticspipes.interfaces.routing.IRequestFluid; import logisticspipes.interfaces.routing.IRequireReliableFluidTransport; +import logisticspipes.modules.LogisticsModule; +import logisticspipes.modules.ModuleFluidSupplierMK2; import logisticspipes.network.GuiIDs; import logisticspipes.network.PacketHandler; import logisticspipes.network.packets.pipe.FluidSupplierAmount; @@ -28,7 +29,6 @@ import logisticspipes.transport.PipeFluidTransportLogistics; import logisticspipes.utils.FluidIdentifier; import logisticspipes.utils.FluidIdentifierStack; -import logisticspipes.utils.item.ItemIdentifierInventory; import logisticspipes.utils.item.ItemIdentifierStack; public class PipeFluidSupplierMk2 extends FluidRoutedPipe implements IRequestFluid, IRequireReliableFluidTransport { @@ -49,9 +49,14 @@ public enum MinMode { } } + private final ModuleFluidSupplierMK2 moduleFluidSupplierMK2; + public PipeFluidSupplierMk2(Item item) { super(item); throttleTime = 100; + moduleFluidSupplierMK2 = new ModuleFluidSupplierMK2(); + moduleFluidSupplierMK2.registerHandler(this, this); + moduleFluidSupplierMK2.registerPosition(LogisticsModule.ModulePositionType.IN_PIPE, 0); } @Override @@ -94,14 +99,8 @@ public boolean hasGenericInterests() { } //from PipeFluidSupplierMk2 - private ItemIdentifierInventory dummyInventory = new ItemIdentifierInventory(1, "Fluid to keep stocked", 127, true); - private int amount = 0; - private final Map _requestedItems = new HashMap<>(); - private boolean _requestPartials = false; - private MinMode _bucketMinimum = MinMode.ONEBUCKET; - @Override public void throttledUpdateEntity() { if (!isEnabled()) { @@ -111,7 +110,7 @@ public void throttledUpdateEntity() { return; } super.throttledUpdateEntity(); - if (dummyInventory.getIDStackInSlot(0) == null) { + if (moduleFluidSupplierMK2.dummyInventory.getIDStackInSlot(0) == null) { return; } @@ -122,10 +121,10 @@ public void throttledUpdateEntity() { //How much do I want? Map wantFluids = new HashMap<>(); - ItemIdentifierStack stack = dummyInventory.getIDStackInSlot(0); + ItemIdentifierStack stack = moduleFluidSupplierMK2.dummyInventory.getIDStackInSlot(0); if (stack == null) return; FluidIdentifier fIdent = FluidIdentifier.get(stack.getItem()); - wantFluids.put(fIdent, amount); + wantFluids.put(fIdent, moduleFluidSupplierMK2.amount.getValue()); //How much do I have? HashMap haveFluids = new HashMap<>(); @@ -174,7 +173,8 @@ public void throttledUpdateEntity() { if (countToRequest < 1) { continue; } - if (_bucketMinimum.getAmount() != 0 && countToRequest < _bucketMinimum.getAmount()) { + if (moduleFluidSupplierMK2._bucketMinimum.getValue().getAmount() != 0 + && countToRequest < moduleFluidSupplierMK2._bucketMinimum.getValue().getAmount()) { continue; } @@ -184,7 +184,7 @@ public void throttledUpdateEntity() { boolean success = false; - if (_requestPartials) { + if (moduleFluidSupplierMK2._requestPartials.getValue()) { countToRequest = RequestTree.requestFluidPartial(need, countToRequest, this, null); if (countToRequest > 0) { success = true; @@ -207,24 +207,6 @@ public void throttledUpdateEntity() { }); } - @Override - public void readFromNBT(NBTTagCompound nbttagcompound) { - super.readFromNBT(nbttagcompound); - dummyInventory.readFromNBT(nbttagcompound, ""); - _requestPartials = nbttagcompound.getBoolean("requestpartials"); - amount = nbttagcompound.getInteger("amount"); - _bucketMinimum = MinMode.values()[nbttagcompound.getByte("_bucketMinimum")]; - } - - @Override - public void writeToNBT(NBTTagCompound nbttagcompound) { - super.writeToNBT(nbttagcompound); - dummyInventory.writeToNBT(nbttagcompound, ""); - nbttagcompound.setBoolean("requestpartials", _requestPartials); - nbttagcompound.setInteger("amount", amount); - nbttagcompound.setByte("_bucketMinimum", (byte) _bucketMinimum.ordinal()); - } - private void decreaseRequested(FluidIdentifier liquid, int remaining) { //see if we can get an exact match Integer count = _requestedItems.get(liquid); @@ -265,19 +247,19 @@ public void liquidArrived(FluidIdentifier item, int amount) { public void liquidNotInserted(FluidIdentifier item, int amount) {} public boolean isRequestingPartials() { - return _requestPartials; + return moduleFluidSupplierMK2._requestPartials.getValue(); } public void setRequestingPartials(boolean value) { - _requestPartials = value; + moduleFluidSupplierMK2._requestPartials.setValue(value); } public MinMode getMinMode() { - return _bucketMinimum; + return moduleFluidSupplierMK2._bucketMinimum.getValue(); } public void setMinMode(MinMode value) { - _bucketMinimum = value; + moduleFluidSupplierMK2._bucketMinimum.setValue(value); } @Override @@ -286,25 +268,26 @@ public void onWrenchClicked(EntityPlayer entityplayer) { } public IInventory getDummyInventory() { - return dummyInventory; + return moduleFluidSupplierMK2.dummyInventory; } public int getAmount() { - return amount; + return moduleFluidSupplierMK2.amount.getValue(); } public void setAmount(int amount) { if (MainProxy.isClient(Objects.requireNonNull(container).getWorld())) { - this.amount = amount; + moduleFluidSupplierMK2.amount.setValue(amount); } } public void changeFluidAmount(int change, EntityPlayer player) { - amount += change; - if (amount <= 0) { - amount = 0; + moduleFluidSupplierMK2.amount.increase(change); + if (moduleFluidSupplierMK2.amount.getValue() <= 0) { + moduleFluidSupplierMK2.amount.setValue(0); } - MainProxy.sendPacketToPlayer(PacketHandler.getPacket(FluidSupplierAmount.class).setInteger(amount).setPosX(getX()).setPosY(getY()).setPosZ(getZ()), player); + MainProxy.sendPacketToPlayer(PacketHandler.getPacket(FluidSupplierAmount.class) + .setInteger(moduleFluidSupplierMK2.amount.getValue()).setPosX(getX()).setPosY(getY()).setPosZ(getZ()), player); } @Override diff --git a/common/logisticspipes/pipes/PipeItemsFluidSupplier.java b/common/logisticspipes/pipes/PipeItemsFluidSupplier.java index 8e149f0cc..cb9ce3085 100644 --- a/common/logisticspipes/pipes/PipeItemsFluidSupplier.java +++ b/common/logisticspipes/pipes/PipeItemsFluidSupplier.java @@ -1,8 +1,5 @@ package logisticspipes.pipes; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; import java.util.Objects; import javax.annotation.Nullable; @@ -10,11 +7,9 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; -import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import logisticspipes.LogisticsPipes; @@ -23,33 +18,25 @@ import logisticspipes.interfaces.routing.IRequestItems; import logisticspipes.interfaces.routing.IRequireReliableTransport; import logisticspipes.modules.LogisticsModule; +import logisticspipes.modules.ModuleFluidSupplier; import logisticspipes.network.GuiIDs; import logisticspipes.pipes.basic.CoreRoutedPipe; import logisticspipes.proxy.MainProxy; import logisticspipes.proxy.SimpleServiceLocator; -import logisticspipes.request.RequestTree; import logisticspipes.textures.Textures; import logisticspipes.textures.Textures.TextureType; import logisticspipes.transport.LPTravelingItem.LPTravelingItemServer; import logisticspipes.transport.PipeTransportLogistics; import logisticspipes.utils.CacheHolder.CacheTypes; -import logisticspipes.utils.FluidIdentifier; import logisticspipes.utils.FluidIdentifierStack; -import logisticspipes.utils.item.ItemIdentifier; -import logisticspipes.utils.item.ItemIdentifierInventory; import logisticspipes.utils.item.ItemIdentifierStack; -import network.rs485.logisticspipes.connection.LPNeighborTileEntityKt; -import network.rs485.logisticspipes.connection.NeighborTileEntity; import network.rs485.logisticspipes.inventory.IItemIdentifierInventory; public class PipeItemsFluidSupplier extends CoreRoutedPipe implements IRequestItems, IRequireReliableTransport { private boolean _lastRequestFailed = false; - private boolean _requestPartials = false; - private ItemIdentifierInventory dummyInventory = new ItemIdentifierInventory(9, "Fluids to keep stocked", 127); - - private final HashMap _requestedItems = new HashMap<>(); + private final ModuleFluidSupplier moduleFluidSupplier; public PipeItemsFluidSupplier(Item item) { super(new PipeTransportLogistics(true) { @@ -68,6 +55,9 @@ public boolean canPipeConnect(TileEntity tile, EnumFacing dir) { }, item); throttleTime = 100; + moduleFluidSupplier = new ModuleFluidSupplier(); + moduleFluidSupplier.registerHandler(this, this); + moduleFluidSupplier.registerPosition(LogisticsModule.ModulePositionType.IN_PIPE, 0); } @Override @@ -143,161 +133,26 @@ public void throttledUpdateEntity() { return; } super.throttledUpdateEntity(); - - for (NeighborTileEntity neighbor : getAdjacent().fluidTanks()) { - final ITankUtil tankUtil = LPNeighborTileEntityKt.getTankUtil(neighbor); - if (tankUtil == null || !tankUtil.containsTanks()) { - continue; - } - - //How much do I want? - Map wantContainers = dummyInventory.getItemsAndCount(); - HashMap wantFluids = new HashMap<>(); - for (Entry 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 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 needFluids = new HashMap(); - //Reduce what I have and what have been requested already - for (Entry liquidId : wantFluids.entrySet()) { - Integer haveCount = haveFluids.get(liquidId.getKey()); - if (haveCount != null) { - liquidId.setValue(liquidId.getValue() - haveCount); - } - } - for (Entry 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(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 (!useEnergy(11)) { - break; - } - - boolean success = false; - - if (_requestPartials) { - countToRequest = RequestTree.requestPartial(need.makeStack(countToRequest), (IRequestItems) container.pipe, null); - if (countToRequest > 0) { - success = true; - } - } else { - success = RequestTree.request(need.makeStack(countToRequest), (IRequestItems) 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) container.pipe).setRequestFailed(true); - } - } - } - } - - @Override - public void readFromNBT(NBTTagCompound nbttagcompound) { - super.readFromNBT(nbttagcompound); - dummyInventory.readFromNBT(nbttagcompound, ""); - _requestPartials = nbttagcompound.getBoolean("requestpartials"); - } - - @Override - public void writeToNBT(NBTTagCompound nbttagcompound) { - super.writeToNBT(nbttagcompound); - dummyInventory.writeToNBT(nbttagcompound, ""); - nbttagcompound.setBoolean("requestpartials", _requestPartials); - } - - private 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 (Entry 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. - debug.log("liquid supplier got unexpected item " + item); + moduleFluidSupplier.tick(); } @Override public void itemLost(ItemIdentifierStack item, IAdditionalTargetInformation info) { - decreaseRequested(item); + moduleFluidSupplier.decreaseRequested(item); } @Override public void itemArrived(ItemIdentifierStack item, IAdditionalTargetInformation info) { - decreaseRequested(item); + moduleFluidSupplier.decreaseRequested(item); delayThrottle(); } public boolean isRequestingPartials() { - return _requestPartials; + return this.moduleFluidSupplier._requestPartials.getValue(); } public void setRequestingPartials(boolean value) { - _requestPartials = value; + this.moduleFluidSupplier._requestPartials.setValue(value); } @Override @@ -307,6 +162,6 @@ public void onWrenchClicked(EntityPlayer entityplayer) { /*** GUI ***/ public IItemIdentifierInventory getDummyInventory() { - return dummyInventory; + return this.moduleFluidSupplier.filterInventory; } } diff --git a/common/logisticspipes/pipes/PipeItemsSatelliteLogistics.java b/common/logisticspipes/pipes/PipeItemsSatelliteLogistics.java index b820a2fcd..d24e4a6fe 100644 --- a/common/logisticspipes/pipes/PipeItemsSatelliteLogistics.java +++ b/common/logisticspipes/pipes/PipeItemsSatelliteLogistics.java @@ -167,8 +167,7 @@ public IHeadUpDisplayRenderer getRenderer() { public void ensureAllSatelliteStatus() { if (this.moduleSatellite.satellitePipeName.isEmpty()) { PipeItemsSatelliteLogistics.AllSatellites.remove(this); - } - if (!this.moduleSatellite.satellitePipeName.isEmpty()) { + } else { PipeItemsSatelliteLogistics.AllSatellites.add(this); } } diff --git a/common/logisticspipes/pipes/basic/CoreRoutedPipe.java b/common/logisticspipes/pipes/basic/CoreRoutedPipe.java index 823cfd80d..7179b2e31 100644 --- a/common/logisticspipes/pipes/basic/CoreRoutedPipe.java +++ b/common/logisticspipes/pipes/basic/CoreRoutedPipe.java @@ -180,7 +180,7 @@ public abstract class CoreRoutedPipe extends CoreUnroutedPipe * @return the adjacent cache directly. */ @Nonnull - protected Adjacent getAdjacent() { + public Adjacent getAdjacent() { return adjacent; }