Fluid External Storage

This commit is contained in:
Raoul Van den Berge
2016-08-15 17:14:03 +02:00
parent 475d19d9d4
commit cc432d1656
13 changed files with 215 additions and 50 deletions

View File

@@ -51,8 +51,6 @@ public final class RefinedStorage {
public int detectorUsage;
public int diskDriveUsage;
public int diskDrivePerDiskUsage;
public int fluidDiskDriveUsage;
public int fluidDiskDrivePerDiskUsage;
public int externalStorageUsage;
public int externalStoragePerStorageUsage;
public int exporterUsage;
@@ -99,8 +97,6 @@ public final class RefinedStorage {
detectorUsage = config.getInt("detector", "energy", 2, 0, Integer.MAX_VALUE, "The energy used by Detectors");
diskDriveUsage = config.getInt("diskDrive", "energy", 0, 0, Integer.MAX_VALUE, "The base energy used by Disk Drives");
diskDrivePerDiskUsage = config.getInt("diskDrivePerDisk", "energy", 1, 0, Integer.MAX_VALUE, "The additional energy used by Storage Disks in Disk Drives");
fluidDiskDriveUsage = config.getInt("fluidDiskDrive", "energy", 0, 0, Integer.MAX_VALUE, "The base energy used by Fluid Disk Drives");
fluidDiskDrivePerDiskUsage = config.getInt("fluidDiskDrivePerDisk", "energy", 1, 0, Integer.MAX_VALUE, "The additional energy used by Fluid Storage Disks in Fluid Disk Drives");
externalStorageUsage = config.getInt("externalStorage", "energy", 0, 0, Integer.MAX_VALUE, "The base energy used by External Storages");
externalStoragePerStorageUsage = config.getInt("externalStoragePerStorage", "energy", 1, 0, Integer.MAX_VALUE, "The additional energy used per connected storage to an External Storage");
exporterUsage = config.getInt("exporter", "energy", 1, 0, Integer.MAX_VALUE, "The energy used by Exporters");

View File

@@ -13,6 +13,10 @@ public final class FluidUtils {
return copy;
}
public static FluidStack copy(FluidStack stack) {
return stack == null ? null : stack.copy();
}
public static FluidStack getFluidFromStack(ItemStack stack, boolean simulate) {
if (stack.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null)) {
return stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null).drain(Fluid.BUCKET_VOLUME, !simulate);

View File

@@ -3,7 +3,7 @@ package refinedstorage.container;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import refinedstorage.container.slot.SlotSpecimen;
import refinedstorage.container.slot.SlotSpecimenType;
import refinedstorage.tile.externalstorage.TileExternalStorage;
public class ContainerExternalStorage extends ContainerBase {
@@ -11,7 +11,7 @@ public class ContainerExternalStorage extends ContainerBase {
super(tile, player);
for (int i = 0; i < 9; ++i) {
addSlotToContainer(new SlotSpecimen(tile.getFilters(), i, 8 + (18 * i), 20));
addSlotToContainer(new SlotSpecimenType(tile, i, 8 + (18 * i), 20));
}
addPlayerInventory(8, 129);

View File

@@ -1,13 +1,10 @@
package refinedstorage.tile;
import net.minecraftforge.items.IItemHandler;
import refinedstorage.tile.data.TileDataParameter;
public interface IStorageGui {
String getGuiTitle();
IItemHandler getFilters();
TileDataParameter<Integer> getTypeParameter();
TileDataParameter<Integer> getRedstoneModeParameter();

View File

@@ -59,6 +59,7 @@ import refinedstorage.tile.config.RedstoneMode;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.RefinedStorageSerializers;
import refinedstorage.tile.data.TileDataParameter;
import refinedstorage.tile.externalstorage.FluidStorageExternal;
import refinedstorage.tile.externalstorage.ItemStorageExternal;
import refinedstorage.tile.grid.IGrid;
@@ -624,6 +625,10 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
for (IFluidStorage storage : this.fluidStorage.getStorages()) {
remainder = storage.insertFluid(remainder, size, simulate);
if (storage instanceof FluidStorageExternal && !simulate) {
((FluidStorageExternal) storage).updateCacheForcefully();
}
if (remainder == null) {
break;
} else {
@@ -652,6 +657,10 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
FluidStack took = storage.extractFluid(stack, requested - received, flags);
if (took != null) {
if (storage instanceof FluidStorageExternal) {
((FluidStorageExternal) storage).updateCacheForcefully();
}
if (newStack == null) {
newStack = took;
} else {

View File

@@ -352,11 +352,6 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl
return "block.refinedstorage:disk_drive.name";
}
@Override
public IItemHandler getFilters() {
return itemFilters;
}
@Override
public TileDataParameter<Integer> getTypeParameter() {
return TYPE;

View File

@@ -3,7 +3,6 @@ package refinedstorage.tile;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks;
@@ -199,11 +198,6 @@ public class TileStorage extends TileNode implements IItemStorageProvider, IStor
return "block.refinedstorage:storage." + getType().getId() + ".name";
}
@Override
public IItemHandler getFilters() {
return filters;
}
@Override
public TileDataParameter<Integer> getTypeParameter() {
return null;
@@ -241,6 +235,10 @@ public class TileStorage extends TileNode implements IItemStorageProvider, IStor
return storage;
}
public ItemHandlerBasic getFilters() {
return filters;
}
@Override
public int getPriority() {
return priority;

View File

@@ -0,0 +1,93 @@
package refinedstorage.tile.externalstorage;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidTankProperties;
import refinedstorage.api.storage.CompareUtils;
import refinedstorage.api.storage.fluid.IFluidStorage;
import refinedstorage.apiimpl.storage.fluid.FluidUtils;
import refinedstorage.tile.config.IFilterable;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Collections;
import java.util.List;
public class FluidStorageExternal implements IFluidStorage {
private FluidStack cache;
private TileExternalStorage externalStorage;
private IFluidHandler handler;
private IFluidTankProperties properties;
public FluidStorageExternal(TileExternalStorage externalStorage, IFluidHandler handler, IFluidTankProperties properties) {
this.externalStorage = externalStorage;
this.handler = handler;
this.properties = properties;
}
@Override
public List<FluidStack> getStacks() {
return properties.getContents() == null ? Collections.emptyList() : Collections.singletonList(properties.getContents().copy());
}
@Nullable
@Override
public FluidStack insertFluid(@Nonnull FluidStack stack, int size, boolean simulate) {
if (IFilterable.canTakeFluids(externalStorage.getFluidFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack) && properties.canFillFluidType(stack)) {
int filled = handler.fill(FluidUtils.copyStackWithSize(stack, size), !simulate);
if (filled == size) {
return null;
}
return FluidUtils.copyStackWithSize(stack, size - filled);
}
return FluidUtils.copyStackWithSize(stack, size);
}
@Nullable
@Override
public FluidStack extractFluid(@Nonnull FluidStack stack, int size, int flags) {
FluidStack toDrain = FluidUtils.copyStackWithSize(stack, size);
if (CompareUtils.compareStack(properties.getContents(), toDrain, flags)) {
return handler.drain(toDrain, true);
}
return null;
}
@Override
public int getStored() {
return properties.getContents() != null ? properties.getContents().amount : 0;
}
public int getCapacity() {
return properties.getCapacity();
}
@Override
public int getPriority() {
return externalStorage.getPriority();
}
public boolean updateCache() {
FluidStack stack = properties.getContents();
if (cache == null) {
cache = FluidUtils.copy(stack);
} else if (!CompareUtils.compareStack(stack, cache, CompareUtils.COMPARE_NBT)) {
cache = FluidUtils.copy(stack);
return true;
}
return false;
}
public void updateCacheForcefully() {
cache = FluidUtils.copy(properties.getContents());
}
}

View File

@@ -35,7 +35,7 @@ public class ItemStorageDSU extends ItemStorageExternal {
@Override
public ItemStack insertItem(@Nonnull ItemStack stack, int size, boolean simulate) {
if (IFilterable.canTake(externalStorage.getFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack)) {
if (IFilterable.canTake(externalStorage.getItemFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack)) {
if (unit.getStoredItemType() != null) {
if (CompareUtils.compareStackNoQuantity(unit.getStoredItemType(), stack)) {
if (getStored() + size > unit.getMaxStoredCount()) {

View File

@@ -39,7 +39,7 @@ public class ItemStorageDrawer extends ItemStorageExternal {
@Override
public ItemStack insertItem(ItemStack stack, int size, boolean simulate) {
if (IFilterable.canTake(externalStorage.getFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack) && drawer.canItemBeStored(stack)) {
if (IFilterable.canTake(externalStorage.getItemFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack) && drawer.canItemBeStored(stack)) {
if (!drawer.isEmpty()) {
if (getStored() + size > drawer.getMaxCapacity(stack)) {
int remainingSpace = getCapacity() - getStored();

View File

@@ -38,7 +38,7 @@ public class ItemStorageItemHandler extends ItemStorageExternal {
@Override
public ItemStack insertItem(ItemStack stack, int size, boolean simulate) {
if (IFilterable.canTake(externalStorage.getFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack)) {
if (IFilterable.canTake(externalStorage.getItemFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack)) {
return ItemHandlerHelper.insertItem(handler, ItemHandlerHelper.copyStackWithSize(stack, size), simulate);
}

View File

@@ -6,35 +6,46 @@ import mcmultipart.microblock.IMicroblock;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidTankProperties;
import net.minecraftforge.items.IItemHandler;
import powercrystals.minefactoryreloaded.api.IDeepStorageUnit;
import refinedstorage.RefinedStorage;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.storage.fluid.IFluidStorage;
import refinedstorage.api.storage.fluid.IFluidStorageProvider;
import refinedstorage.api.storage.item.IItemStorage;
import refinedstorage.api.storage.item.IItemStorageProvider;
import refinedstorage.inventory.ItemHandlerBasic;
import refinedstorage.inventory.ItemHandlerFluid;
import refinedstorage.tile.IStorageGui;
import refinedstorage.tile.TileMultipartNode;
import refinedstorage.tile.config.IComparable;
import refinedstorage.tile.config.IFilterable;
import refinedstorage.tile.config.IPrioritizable;
import refinedstorage.tile.config.IType;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataParameter;
import java.util.ArrayList;
import java.util.List;
public class TileExternalStorage extends TileMultipartNode implements IItemStorageProvider, IStorageGui, IComparable, IFilterable, IPrioritizable {
public class TileExternalStorage extends TileMultipartNode implements IItemStorageProvider, IFluidStorageProvider, IStorageGui, IComparable, IFilterable, IPrioritizable, IType {
public static final TileDataParameter<Integer> PRIORITY = IPrioritizable.createParameter();
public static final TileDataParameter<Integer> COMPARE = IComparable.createParameter();
public static final TileDataParameter<Integer> MODE = IFilterable.createParameter();
public static final TileDataParameter<Integer> TYPE = IType.createParameter();
public static final TileDataParameter<Integer> STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileExternalStorage>() {
@Override
public Integer getValue(TileExternalStorage tile) {
int stored = 0;
for (ItemStorageExternal storage : tile.storages) {
for (ItemStorageExternal storage : tile.itemStorages) {
stored += storage.getStored();
}
for (FluidStorageExternal storage : tile.fluidStorages) {
stored += storage.getStored();
}
@@ -47,7 +58,11 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
public Integer getValue(TileExternalStorage tile) {
int capacity = 0;
for (ItemStorageExternal storage : tile.storages) {
for (ItemStorageExternal storage : tile.itemStorages) {
capacity += storage.getCapacity();
}
for (FluidStorageExternal storage : tile.fluidStorages) {
capacity += storage.getCapacity();
}
@@ -58,14 +73,19 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
private static final String NBT_PRIORITY = "Priority";
private static final String NBT_COMPARE = "Compare";
private static final String NBT_MODE = "Mode";
private static final String NBT_TYPE = "Type";
private ItemHandlerBasic filters = new ItemHandlerBasic(9, this);
private ItemHandlerBasic itemFilters = new ItemHandlerBasic(9, this);
private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(9, this);
private int priority = 0;
private int compare = 0;
private int mode = IFilterable.WHITELIST;
private int type = IType.ITEMS;
private List<ItemStorageExternal> itemStorages = new ArrayList<>();
private List<FluidStorageExternal> fluidStorages = new ArrayList<>();
private List<ItemStorageExternal> storages = new ArrayList<>();
private int lastDrawerCount;
public TileExternalStorage() {
@@ -74,6 +94,7 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
dataManager.addWatchedParameter(MODE);
dataManager.addWatchedParameter(STORED);
dataManager.addWatchedParameter(CAPACITY);
dataManager.addWatchedParameter(TYPE);
}
@Override
@@ -83,7 +104,7 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
@Override
public int getEnergyUsage() {
return RefinedStorage.INSTANCE.externalStorageUsage + (storages.size() * RefinedStorage.INSTANCE.externalStoragePerStorageUsage);
return RefinedStorage.INSTANCE.externalStorageUsage + ((itemStorages.size() + fluidStorages.size()) * RefinedStorage.INSTANCE.externalStoragePerStorageUsage);
}
@Override
@@ -97,23 +118,35 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
updateStorage(network);
network.getItemStorage().rebuild();
network.getFluidStorage().rebuild();
}
@Override
public void update() {
if (!worldObj.isRemote && network != null) {
boolean changeDetected = false;
boolean itemChangeDetected = false, fluidChangeDetected = false;
for (ItemStorageExternal storage : storages) {
for (ItemStorageExternal storage : itemStorages) {
if (storage.updateCache()) {
changeDetected = true;
itemChangeDetected = true;
}
}
if (changeDetected) {
for (FluidStorageExternal storage : fluidStorages) {
if (storage.updateCache()) {
fluidChangeDetected = true;
}
}
if (itemChangeDetected) {
network.getItemStorage().rebuild();
}
// @TODO: This is broken?
if (fluidChangeDetected) {
network.getFluidStorage().rebuild();
}
if (getFacingTile() instanceof IDrawerGroup && lastDrawerCount != ((IDrawerGroup) getFacingTile()).getDrawerCount()) {
lastDrawerCount = ((IDrawerGroup) getFacingTile()).getDrawerCount();
@@ -128,7 +161,8 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
public void read(NBTTagCompound tag) {
super.read(tag);
readItems(filters, 0, tag);
readItems(itemFilters, 0, tag);
readItems(fluidFilters, 1, tag);
if (tag.hasKey(NBT_PRIORITY)) {
priority = tag.getInteger(NBT_PRIORITY);
@@ -141,17 +175,23 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
if (tag.hasKey(NBT_MODE)) {
mode = tag.getInteger(NBT_MODE);
}
if (tag.hasKey(NBT_TYPE)) {
type = tag.getInteger(NBT_TYPE);
}
}
@Override
public NBTTagCompound write(NBTTagCompound tag) {
super.write(tag);
writeItems(filters, 0, tag);
writeItems(itemFilters, 0, tag);
writeItems(fluidFilters, 1, tag);
tag.setInteger(NBT_PRIORITY, priority);
tag.setInteger(NBT_COMPARE, compare);
tag.setInteger(NBT_MODE, mode);
tag.setInteger(NBT_TYPE, type);
return tag;
}
@@ -193,7 +233,8 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
}
public void updateStorage(INetworkMaster network) {
storages.clear();
itemStorages.clear();
fluidStorages.clear();
TileEntity facing = getFacingTile();
@@ -202,27 +243,41 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
for (int i = 0; i < group.getDrawerCount(); ++i) {
if (group.isDrawerEnabled(i)) {
storages.add(new ItemStorageDrawer(this, group.getDrawer(i)));
itemStorages.add(new ItemStorageDrawer(this, group.getDrawer(i)));
}
}
} else if (facing instanceof IDrawer) {
storages.add(new ItemStorageDrawer(this, (IDrawer) facing));
itemStorages.add(new ItemStorageDrawer(this, (IDrawer) facing));
} else if (facing instanceof IDeepStorageUnit) {
storages.add(new ItemStorageDSU(this, (IDeepStorageUnit) facing));
itemStorages.add(new ItemStorageDSU(this, (IDeepStorageUnit) facing));
} else {
IItemHandler handler = getItemHandler(facing, getDirection().getOpposite());
IItemHandler itemHandler = getItemHandler(facing, getDirection().getOpposite());
if (handler != null) {
storages.add(new ItemStorageItemHandler(this, handler));
if (itemHandler != null) {
itemStorages.add(new ItemStorageItemHandler(this, itemHandler));
}
IFluidHandler fluidHandler = getFluidHandler(facing, getDirection().getOpposite());
if (fluidHandler != null) {
for (IFluidTankProperties property : fluidHandler.getTankProperties()) {
fluidStorages.add(new FluidStorageExternal(this, fluidHandler, property));
}
}
}
network.getItemStorage().rebuild();
network.getFluidStorage().rebuild();
}
@Override
public void addItemStorages(List<IItemStorage> storages) {
storages.addAll(this.storages);
storages.addAll(this.itemStorages);
}
@Override
public void addFluidStorages(List<IFluidStorage> storages) {
storages.addAll(this.fluidStorages);
}
@Override
@@ -261,13 +316,33 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
}
@Override
public IItemHandler getFilters() {
return filters;
public TileDataParameter<Integer> getTypeParameter() {
return TYPE;
}
// @TODO: Implement
@Override
public TileDataParameter<Integer> getTypeParameter() {
return null;
public int getType() {
return worldObj.isRemote ? TYPE.getValue() : type;
}
@Override
public void setType(int type) {
this.type = type;
markDirty();
}
@Override
public IItemHandler getFilterInventory() {
return getType() == IType.ITEMS ? itemFilters : fluidFilters;
}
public ItemHandlerBasic getItemFilters() {
return itemFilters;
}
public ItemHandlerFluid getFluidFilters() {
return fluidFilters;
}
}