You can now keep fluids in stock by attaching a External Storage in fluid mode to a Fluid Interface with a Crafting Upgrade. #461

This commit is contained in:
raoulvdberge
2018-07-23 14:38:03 +02:00
parent edb66464ae
commit b933814625
41 changed files with 357 additions and 194 deletions

View File

@@ -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)

View File

@@ -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<IStorage<FluidStack>> 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);
}

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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<IStorageExternal<ItemStack>> getItemStorages() {
return itemStorages;
}

View File

@@ -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,7 +80,8 @@ public class NetworkNodeFluidInterface extends NetworkNode implements IComparabl
}
}
if (network != null && canUpdate() && ticks % upgrades.getSpeed() == 0) {
if (network != null && canUpdate()) {
if (ticks % upgrades.getSpeed() == 0) {
FluidStack drained = tankIn.drainInternal(Fluid.BUCKET_VOLUME * upgrades.getItemInteractCount(), true);
// Drain in tank
@@ -103,43 +92,84 @@ public class NetworkNodeFluidInterface extends NetworkNode implements IComparabl
tankIn.fillInternal(remainder, true);
}
}
FluidStack stack = out.getFluidStackInSlot(0);
// Fill out tank
// 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);
}
} else if (stack != null) {
// Fill the out fluid
FluidStack stackInStorage = network.getFluidStorageCache().getList().get(stack, compare);
if (stackInStorage != null) {
int toExtract = Math.min(Fluid.BUCKET_VOLUME * upgrades.getItemInteractCount(), stackInStorage.amount);
int spaceRemaining = tankOut.getCapacity() - tankOut.getFluidAmount();
if (toExtract > spaceRemaining) {
toExtract = spaceRemaining;
}
if (toExtract <= 0) {
return;
}
FluidStack took = network.extractFluid(stack, toExtract, compare, Action.SIMULATE);
FluidStack wanted = out.getFluidStackInSlot(0);
int wantedAmount = out.getStackInSlot(0).getCount();
FluidStack got = tankOut.getFluid();
if (took != null && (toExtract - tankOut.fillInternal(took, false)) == 0) {
took = network.extractFluid(stack, toExtract, compare, Action.PERFORM);
if (wanted == null) {
if (got != null) {
tankOut.setFluid(network.insertFluidTracked(got, got.amount));
tankOut.fillInternal(took, true);
onTankOutChanged();
}
} else if (got != null && !API.instance().getComparer().isEqual(wanted, got, IComparer.COMPARE_NBT)) {
tankOut.setFluid(network.insertFluidTracked(got, got.amount));
onTankOutChanged();
} else {
int delta = got == null ? wantedAmount : (wantedAmount - got.amount);
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();
}
// 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 (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
@@ -147,16 +177,6 @@ public class NetworkNodeFluidInterface extends NetworkNode implements IComparabl
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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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<Fl
@Nonnull
@Override
public IStorageExternal<FluidStack> provide(IExternalStorageContext context, Supplier<TileEntity> 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);
}
}

View File

@@ -24,10 +24,16 @@ public class StorageExternalFluid implements IStorageExternal<FluidStack> {
private IExternalStorageContext context;
private Supplier<IFluidHandler> handlerSupplier;
private List<FluidStack> cache;
private boolean connectedToInterface;
public StorageExternalFluid(IExternalStorageContext context, Supplier<IFluidHandler> handlerSupplier) {
public StorageExternalFluid(IExternalStorageContext context, Supplier<IFluidHandler> 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<FluidStack> {
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);
}

View File

@@ -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();
}
}

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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) {

View File

@@ -20,7 +20,7 @@ public class SlotFilterFluid extends SlotFilter {
return server ? super.getStack() : ItemStack.EMPTY;
}
public ItemStack getRealStack() {
public ItemStack getActualStack() {
return super.getStack();
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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();
}

View File

@@ -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);
}
}
}

View File

@@ -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<MessageFluidAmount> 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);
}
}

View File

@@ -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<MessageGridFluidAmount> 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);
}
}

View File

@@ -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());

View File

@@ -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<IStorage<FluidStack>> filter) {
int requested = size;
int received = 0;
@@ -454,7 +454,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe
for (IStorage<FluidStack> 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);
}

View File

@@ -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<NetworkNodeFluidInterface> {
public static final TileDataParameter<Integer, TileFluidInterface> COMPARE = IComparable.createParameter();
public static final TileDataParameter<FluidStack, TileFluidInterface> TANK_IN = new TileDataParameter<>(RSSerializers.FLUID_STACK_SERIALIZER, null, t -> t.getNode().getTankIn().getFluid());
public static final TileDataParameter<FluidStack, TileFluidInterface> 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);
}

View File

@@ -35,4 +35,6 @@ public interface IType {
void setType(int type);
IItemHandler getFilterInventory();
boolean isServer();
}

View File

@@ -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