From b93381462588d6a40f82e0b3ba11fcc9b12e4031 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 23 Jul 2018 14:38:03 +0200 Subject: [PATCH] You can now keep fluids in stock by attaching a External Storage in fluid mode to a Fluid Interface with a Crafting Upgrade. #461 --- CHANGELOG.md | 3 + .../refinedstorage/api/network/INetwork.java | 20 ++- .../network/node/NetworkNodeConstructor.java | 5 + .../network/node/NetworkNodeDestructor.java | 5 + .../network/node/NetworkNodeDetector.java | 5 + .../network/node/NetworkNodeExporter.java | 5 + .../node/NetworkNodeExternalStorage.java | 5 + .../node/NetworkNodeFluidInterface.java | 160 ++++++++++-------- .../apiimpl/network/node/NetworkNodeGrid.java | 5 + .../network/node/NetworkNodeImporter.java | 5 + .../network/node/NetworkNodeInterface.java | 6 +- .../node/NetworkNodeStorageMonitor.java | 5 + .../node/diskdrive/NetworkNodeDiskDrive.java | 5 + .../NetworkNodeDiskManipulator.java | 5 + .../ExternalStorageProviderFluid.java | 3 +- .../externalstorage/StorageExternalFluid.java | 22 ++- .../container/ContainerBase.java | 14 +- .../container/ContainerConstructor.java | 4 +- .../container/ContainerDestructor.java | 4 +- .../container/ContainerDetector.java | 4 +- .../container/ContainerDiskDrive.java | 4 +- .../container/ContainerDiskManipulator.java | 4 +- .../container/ContainerExporter.java | 4 +- .../container/ContainerExternalStorage.java | 4 +- .../container/ContainerFluidInterface.java | 32 +++- .../container/ContainerGrid.java | 7 +- .../container/ContainerImporter.java | 4 +- .../container/ContainerStorageMonitor.java | 4 +- .../container/slot/SlotFilter.java | 2 +- .../container/slot/SlotFilterFluid.java | 2 +- ...erType.java => SlotFilterItemOrFluid.java} | 31 +++- .../refinedstorage/gui/GuiBase.java | 9 +- ...rnFluidAmount.java => GuiFluidAmount.java} | 29 ++-- .../refinedstorage/gui/GuiFluidInterface.java | 10 +- .../network/MessageFluidAmount.java | 49 ++++++ .../network/MessageGridFluidAmount.java | 53 ------ .../refinedstorage/proxy/ProxyCommon.java | 2 +- .../refinedstorage/tile/TileController.java | 4 +- .../tile/TileFluidInterface.java | 3 - .../refinedstorage/tile/config/IType.java | 2 + .../assets/refinedstorage/lang/en_us.lang | 2 +- 41 files changed, 357 insertions(+), 194 deletions(-) rename src/main/java/com/raoulvdberge/refinedstorage/container/slot/{SlotFilterType.java => SlotFilterItemOrFluid.java} (53%) mode change 100755 => 100644 rename src/main/java/com/raoulvdberge/refinedstorage/gui/{grid/GuiGridPatternFluidAmount.java => GuiFluidAmount.java} (59%) create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/network/MessageFluidAmount.java delete mode 100644 src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridFluidAmount.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 091750194..74ff666a0 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ### 1.6.1 - Added fluid autocrafting (raoulvdberge) +- Added Crafting Upgrade support for fluids on the Exporter, Constructor and Fluid Interface (raoulvdberge) +- You can now keep fluids in stock by attaching a External Storage in fluid mode to a Fluid Interface with a Crafting Upgrade (raoulvdberge) +- You can now specify the amount to export in the Fluid Interface (raoulvdberge) - Made the Crafting Preview window bigger (raoulvdberge) - Updated Russian translation (kellixon) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java index 4700cdb9b..3cd707ad7 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java @@ -140,6 +140,7 @@ public interface INetwork { * @param action the action * @return null if we didn't extract anything, or a stack with the result */ + @Nullable default ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags, Action action) { return extractItem(stack, size, flags, action, s -> true); } @@ -152,6 +153,7 @@ public interface INetwork { * @param action the action * @return null if we didn't extract anything, or a stack with the result */ + @Nullable default ItemStack extractItem(@Nonnull ItemStack stack, int size, Action action) { return extractItem(stack, size, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT, action); } @@ -174,6 +176,7 @@ public interface INetwork { * @param size the amount of that prototype that has to be inserted * @return null if the insert was successful, or a stack with the remainder */ + @Nullable default FluidStack insertFluidTracked(@Nonnull FluidStack stack, int size) { FluidStack remainder = insertFluid(stack, size, Action.PERFORM); @@ -194,7 +197,21 @@ public interface INetwork { * @return null if we didn't extract anything, or a stack with the result */ @Nullable - FluidStack extractFluid(@Nonnull FluidStack stack, int size, int flags, Action action); + FluidStack extractFluid(@Nonnull FluidStack stack, int size, int flags, Action action, Predicate> filter); + + /** + * Extracts a fluid from this network. + * + * @param stack the prototype of the stack to extract, do NOT modify + * @param size the amount of that prototype that has to be extracted + * @param flags the flags to compare on, see {@link IComparer} + * @param action the action + * @return null if we didn't extract anything, or a stack with the result + */ + @Nullable + default FluidStack extractFluid(FluidStack stack, int size, int flags, Action action) { + return extractFluid(stack, size, flags, action, s -> true); + } /** * Extracts a fluid from this network. @@ -204,6 +221,7 @@ public interface INetwork { * @param action the action * @return null if we didn't extract anything, or a stack with the result */ + @Nullable default FluidStack extractFluid(FluidStack stack, int size, Action action) { return extractFluid(stack, size, IComparer.COMPARE_NBT, action); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java index 22be090a4..7b4c78f88 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java @@ -373,6 +373,11 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable, return getType() == IType.ITEMS ? itemFilters : fluidFilters; } + @Override + public boolean isServer() { + return !world.isRemote; + } + @Override public CoverManager getCoverManager() { return coverManager; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java index 784187cc6..9a954c7a2 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java @@ -317,6 +317,11 @@ public class NetworkNodeDestructor extends NetworkNode implements IComparable, I return getType() == IType.ITEMS ? itemFilters : fluidFilters; } + @Override + public boolean isServer() { + return !world.isRemote; + } + @Override public boolean canConduct(@Nullable EnumFacing direction) { return coverManager.canConduct(direction); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java index 271ef9417..8b911c6d0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java @@ -251,4 +251,9 @@ public class NetworkNodeDetector extends NetworkNode implements IComparable, ITy public IItemHandler getFilterInventory() { return getType() == IType.ITEMS ? itemFilters : fluidFilters; } + + @Override + public boolean isServer() { + return !world.isRemote; + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java index 2806e444e..83adb5749 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java @@ -245,6 +245,11 @@ public class NetworkNodeExporter extends NetworkNode implements IComparable, ITy return getType() == IType.ITEMS ? itemFilters : fluidFilters; } + @Override + public boolean isServer() { + return !world.isRemote; + } + @Override public boolean canConduct(@Nullable EnumFacing direction) { return coverManager.canConduct(direction); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java index b08937485..cf89ea04f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java @@ -345,6 +345,11 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP return getType() == IType.ITEMS ? itemFilters : fluidFilters; } + @Override + public boolean isServer() { + return !world.isRemote; + } + public List> getItemStorages() { return itemStorages; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java index 9d128f791..a7651a6d6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java @@ -1,15 +1,19 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; import com.raoulvdberge.refinedstorage.RS; +import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.util.Action; import com.raoulvdberge.refinedstorage.api.util.IComparer; +import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.apiimpl.storage.externalstorage.StorageExternalFluid; import com.raoulvdberge.refinedstorage.inventory.*; import com.raoulvdberge.refinedstorage.item.ItemUpgrade; import com.raoulvdberge.refinedstorage.tile.TileFluidInterface; -import com.raoulvdberge.refinedstorage.tile.config.IComparable; +import com.raoulvdberge.refinedstorage.tile.config.IType; import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; @@ -19,18 +23,14 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import org.apache.commons.lang3.tuple.Pair; -// TODO: Crafting upgrade -public class NetworkNodeFluidInterface extends NetworkNode implements IComparable { +public class NetworkNodeFluidInterface extends NetworkNode { public static final String ID = "fluid_interface"; public static final int TANK_CAPACITY = 16000; - private static final String NBT_COMPARE = "Compare"; private static final String NBT_TANK_IN = "TankIn"; private static final String NBT_TANK_OUT = "TankOut"; - private int compare = IComparer.COMPARE_NBT; - private FluidTank tankIn = new FluidTank(TANK_CAPACITY) { @Override protected void onContentsChanged() { @@ -43,26 +43,14 @@ public class NetworkNodeFluidInterface extends NetworkNode implements IComparabl markDirty(); } }; - - private FluidTank tankOut = new FluidTank(TANK_CAPACITY) { - @Override - protected void onContentsChanged() { - super.onContentsChanged(); - - if (!world.isRemote) { - ((TileFluidInterface) world.getTileEntity(pos)).getDataManager().sendParameterToWatchers(TileFluidInterface.TANK_OUT); - } - - markDirty(); - } - }; + private FluidTank tankOut = new FluidTank(TANK_CAPACITY); private FluidHandlerFluidInterface tank = new FluidHandlerFluidInterface(tankIn, tankOut); private ItemHandlerBase in = new ItemHandlerBase(1, new ItemHandlerListenerNetworkNode(this)); private ItemHandlerFluid out = new ItemHandlerFluid(1, new ItemHandlerListenerNetworkNode(this)); - private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, new ItemHandlerListenerNetworkNode(this), ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_STACK); + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, new ItemHandlerListenerNetworkNode(this), ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_STACK, ItemUpgrade.TYPE_CRAFTING); public NetworkNodeFluidInterface(World world, BlockPos pos) { super(world, pos); @@ -92,71 +80,103 @@ public class NetworkNodeFluidInterface extends NetworkNode implements IComparabl } } - if (network != null && canUpdate() && ticks % upgrades.getSpeed() == 0) { - FluidStack drained = tankIn.drainInternal(Fluid.BUCKET_VOLUME * upgrades.getItemInteractCount(), true); + if (network != null && canUpdate()) { + if (ticks % upgrades.getSpeed() == 0) { + FluidStack drained = tankIn.drainInternal(Fluid.BUCKET_VOLUME * upgrades.getItemInteractCount(), true); - // Drain in tank - if (drained != null) { - FluidStack remainder = network.insertFluidTracked(drained, drained.amount); + // Drain in tank + if (drained != null) { + FluidStack remainder = network.insertFluidTracked(drained, drained.amount); - if (remainder != null) { - tankIn.fillInternal(remainder, true); + if (remainder != null) { + tankIn.fillInternal(remainder, true); + } } } - FluidStack stack = out.getFluidStackInSlot(0); + FluidStack wanted = out.getFluidStackInSlot(0); + int wantedAmount = out.getStackInSlot(0).getCount(); + FluidStack got = tankOut.getFluid(); - // Fill out tank + if (wanted == null) { + if (got != null) { + tankOut.setFluid(network.insertFluidTracked(got, got.amount)); - // If our out fluid doesn't match the new fluid, empty it first - if (tankOut.getFluid() != null && (stack == null || (tankOut.getFluid().getFluid() != stack.getFluid()))) { - FluidStack remainder = tankOut.drainInternal(Fluid.BUCKET_VOLUME * upgrades.getItemInteractCount(), true); - - if (remainder != null) { - network.insertFluidTracked(remainder, remainder.amount); + onTankOutChanged(); } - } else if (stack != null) { - // Fill the out fluid - FluidStack stackInStorage = network.getFluidStorageCache().getList().get(stack, compare); + } else if (got != null && !API.instance().getComparer().isEqual(wanted, got, IComparer.COMPARE_NBT)) { + tankOut.setFluid(network.insertFluidTracked(got, got.amount)); - if (stackInStorage != null) { - int toExtract = Math.min(Fluid.BUCKET_VOLUME * upgrades.getItemInteractCount(), stackInStorage.amount); + onTankOutChanged(); + } else { + int delta = got == null ? wantedAmount : (wantedAmount - got.amount); - int spaceRemaining = tankOut.getCapacity() - tankOut.getFluidAmount(); - if (toExtract > spaceRemaining) { - toExtract = spaceRemaining; - } - if (toExtract <= 0) { - return; + if (delta > 0) { + final boolean actingAsStorage = isActingAsStorage(); + + FluidStack result = network.extractFluid(wanted, delta, IComparer.COMPARE_NBT, Action.PERFORM, s -> { + // If we are not an interface acting as a storage, we can extract from anywhere. + if (!actingAsStorage) { + return true; + } + + // If we are an interface acting as a storage, we don't want to extract from other interfaces to + // avoid stealing from each other. + return !(s instanceof StorageExternalFluid) || !((StorageExternalFluid) s).isConnectedToInterface(); + }); + + if (result != null) { + if (tankOut.getFluid() == null) { + tankOut.setFluid(result); + } else { + tankOut.getFluid().amount += result.amount; + } + + onTankOutChanged(); } - FluidStack took = network.extractFluid(stack, toExtract, compare, Action.SIMULATE); + // Example: our delta is 5, we extracted 3 fluids. + // That means we still have to autocraft 2 fluids. + delta -= result == null ? 0 : result.amount; - if (took != null && (toExtract - tankOut.fillInternal(took, false)) == 0) { - took = network.extractFluid(stack, toExtract, compare, Action.PERFORM); - - tankOut.fillInternal(took, true); + if (delta > 0 && upgrades.hasUpgrade(ItemUpgrade.TYPE_CRAFTING)) { + network.getCraftingManager().request(wanted, delta); } + } else if (delta < 0) { + FluidStack remainder = network.insertFluidTracked(got, Math.abs(delta)); + + if (remainder == null) { + tankOut.getFluid().amount -= Math.abs(delta); + } else { + tankOut.getFluid().amount -= Math.abs(delta) - remainder.amount; + } + + onTankOutChanged(); } } } } + private boolean isActingAsStorage() { + for (EnumFacing facing : EnumFacing.VALUES) { + INetworkNode facingNode = API.instance().getNetworkNodeManager(world).getNode(pos.offset(facing)); + + if (facingNode instanceof NetworkNodeExternalStorage && + facingNode.canUpdate() && + ((NetworkNodeExternalStorage) facingNode).getDirection() == facing.getOpposite() && + ((NetworkNodeExternalStorage) facingNode).getType() == IType.FLUIDS) { + return true; + } + } + + return false; + } + @Override public int getEnergyUsage() { return RS.INSTANCE.config.fluidInterfaceUsage; } - @Override - public int getCompare() { - return compare; - } - - @Override - public void setCompare(int compare) { - this.compare = compare; - } - @Override public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); @@ -195,9 +215,7 @@ public class NetworkNodeFluidInterface extends NetworkNode implements IComparabl public NBTTagCompound writeConfiguration(NBTTagCompound tag) { super.writeConfiguration(tag); - StackUtils.writeItems(out, 2, tag); - - tag.setInteger(NBT_COMPARE, compare); + StackUtils.writeItems(out, 2, tag, StackUtils::serializeStackToNbt); return tag; } @@ -206,11 +224,7 @@ public class NetworkNodeFluidInterface extends NetworkNode implements IComparabl public void readConfiguration(NBTTagCompound tag) { super.readConfiguration(tag); - StackUtils.readItems(out, 2, tag); - - if (tag.hasKey(NBT_COMPARE)) { - compare = tag.getInteger(NBT_COMPARE); - } + StackUtils.readItems(out, 2, tag, StackUtils::deserializeStackFromNbt); } public ItemHandlerUpgrade getUpgrades() { @@ -237,6 +251,14 @@ public class NetworkNodeFluidInterface extends NetworkNode implements IComparabl return tankOut; } + private void onTankOutChanged() { + if (!world.isRemote) { + ((TileFluidInterface) world.getTileEntity(pos)).getDataManager().sendParameterToWatchers(TileFluidInterface.TANK_OUT); + } + + markDirty(); + } + @Override public IItemHandler getDrops() { return new CombinedInvWrapper(in, upgrades); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java index 552f321a3..9f230d950 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java @@ -693,6 +693,11 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I return getType() == IType.FLUIDS ? matrixProcessingFluids : matrixProcessing; } + @Override + public boolean isServer() { + return !world.isRemote; + } + @Override public boolean hasConnectivityState() { return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java index ce216f773..863b5e622 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java @@ -245,6 +245,11 @@ public class NetworkNodeImporter extends NetworkNode implements IComparable, IFi return getType() == IType.ITEMS ? itemFilters : fluidFilters; } + @Override + public boolean isServer() { + return !world.isRemote; + } + @Override public CoverManager getCoverManager() { return coverManager; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java index 27e6d362c..813d5e741 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java @@ -12,6 +12,7 @@ import com.raoulvdberge.refinedstorage.inventory.ItemHandlerProxy; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerUpgrade; import com.raoulvdberge.refinedstorage.item.ItemUpgrade; import com.raoulvdberge.refinedstorage.tile.config.IComparable; +import com.raoulvdberge.refinedstorage.tile.config.IType; import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -137,7 +138,10 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { for (EnumFacing facing : EnumFacing.VALUES) { INetworkNode facingNode = API.instance().getNetworkNodeManager(world).getNode(pos.offset(facing)); - if (facingNode instanceof NetworkNodeExternalStorage && facingNode.canUpdate() && ((NetworkNodeExternalStorage) facingNode).getDirection() == facing.getOpposite()) { + if (facingNode instanceof NetworkNodeExternalStorage && + facingNode.canUpdate() && + ((NetworkNodeExternalStorage) facingNode).getDirection() == facing.getOpposite() && + ((NetworkNodeExternalStorage) facingNode).getType() == IType.ITEMS) { return true; } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java index 8efb95f1e..340af22b5 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java @@ -198,6 +198,11 @@ public class NetworkNodeStorageMonitor extends NetworkNode implements IComparabl return getType() == IType.ITEMS ? itemFilter : fluidFilter; } + @Override + public boolean isServer() { + return !world.isRemote; + } + @Override public NBTTagCompound writeConfiguration(NBTTagCompound tag) { super.writeConfiguration(tag); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java index 35371a9b1..34145d8f4 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java @@ -363,6 +363,11 @@ public class NetworkNodeDiskDrive extends NetworkNode implements IGuiStorage, IS return getType() == IType.ITEMS ? itemFilters : fluidFilters; } + @Override + public boolean isServer() { + return !world.isRemote; + } + ItemHandlerBase getItemFilters() { return itemFilters; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java index 0b46e1816..1f783b3f7 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java @@ -406,6 +406,11 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab return getType() == IType.ITEMS ? itemFilters : fluidFilters; } + @Override + public boolean isServer() { + return !world.isRemote; + } + @Override public void setMode(int mode) { this.mode = mode; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderFluid.java index cdbff4be5..e38ede325 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderFluid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderFluid.java @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.storage.externalstorage; import com.raoulvdberge.refinedstorage.api.storage.externalstorage.IExternalStorageContext; import com.raoulvdberge.refinedstorage.api.storage.externalstorage.IExternalStorageProvider; import com.raoulvdberge.refinedstorage.api.storage.externalstorage.IStorageExternal; +import com.raoulvdberge.refinedstorage.tile.TileFluidInterface; import com.raoulvdberge.refinedstorage.util.WorldUtils; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; @@ -20,6 +21,6 @@ public class ExternalStorageProviderFluid implements IExternalStorageProvider provide(IExternalStorageContext context, Supplier tile, EnumFacing direction) { - return new StorageExternalFluid(context, () -> WorldUtils.getFluidHandler(tile.get(), direction.getOpposite())); + return new StorageExternalFluid(context, () -> WorldUtils.getFluidHandler(tile.get(), direction.getOpposite()), tile.get() instanceof TileFluidInterface); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/StorageExternalFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/StorageExternalFluid.java index 0eec5a6fa..72a2a720b 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/StorageExternalFluid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/StorageExternalFluid.java @@ -24,10 +24,16 @@ public class StorageExternalFluid implements IStorageExternal { private IExternalStorageContext context; private Supplier handlerSupplier; private List cache; + private boolean connectedToInterface; - public StorageExternalFluid(IExternalStorageContext context, Supplier handlerSupplier) { + public StorageExternalFluid(IExternalStorageContext context, Supplier handlerSupplier, boolean connectedToInterface) { this.context = context; this.handlerSupplier = handlerSupplier; + this.connectedToInterface = connectedToInterface; + } + + public boolean isConnectedToInterface() { + return connectedToInterface; } @Nullable @@ -72,11 +78,25 @@ public class StorageExternalFluid implements IStorageExternal { network.getFluidStorageCache().remove(cached, cached.amount, true); } else if (actual != null && cached == null) { network.getFluidStorageCache().add(actual, actual.amount, false, true); + + // When we use an interface + crafting upgrade + external storage combo, we don't want the crafting task + // to think we inserted twice. + if (!isConnectedToInterface()) { + network.getCraftingManager().track(actual, actual.amount); + } } else if (!API.instance().getComparer().isEqual(actual, cached, IComparer.COMPARE_NBT)) { network.getFluidStorageCache().remove(cached, cached.amount, true); network.getFluidStorageCache().add(actual, actual.amount, false, true); + + if (!isConnectedToInterface()) { + network.getCraftingManager().track(actual, actual.amount); + } } else if (actual.amount > cached.amount) { network.getFluidStorageCache().add(actual, actual.amount - cached.amount, false, true); + + if (!isConnectedToInterface()) { + network.getCraftingManager().track(actual, actual.amount - cached.amount); + } } else if (actual.amount < cached.amount) { network.getFluidStorageCache().remove(actual, cached.amount - actual.amount, true); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerBase.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerBase.java index 57042617b..4af1c7f88 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerBase.java @@ -3,7 +3,7 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.container.slot.*; import com.raoulvdberge.refinedstorage.gui.GuiBase; -import com.raoulvdberge.refinedstorage.gui.grid.GuiGridPatternFluidAmount; +import com.raoulvdberge.refinedstorage.gui.GuiFluidAmount; import com.raoulvdberge.refinedstorage.tile.TileBase; import com.raoulvdberge.refinedstorage.tile.config.IType; import com.raoulvdberge.refinedstorage.tile.data.TileDataWatcher; @@ -90,15 +90,15 @@ public abstract class ContainerBase extends Container { } else if (!player.inventory.getItemStack().isEmpty()) { slot.putStack(ItemHandlerHelper.copyStackWithSize(player.inventory.getItemStack(), ((SlotFilter) slot).getInitialAmount(player.inventory.getItemStack()))); } else if (slot.getHasStack()) { - if (slot instanceof SlotFilterType && ((SlotFilterType) slot).getType().getType() == IType.FLUIDS) { + if (slot instanceof SlotFilterItemOrFluid && ((SlotFilterItemOrFluid) slot).getType().getType() == IType.FLUIDS) { if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { Minecraft.getMinecraft().addScheduledTask(() -> { // Prevent JEI crash - this needs to run on the main thread and not on the packet handler thread - FMLClientHandler.instance().showGuiScreen(new GuiGridPatternFluidAmount((GuiBase) Minecraft.getMinecraft().currentScreen, player, slot.getSlotIndex(), ((SlotFilterType) slot).getActualStack())); + FMLClientHandler.instance().showGuiScreen(new GuiFluidAmount((GuiBase) Minecraft.getMinecraft().currentScreen, player, slot.slotNumber, ((SlotFilterItemOrFluid) slot).getActualStack(), ((SlotFilterItemOrFluid) slot).getMaxFluidAmount())); }); } } else { - slot.getStack().setCount(((SlotFilter) slot).getAmountModified(dragType)); + slot.getStack().setCount(((SlotFilter) slot).getModifiedAmount(dragType)); detectAndSendChanges(); } @@ -157,9 +157,9 @@ public abstract class ContainerBase extends Container { if (stackInSlot.isEmpty()) { if (slot instanceof SlotFilterFluid) { - stackInSlot = ((SlotFilterFluid) slot).getRealStack(); - } else if (slot instanceof SlotFilterType) { - stackInSlot = ((SlotFilterType) slot).getActualStack(); + stackInSlot = ((SlotFilterFluid) slot).getActualStack(); + } else if (slot instanceof SlotFilterItemOrFluid) { + stackInSlot = ((SlotFilterItemOrFluid) slot).getActualStack(); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerConstructor.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerConstructor.java index b5aeaea8d..af75642b6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerConstructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerConstructor.java @@ -1,6 +1,6 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; import com.raoulvdberge.refinedstorage.tile.TileConstructor; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; @@ -15,7 +15,7 @@ public class ContainerConstructor extends ContainerBase { addSlotToContainer(new SlotItemHandler(constructor.getNode().getUpgrades(), i, 187, 6 + (i * 18))); } - addSlotToContainer(new SlotFilterType(constructor.getNode(), 0, 80, 20)); + addSlotToContainer(new SlotFilterItemOrFluid(constructor.getNode(), 0, 80, 20)); addPlayerInventory(8, 55); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDestructor.java index f8b4ebfde..9dbf2cb22 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDestructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDestructor.java @@ -1,6 +1,6 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; import com.raoulvdberge.refinedstorage.tile.TileDestructor; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; @@ -16,7 +16,7 @@ public class ContainerDestructor extends ContainerBase { } for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotFilterType(destructor.getNode(), i, 8 + (18 * i), 20)); + addSlotToContainer(new SlotFilterItemOrFluid(destructor.getNode(), i, 8 + (18 * i), 20)); } addPlayerInventory(8, 55); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDetector.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDetector.java index c8641a6d1..037d2f944 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDetector.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDetector.java @@ -1,6 +1,6 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; import com.raoulvdberge.refinedstorage.tile.TileDetector; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; @@ -10,7 +10,7 @@ public class ContainerDetector extends ContainerBase { public ContainerDetector(TileDetector detector, EntityPlayer player) { super(detector, player); - addSlotToContainer(new SlotFilterType(detector.getNode(), 0, 107, 20)); + addSlotToContainer(new SlotFilterItemOrFluid(detector.getNode(), 0, 107, 20)); addPlayerInventory(8, 55); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskDrive.java index 085165b10..b346d3d33 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskDrive.java @@ -1,6 +1,6 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; @@ -19,7 +19,7 @@ public class ContainerDiskDrive extends ContainerBase { } for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotFilterType(drive.getNode(), i, 8 + (18 * i), 20)); + addSlotToContainer(new SlotFilterItemOrFluid(drive.getNode(), i, 8 + (18 * i), 20)); } addPlayerInventory(8, 141); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskManipulator.java index b4f01a9d6..91b07f05e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskManipulator.java @@ -1,6 +1,6 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; import com.raoulvdberge.refinedstorage.tile.TileDiskManipulator; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; @@ -24,7 +24,7 @@ public class ContainerDiskManipulator extends ContainerBase { } for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotFilterType(manipulator.getNode(), i, 8 + (18 * i), 20)); + addSlotToContainer(new SlotFilterItemOrFluid(manipulator.getNode(), i, 8 + (18 * i), 20)); } addPlayerInventory(8, 129); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java index f60164e29..5cd9c288b 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java @@ -1,6 +1,6 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; import com.raoulvdberge.refinedstorage.tile.TileExporter; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; @@ -19,7 +19,7 @@ public class ContainerExporter extends ContainerBase { } for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotFilterType(exporter.getNode(), i, 8 + (18 * i), 20)); + addSlotToContainer(new SlotFilterItemOrFluid(exporter.getNode(), i, 8 + (18 * i), 20)); } addPlayerInventory(8, 55); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExternalStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExternalStorage.java index 178775487..bdac301d6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExternalStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExternalStorage.java @@ -1,6 +1,6 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; import com.raoulvdberge.refinedstorage.tile.TileExternalStorage; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; @@ -11,7 +11,7 @@ public class ContainerExternalStorage extends ContainerBase { super(externalStorage, player); for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotFilterType(externalStorage.getNode(), i, 8 + (18 * i), 20)); + addSlotToContainer(new SlotFilterItemOrFluid(externalStorage.getNode(), i, 8 + (18 * i), 20)); } addPlayerInventory(8, 141); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidInterface.java index 92ec589ec..c3b9b1829 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidInterface.java @@ -1,10 +1,14 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.container.slot.SlotFilterFluid; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeFluidInterface; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilter; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; import com.raoulvdberge.refinedstorage.tile.TileFluidInterface; +import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.SlotItemHandler; public class ContainerFluidInterface extends ContainerBase { @@ -16,7 +20,31 @@ public class ContainerFluidInterface extends ContainerBase { } addSlotToContainer(new SlotItemHandler(fluidInterface.getNode().getIn(), 0, 44, 32)); - addSlotToContainer(new SlotFilterFluid(!fluidInterface.getWorld().isRemote, fluidInterface.getNode().getOut(), 0, 116, 32)); + addSlotToContainer(new SlotFilterItemOrFluid(new IType() { + @Override + public int getType() { + return IType.FLUIDS; + } + + @Override + public void setType(int type) { + // NO OP + } + + @Override + public IItemHandler getFilterInventory() { + return fluidInterface.getNode().getOut(); + } + + @Override + public boolean isServer() { + return !fluidInterface.getNode().getWorld().isRemote; + } + }, 0, 116, 32, SlotFilter.FILTER_ALLOW_SIZE, (slot, amount) -> { + if (amount > 0 && amount <= NetworkNodeFluidInterface.TANK_CAPACITY) { + fluidInterface.getNode().getOut().getStackInSlot(0).setCount(amount); + } + }, NetworkNodeFluidInterface.TANK_CAPACITY)); addPlayerInventory(8, 122); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java index 42582665c..496eb28c1 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java @@ -21,6 +21,7 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.IContainerListener; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.items.SlotItemHandler; import javax.annotation.Nullable; @@ -95,7 +96,11 @@ public class ContainerGrid extends ContainerBase { int y = headerAndSlots + 4; for (int i = 0; i < 9 * 2; ++i) { - addSlotToContainer(new SlotFilterType((NetworkNodeGrid) grid, i, x, y, SlotFilter.FILTER_ALLOW_SIZE)); + addSlotToContainer(new SlotFilterItemOrFluid((NetworkNodeGrid) grid, i, x, y, SlotFilter.FILTER_ALLOW_SIZE, (slot, amount) -> { + if (amount > 0 && amount <= Fluid.BUCKET_VOLUME && slot < ((NetworkNodeGrid) grid).getMatrixProcessingFluids().getSlots()) { + ((NetworkNodeGrid) grid).getMatrixProcessingFluids().getStackInSlot(slot).setCount(amount); + } + }, Fluid.BUCKET_VOLUME)); x += 18; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerImporter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerImporter.java index 82bd7dcd6..dd846f112 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerImporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerImporter.java @@ -1,6 +1,6 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; import com.raoulvdberge.refinedstorage.tile.TileImporter; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; @@ -16,7 +16,7 @@ public class ContainerImporter extends ContainerBase { } for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotFilterType(importer.getNode(), i, 8 + (18 * i), 20)); + addSlotToContainer(new SlotFilterItemOrFluid(importer.getNode(), i, 8 + (18 * i), 20)); } addPlayerInventory(8, 55); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java index 4594c4305..02e39720a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java @@ -1,6 +1,6 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; import com.raoulvdberge.refinedstorage.tile.TileStorageMonitor; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; @@ -10,7 +10,7 @@ public class ContainerStorageMonitor extends ContainerBase { public ContainerStorageMonitor(TileStorageMonitor storageMonitor, EntityPlayer player) { super(storageMonitor, player); - addSlotToContainer(new SlotFilterType(storageMonitor.getNode(), 0, 80, 20)); + addSlotToContainer(new SlotFilterItemOrFluid(storageMonitor.getNode(), 0, 80, 20)); addPlayerInventory(8, 55); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilter.java index 4ce915d7b..e4480edd3 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilter.java @@ -58,7 +58,7 @@ public class SlotFilter extends SlotItemHandler { return (flags & FILTER_ALLOW_BLOCKS) == FILTER_ALLOW_BLOCKS; } - public int getAmountModified(int dragType) { + public int getModifiedAmount(int dragType) { int amount = getStack().getCount(); if (dragType == 0) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilterFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilterFluid.java index 34dcf757b..a728f6b62 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilterFluid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilterFluid.java @@ -20,7 +20,7 @@ public class SlotFilterFluid extends SlotFilter { return server ? super.getStack() : ItemStack.EMPTY; } - public ItemStack getRealStack() { + public ItemStack getActualStack() { return super.getStack(); } } \ No newline at end of file diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilterType.java b/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilterItemOrFluid.java old mode 100755 new mode 100644 similarity index 53% rename from src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilterType.java rename to src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilterItemOrFluid.java index 0eec0957d..e662b3949 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilterType.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/slot/SlotFilterItemOrFluid.java @@ -1,24 +1,34 @@ package com.raoulvdberge.refinedstorage.container.slot; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode; import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.items.IItemHandler; import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class SlotFilterItemOrFluid extends SlotFilter { + public interface IFluidAmountChangeListener { + void onChangeRequested(int slot, int amount); + } -public class SlotFilterType extends SlotFilter { private IType type; - public SlotFilterType(IType type, int id, int x, int y, int flags) { + @Nullable + private IFluidAmountChangeListener listener; + private int maxFluidAmount; + + public SlotFilterItemOrFluid(IType type, int id, int x, int y, int flags, @Nullable IFluidAmountChangeListener listener, int maxFluidAmount) { super(null, id, x, y, flags); this.type = type; + this.listener = listener; + this.maxFluidAmount = maxFluidAmount; } - public SlotFilterType(IType type, int id, int x, int y) { - this(type, id, x, y, 0); + public SlotFilterItemOrFluid(IType type, int id, int x, int y) { + this(type, id, x, y, 0, null, 0); } @Override @@ -34,7 +44,7 @@ public class SlotFilterType extends SlotFilter { @Override @Nonnull public ItemStack getStack() { - return (type.getType() == IType.ITEMS || !((NetworkNode) type).getWorld().isRemote) ? super.getStack() : ItemStack.EMPTY; + return (type.getType() == IType.ITEMS || type.isServer()) ? super.getStack() : ItemStack.EMPTY; } public ItemStack getActualStack() { @@ -53,4 +63,13 @@ public class SlotFilterType extends SlotFilter { return super.getInitialAmount(stack); } + + @Nullable + public IFluidAmountChangeListener getFluidAmountChangeListener() { + return listener; + } + + public int getMaxFluidAmount() { + return maxFluidAmount; + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java index 8c53a1b16..87a6cfd95 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java @@ -3,7 +3,8 @@ package com.raoulvdberge.refinedstorage.gui; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.render.IElementDrawer; import com.raoulvdberge.refinedstorage.api.render.IElementDrawers; -import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; +import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; import com.raoulvdberge.refinedstorage.gui.control.Scrollbar; import com.raoulvdberge.refinedstorage.gui.control.SideButton; import com.raoulvdberge.refinedstorage.integration.jei.IntegrationJEI; @@ -189,11 +190,11 @@ public abstract class GuiBase extends GuiContainer { if (stack != null) { FLUID_RENDERER.draw(mc, guiLeft + slot.xPos, guiTop + slot.yPos, stack); - if (slot instanceof SlotFilterType) { - int count = ((SlotFilterType) slot).getActualStack().getCount(); + if (slot instanceof SlotFilterItemOrFluid) { + int count = ((SlotFilterItemOrFluid) slot).getActualStack().getCount(); if (count != 1) { - drawQuantity(guiLeft + slot.xPos, guiTop + slot.yPos, String.valueOf(count)); + drawQuantity(guiLeft + slot.xPos, guiTop + slot.yPos, API.instance().getQuantityFormatter().formatInBucketForm(count)); GL11.glDisable(GL11.GL_LIGHTING); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGridPatternFluidAmount.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiFluidAmount.java similarity index 59% rename from src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGridPatternFluidAmount.java rename to src/main/java/com/raoulvdberge/refinedstorage/gui/GuiFluidAmount.java index e9976c638..0c50bcca4 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGridPatternFluidAmount.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiFluidAmount.java @@ -1,24 +1,23 @@ -package com.raoulvdberge.refinedstorage.gui.grid; +package com.raoulvdberge.refinedstorage.gui; import com.google.common.primitives.Ints; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.container.ContainerFluidAmount; -import com.raoulvdberge.refinedstorage.gui.GuiAmountSpecifying; -import com.raoulvdberge.refinedstorage.gui.GuiBase; -import com.raoulvdberge.refinedstorage.network.MessageGridFluidAmount; +import com.raoulvdberge.refinedstorage.network.MessageFluidAmount; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.Fluid; -public class GuiGridPatternFluidAmount extends GuiAmountSpecifying { - private int slot; +public class GuiFluidAmount extends GuiAmountSpecifying { + private int containerSlot; private ItemStack fluidContainer; + private int maxAmount; - public GuiGridPatternFluidAmount(GuiBase parent, EntityPlayer player, int slot, ItemStack fluidContainer) { + public GuiFluidAmount(GuiBase parent, EntityPlayer player, int containerSlot, ItemStack fluidContainer, int maxAmount) { super(parent, new ContainerFluidAmount(player, fluidContainer), 172, 99); - this.slot = slot; + this.containerSlot = containerSlot; this.fluidContainer = fluidContainer; + this.maxAmount = maxAmount; } @Override @@ -33,7 +32,7 @@ public class GuiGridPatternFluidAmount extends GuiAmountSpecifying { @Override protected int getMaxAmount() { - return Fluid.BUCKET_VOLUME; + return maxAmount; } @Override @@ -43,7 +42,7 @@ public class GuiGridPatternFluidAmount extends GuiAmountSpecifying { @Override protected String getTitle() { - return t("gui.refinedstorage:pattern_grid.fluid_amount"); + return t("gui.refinedstorage:fluid_amount"); } @Override @@ -54,8 +53,8 @@ public class GuiGridPatternFluidAmount extends GuiAmountSpecifying { @Override protected int[] getIncrements() { return new int[]{ - 10, 50, 100, - -10, -50, -100 + 100, 500, 1000, + -100, -500, -1000 }; } @@ -63,8 +62,8 @@ public class GuiGridPatternFluidAmount extends GuiAmountSpecifying { protected void onOkButtonPressed(boolean shiftDown) { Integer amount = Ints.tryParse(amountField.getText()); - if (amount != null && amount > 0 && amount <= Fluid.BUCKET_VOLUME) { - RS.INSTANCE.network.sendToServer(new MessageGridFluidAmount(slot, amount)); + if (amount != null) { + RS.INSTANCE.network.sendToServer(new MessageFluidAmount(containerSlot, amount)); close(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiFluidInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiFluidInterface.java index e84a6162b..e9485447f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiFluidInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiFluidInterface.java @@ -1,12 +1,12 @@ package com.raoulvdberge.refinedstorage.gui; -import com.raoulvdberge.refinedstorage.api.util.IComparer; +import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeFluidInterface; import com.raoulvdberge.refinedstorage.container.ContainerFluidInterface; -import com.raoulvdberge.refinedstorage.gui.control.SideButtonCompare; import com.raoulvdberge.refinedstorage.gui.control.SideButtonRedstoneMode; import com.raoulvdberge.refinedstorage.tile.TileFluidInterface; import com.raoulvdberge.refinedstorage.util.RenderUtils; +import net.minecraft.util.text.TextFormatting; public class GuiFluidInterface extends GuiBase { private static final RenderUtils.FluidRenderer TANK_RENDERER = new RenderUtils.FluidRenderer(NetworkNodeFluidInterface.TANK_CAPACITY, 12, 47); @@ -18,8 +18,6 @@ public class GuiFluidInterface extends GuiBase { @Override public void init(int x, int y) { addSideButton(new SideButtonRedstoneMode(this, TileFluidInterface.REDSTONE_MODE)); - - addSideButton(new SideButtonCompare(this, TileFluidInterface.COMPARE, IComparer.COMPARE_NBT)); } @Override @@ -49,11 +47,11 @@ public class GuiFluidInterface extends GuiBase { drawString(7, 111, t("container.inventory")); if (inBounds(46, 56, 12, 47, mouseX, mouseY) && TileFluidInterface.TANK_IN.getValue() != null) { - drawTooltip(mouseX, mouseY, TileFluidInterface.TANK_IN.getValue().getLocalizedName() + "\n" + TileFluidInterface.TANK_IN.getValue().amount + " mB"); + drawTooltip(mouseX, mouseY, TileFluidInterface.TANK_IN.getValue().getLocalizedName() + "\n" + TextFormatting.GRAY + API.instance().getQuantityFormatter().formatInBucketForm(TileFluidInterface.TANK_IN.getValue().amount) + TextFormatting.RESET); } if (inBounds(118, 56, 12, 47, mouseX, mouseY) && TileFluidInterface.TANK_OUT.getValue() != null) { - drawTooltip(mouseX, mouseY, TileFluidInterface.TANK_OUT.getValue().getLocalizedName() + "\n" + TileFluidInterface.TANK_OUT.getValue().amount + " mB"); + drawTooltip(mouseX, mouseY, TileFluidInterface.TANK_OUT.getValue().getLocalizedName() + "\n" + TextFormatting.GRAY + API.instance().getQuantityFormatter().formatInBucketForm(TileFluidInterface.TANK_OUT.getValue().amount) + TextFormatting.RESET); } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageFluidAmount.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageFluidAmount.java new file mode 100644 index 000000000..0522057cf --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageFluidAmount.java @@ -0,0 +1,49 @@ +package com.raoulvdberge.refinedstorage.network; + +import com.raoulvdberge.refinedstorage.container.slot.SlotFilterItemOrFluid; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; + +public class MessageFluidAmount extends MessageHandlerPlayerToServer implements IMessage { + private int containerSlot; + private int amount; + + public MessageFluidAmount(int containerSlot, int amount) { + this.containerSlot = containerSlot; + this.amount = amount; + } + + public MessageFluidAmount() { + // NO OP + } + + @Override + protected void handle(MessageFluidAmount message, EntityPlayerMP player) { + Container container = player.openContainer; + + if (container != null) { + if (message.containerSlot >= 0 && message.containerSlot < container.inventorySlots.size()) { + Slot slot = container.getSlot(message.containerSlot); + + if (slot instanceof SlotFilterItemOrFluid && ((SlotFilterItemOrFluid) slot).getFluidAmountChangeListener() != null) { + ((SlotFilterItemOrFluid) slot).getFluidAmountChangeListener().onChangeRequested(slot.getSlotIndex(), message.amount); + } + } + } + } + + @Override + public void fromBytes(ByteBuf buf) { + containerSlot = buf.readInt(); + amount = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(containerSlot); + buf.writeInt(amount); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridFluidAmount.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridFluidAmount.java deleted file mode 100644 index df037c27a..000000000 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridFluidAmount.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.raoulvdberge.refinedstorage.network; - -import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeGrid; -import com.raoulvdberge.refinedstorage.container.ContainerGrid; -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.inventory.Container; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; - -public class MessageGridFluidAmount extends MessageHandlerPlayerToServer implements IMessage { - private int slot; - private int amount; - - public MessageGridFluidAmount(int slot, int amount) { - this.slot = slot; - this.amount = amount; - } - - public MessageGridFluidAmount() { - // NO OP - } - - @Override - protected void handle(MessageGridFluidAmount message, EntityPlayerMP player) { - Container container = player.openContainer; - - if (container instanceof ContainerGrid && message.slot >= 0 && message.amount > 0 && message.amount <= Fluid.BUCKET_VOLUME) { - IGrid grid = ((ContainerGrid) container).getGrid(); - - if (grid instanceof NetworkNodeGrid) { - NetworkNodeGrid node = (NetworkNodeGrid) grid; - - if (message.slot < node.getMatrixProcessingFluids().getSlots()) { - node.getMatrixProcessingFluids().getStackInSlot(message.slot).setCount(message.amount); - } - } - } - } - - @Override - public void fromBytes(ByteBuf buf) { - slot = buf.readInt(); - amount = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(slot); - buf.writeInt(amount); - } -} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java index 03c16d1e7..14767dbc7 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java @@ -188,7 +188,7 @@ public class ProxyCommon { RS.INSTANCE.network.registerMessage(MessageStorageDiskSizeRequest.class, MessageStorageDiskSizeRequest.class, id++, Side.SERVER); RS.INSTANCE.network.registerMessage(MessageStorageDiskSizeResponse.class, MessageStorageDiskSizeResponse.class, id++, Side.CLIENT); RS.INSTANCE.network.registerMessage(MessageConfigSync.class, MessageConfigSync.class, id++, Side.CLIENT); - RS.INSTANCE.network.registerMessage(MessageGridFluidAmount.class, MessageGridFluidAmount.class, id++, Side.SERVER); + RS.INSTANCE.network.registerMessage(MessageFluidAmount.class, MessageFluidAmount.class, id++, Side.SERVER); NetworkRegistry.INSTANCE.registerGuiHandler(RS.INSTANCE, new GuiHandler()); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index 594639578..be940f035 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -443,7 +443,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe } @Override - public FluidStack extractFluid(@Nonnull FluidStack stack, int size, int flags, Action action) { + public FluidStack extractFluid(@Nonnull FluidStack stack, int size, int flags, Action action, Predicate> filter) { int requested = size; int received = 0; @@ -454,7 +454,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe for (IStorage storage : this.fluidStorage.getStorages()) { FluidStack took = null; - if (storage.getAccessType() != AccessType.INSERT) { + if (filter.test(storage) && storage.getAccessType() != AccessType.INSERT) { took = storage.extract(stack, requested - received, flags, action); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileFluidInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileFluidInterface.java index ce8a1b631..51eda80d5 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileFluidInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileFluidInterface.java @@ -1,7 +1,6 @@ package com.raoulvdberge.refinedstorage.tile; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeFluidInterface; -import com.raoulvdberge.refinedstorage.tile.config.IComparable; import com.raoulvdberge.refinedstorage.tile.data.RSSerializers; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import net.minecraft.util.EnumFacing; @@ -15,12 +14,10 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; public class TileFluidInterface extends TileNode { - public static final TileDataParameter COMPARE = IComparable.createParameter(); public static final TileDataParameter TANK_IN = new TileDataParameter<>(RSSerializers.FLUID_STACK_SERIALIZER, null, t -> t.getNode().getTankIn().getFluid()); public static final TileDataParameter TANK_OUT = new TileDataParameter<>(RSSerializers.FLUID_STACK_SERIALIZER, null, t -> t.getNode().getTankOut().getFluid()); public TileFluidInterface() { - dataManager.addWatchedParameter(COMPARE); dataManager.addParameter(TANK_IN); dataManager.addParameter(TANK_OUT); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IType.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IType.java index 1beda8d85..3ae6e07bd 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IType.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IType.java @@ -35,4 +35,6 @@ public interface IType { void setType(int type); IItemHandler getFilterInventory(); + + boolean isServer(); } diff --git a/src/main/resources/assets/refinedstorage/lang/en_us.lang b/src/main/resources/assets/refinedstorage/lang/en_us.lang index d37360fa6..6e58f70f5 100644 --- a/src/main/resources/assets/refinedstorage/lang/en_us.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_us.lang @@ -10,9 +10,9 @@ gui.refinedstorage:grid=Grid gui.refinedstorage:grid.craft=Craft gui.refinedstorage:crafting_grid=Crafting Grid gui.refinedstorage:pattern_grid=Pattern Grid -gui.refinedstorage:pattern_grid.fluid_amount=Fluid amount in mB gui.refinedstorage:grid.pattern_create=Create Pattern gui.refinedstorage:fluid_grid=Fluid Grid +gui.refinedstorage:fluid_amount=Fluid amount in mB gui.refinedstorage:disk_drive=Drive gui.refinedstorage:disk_drive.disks=Disks gui.refinedstorage:external_storage=External Storage