The Portable Grid now supports fluid disks. Fixes #1916

This commit is contained in:
raoulvdberge
2018-07-29 19:58:35 +02:00
parent 12bc0a2c41
commit 218c756d5b
22 changed files with 628 additions and 152 deletions

View File

@@ -3,8 +3,8 @@
### 1.6.1 ### 1.6.1
- Added fluid autocrafting (raoulvdberge) - Added fluid autocrafting (raoulvdberge)
- Added Crafting Upgrade support for fluids on the Exporter, Constructor and Fluid Interface (raoulvdberge) - Added Crafting Upgrade support for fluids on the Exporter, Constructor and Fluid Interface (raoulvdberge)
- Added support for JEI ghost slot dragging (raoulvdberge)
- Added config option to hide covers in the creative mode tabs and JEI (raoulvdberge) - Added config option to hide covers in the creative mode tabs and JEI (raoulvdberge)
- The Portable Grid now supports fluid disks (raoulvdberge)
- Removed "emit signal when item is being autocrafted" option in the Detector (raoulvdberge) - Removed "emit signal when item is being autocrafted" option in the Detector (raoulvdberge)
- The Crafting Card no longer schedules requests when there are items or fluids missing (raoulvdberge) - The Crafting Card no longer schedules requests when there are items or fluids missing (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 keep fluids in stock by attaching a External Storage in fluid mode to a Fluid Interface with a Crafting Upgrade (raoulvdberge)

View File

@@ -46,7 +46,6 @@ public interface IFluidGridHandler {
*/ */
ItemStack onShiftClick(EntityPlayerMP player, ItemStack container); ItemStack onShiftClick(EntityPlayerMP player, ItemStack container);
/** /**
* Called when a player requests the crafting preview window to be opened. * Called when a player requests the crafting preview window to be opened.
* *

View File

@@ -0,0 +1,112 @@
package com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
import com.raoulvdberge.refinedstorage.api.util.Action;
import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.tile.grid.portable.IPortableGrid;
import com.raoulvdberge.refinedstorage.util.StackUtils;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nullable;
public class FluidGridHandlerPortable implements IFluidGridHandler {
private IPortableGrid portableGrid;
public FluidGridHandlerPortable(IPortableGrid portableGrid) {
this.portableGrid = portableGrid;
}
@Override
public void onExtract(EntityPlayerMP player, int hash, boolean shift) {
FluidStack stack = portableGrid.getFluidCache().getList().get(hash);
if (stack == null || stack.amount < Fluid.BUCKET_VOLUME) {
return;
}
if (StackUtils.hasFluidBucket(stack)) {
ItemStack bucket = null;
for (int i = 0; i < player.inventory.getSizeInventory(); ++i) {
ItemStack slot = player.inventory.getStackInSlot(i);
if (API.instance().getComparer().isEqualNoQuantity(StackUtils.EMPTY_BUCKET, slot)) {
bucket = StackUtils.EMPTY_BUCKET.copy();
player.inventory.decrStackSize(i, 1);
break;
}
}
if (bucket != null) {
IFluidHandlerItem fluidHandler = bucket.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null);
portableGrid.getFluidStorageTracker().changed(player, stack.copy());
fluidHandler.fill(portableGrid.getFluidStorage().extract(stack, Fluid.BUCKET_VOLUME, IComparer.COMPARE_NBT, Action.PERFORM), true);
if (shift) {
if (!player.inventory.addItemStackToInventory(fluidHandler.getContainer().copy())) {
InventoryHelper.spawnItemStack(player.getEntityWorld(), player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), fluidHandler.getContainer());
}
} else {
player.inventory.setItemStack(fluidHandler.getContainer());
player.updateHeldItem();
}
portableGrid.drainEnergy(RS.INSTANCE.config.portableGridExtractUsage);
}
}
}
@Nullable
@Override
public ItemStack onInsert(EntityPlayerMP player, ItemStack container) {
Pair<ItemStack, FluidStack> result = StackUtils.getFluid(container, true);
if (result.getValue() != null && portableGrid.getFluidStorage().insert(result.getValue(), result.getValue().amount, Action.SIMULATE) == null) {
portableGrid.getFluidStorageTracker().changed(player, result.getValue().copy());
result = StackUtils.getFluid(container, false);
portableGrid.getFluidStorage().insert(result.getValue(), result.getValue().amount, Action.PERFORM);
portableGrid.drainEnergy(RS.INSTANCE.config.portableGridInsertUsage);
return result.getLeft();
}
return container;
}
@Override
public void onInsertHeldContainer(EntityPlayerMP player) {
player.inventory.setItemStack(StackUtils.nullToEmpty(onInsert(player, player.inventory.getItemStack())));
player.updateHeldItem();
}
@Override
public ItemStack onShiftClick(EntityPlayerMP player, ItemStack container) {
return StackUtils.nullToEmpty(onInsert(player, container));
}
@Override
public void onCraftingPreviewRequested(EntityPlayerMP player, int hash, int quantity, boolean noPreview) {
// NO OP
}
@Override
public void onCraftingRequested(EntityPlayerMP player, int hash, int quantity) {
// NO OP
}
}

View File

@@ -33,7 +33,7 @@ public class ItemGridHandlerPortable implements IItemGridHandler {
return; return;
} }
ItemStack item = portableGrid.getCache().getList().get(hash); ItemStack item = portableGrid.getItemCache().getList().get(hash);
if (item == null) { if (item == null) {
return; return;
@@ -76,21 +76,21 @@ public class ItemGridHandlerPortable implements IItemGridHandler {
size = Math.min(size, maxItemSize); size = Math.min(size, maxItemSize);
// Do this before actually extracting, since portable grid sends updates as soon as a change happens (so before the storage tracker used to track) // Do this before actually extracting, since portable grid sends updates as soon as a change happens (so before the storage tracker used to track)
portableGrid.getStorageTracker().changed(player, item.copy()); portableGrid.getItemStorageTracker().changed(player, item.copy());
ItemStack took = portableGrid.getStorage().extract(item, size, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT, Action.SIMULATE); ItemStack took = portableGrid.getItemStorage().extract(item, size, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT, Action.SIMULATE);
if (took != null) { if (took != null) {
if ((flags & EXTRACT_SHIFT) == EXTRACT_SHIFT) { if ((flags & EXTRACT_SHIFT) == EXTRACT_SHIFT) {
IItemHandler playerInventory = player.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.UP); IItemHandler playerInventory = player.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, EnumFacing.UP);
if (ItemHandlerHelper.insertItem(playerInventory, took, true).isEmpty()) { if (ItemHandlerHelper.insertItem(playerInventory, took, true).isEmpty()) {
took = portableGrid.getStorage().extract(item, size, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT, Action.PERFORM); took = portableGrid.getItemStorage().extract(item, size, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT, Action.PERFORM);
ItemHandlerHelper.insertItem(playerInventory, took, false); ItemHandlerHelper.insertItem(playerInventory, took, false);
} }
} else { } else {
took = portableGrid.getStorage().extract(item, size, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT, Action.PERFORM); took = portableGrid.getItemStorage().extract(item, size, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT, Action.PERFORM);
if (single && !held.isEmpty()) { if (single && !held.isEmpty()) {
held.grow(1); held.grow(1);
@@ -112,9 +112,9 @@ public class ItemGridHandlerPortable implements IItemGridHandler {
return stack; return stack;
} }
portableGrid.getStorageTracker().changed(player, stack.copy()); portableGrid.getItemStorageTracker().changed(player, stack.copy());
ItemStack remainder = portableGrid.getStorage().insert(stack, stack.getCount(), Action.PERFORM); ItemStack remainder = portableGrid.getItemStorage().insert(stack, stack.getCount(), Action.PERFORM);
portableGrid.drainEnergy(RS.INSTANCE.config.portableGridInsertUsage); portableGrid.drainEnergy(RS.INSTANCE.config.portableGridInsertUsage);
@@ -130,11 +130,11 @@ public class ItemGridHandlerPortable implements IItemGridHandler {
ItemStack stack = player.inventory.getItemStack(); ItemStack stack = player.inventory.getItemStack();
int size = single ? 1 : stack.getCount(); int size = single ? 1 : stack.getCount();
portableGrid.getStorageTracker().changed(player, stack.copy()); portableGrid.getItemStorageTracker().changed(player, stack.copy());
if (single) { if (single) {
if (portableGrid.getStorage().insert(stack, size, Action.SIMULATE) == null) { if (portableGrid.getItemStorage().insert(stack, size, Action.SIMULATE) == null) {
portableGrid.getStorage().insert(stack, size, Action.PERFORM); portableGrid.getItemStorage().insert(stack, size, Action.PERFORM);
stack.shrink(size); stack.shrink(size);
@@ -143,7 +143,7 @@ public class ItemGridHandlerPortable implements IItemGridHandler {
} }
} }
} else { } else {
player.inventory.setItemStack(StackUtils.nullToEmpty(portableGrid.getStorage().insert(stack, size, Action.PERFORM))); player.inventory.setItemStack(StackUtils.nullToEmpty(portableGrid.getItemStorage().insert(stack, size, Action.PERFORM)));
} }
player.updateHeldItem(); player.updateHeldItem();

View File

@@ -6,7 +6,7 @@ import com.raoulvdberge.refinedstorage.api.util.Action;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.storage.externalstorage.StorageExternalFluid; import com.raoulvdberge.refinedstorage.apiimpl.storage.externalstorage.StorageExternalFluid;
import com.raoulvdberge.refinedstorage.inventory.fluid.FluidHandlerFluidInterface; import com.raoulvdberge.refinedstorage.inventory.fluid.FluidHandlerProxy;
import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory;
import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerBase;
import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerUpgrade; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerUpgrade;
@@ -50,7 +50,7 @@ public class NetworkNodeFluidInterface extends NetworkNode {
}; };
private FluidTank tankOut = new FluidTank(TANK_CAPACITY); private FluidTank tankOut = new FluidTank(TANK_CAPACITY);
private FluidHandlerFluidInterface tank = new FluidHandlerFluidInterface(tankIn, tankOut); private FluidHandlerProxy tank = new FluidHandlerProxy(tankIn, tankOut);
private ItemHandlerBase in = new ItemHandlerBase(1, new ListenerNetworkNode(this), stack -> StackUtils.getFluid(stack, true).getRight() != null); private ItemHandlerBase in = new ItemHandlerBase(1, new ListenerNetworkNode(this), stack -> StackUtils.getFluid(stack, true).getRight() != null);
private FluidInventory out = new FluidInventory(1, TANK_CAPACITY, new ListenerNetworkNode(this)); private FluidInventory out = new FluidInventory(1, TANK_CAPACITY, new ListenerNetworkNode(this));
@@ -245,7 +245,7 @@ public class NetworkNodeFluidInterface extends NetworkNode {
return out; return out;
} }
public FluidHandlerFluidInterface getTank() { public FluidHandlerProxy getTank() {
return tank; return tank;
} }

View File

@@ -0,0 +1,83 @@
package com.raoulvdberge.refinedstorage.apiimpl.storage;
import com.raoulvdberge.refinedstorage.api.storage.IStorage;
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
import com.raoulvdberge.refinedstorage.api.storage.IStorageCacheListener;
import com.raoulvdberge.refinedstorage.api.util.IStackList;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.tile.grid.portable.IPortableGrid;
import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nonnull;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class StorageCacheFluidPortable implements IStorageCache<FluidStack> {
private IPortableGrid portableGrid;
private IStackList<FluidStack> list = API.instance().createFluidStackList();
private List<IStorageCacheListener<FluidStack>> listeners = new LinkedList<>();
public StorageCacheFluidPortable(IPortableGrid portableGrid) {
this.portableGrid = portableGrid;
}
@Override
public void invalidate() {
list.clear();
if (portableGrid.getFluidStorage() != null) {
portableGrid.getFluidStorage().getStacks().forEach(list::add);
}
listeners.forEach(IStorageCacheListener::onInvalidated);
}
@Override
public void add(@Nonnull FluidStack stack, int size, boolean rebuilding, boolean batched) {
list.add(stack, size);
if (!rebuilding) {
listeners.forEach(l -> l.onChanged(stack, size));
}
}
@Override
public void remove(@Nonnull FluidStack stack, int size, boolean batched) {
if (list.remove(stack, size)) {
listeners.forEach(l -> l.onChanged(stack, -size));
}
}
@Override
public void flush() {
throw new UnsupportedOperationException("Cannot flush portable grid storage cache");
}
@Override
public void addListener(IStorageCacheListener<FluidStack> listener) {
listeners.add(listener);
listener.onAttached();
}
@Override
public void removeListener(IStorageCacheListener<FluidStack> listener) {
listeners.remove(listener);
}
@Override
public void sort() {
// NO OP
}
@Override
public IStackList<FluidStack> getList() {
return list;
}
@Override
public List<IStorage<FluidStack>> getStorages() {
return Collections.emptyList();
}
}

View File

@@ -26,8 +26,8 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
public void invalidate() { public void invalidate() {
list.clear(); list.clear();
if (portableGrid.getStorage() != null) { if (portableGrid.getItemStorage() != null) {
portableGrid.getStorage().getStacks().forEach(list::add); portableGrid.getItemStorage().getStacks().forEach(list::add);
} }
listeners.forEach(IStorageCacheListener::onInvalidated); listeners.forEach(IStorageCacheListener::onInvalidated);

View File

@@ -32,6 +32,6 @@ public class StorageCacheListenerGridFluid implements IStorageCacheListener<Flui
@Override @Override
public void onChanged(@Nonnull FluidStack stack, int size) { public void onChanged(@Nonnull FluidStack stack, int size) {
RS.INSTANCE.network.sendTo(new MessageGridFluidDelta(network, stack, size), player); RS.INSTANCE.network.sendTo(new MessageGridFluidDelta(network, network.getFluidStorageTracker(), stack, size), player);
} }
} }

View File

@@ -25,12 +25,12 @@ public class StorageCacheListenerGridPortable implements IStorageCacheListener<I
@Override @Override
public void onAttached() { public void onAttached() {
RS.INSTANCE.network.sendTo(new MessageGridItemUpdate(buf -> { RS.INSTANCE.network.sendTo(new MessageGridItemUpdate(buf -> {
buf.writeInt(portableGrid.getCache().getList().getStacks().size()); buf.writeInt(portableGrid.getItemCache().getList().getStacks().size());
for (ItemStack stack : portableGrid.getCache().getList().getStacks()) { for (ItemStack stack : portableGrid.getItemCache().getList().getStacks()) {
StackUtils.writeItemStack(buf, stack, null, false); StackUtils.writeItemStack(buf, stack, null, false);
IStorageTracker.IStorageTrackerEntry entry = portableGrid.getStorageTracker().get(stack); IStorageTracker.IStorageTrackerEntry entry = portableGrid.getItemStorageTracker().get(stack);
buf.writeBoolean(entry != null); buf.writeBoolean(entry != null);
if (entry != null) { if (entry != null) {
buf.writeLong(entry.getTime()); buf.writeLong(entry.getTime());
@@ -47,6 +47,6 @@ public class StorageCacheListenerGridPortable implements IStorageCacheListener<I
@Override @Override
public void onChanged(@Nonnull ItemStack stack, int size) { public void onChanged(@Nonnull ItemStack stack, int size) {
RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, portableGrid.getStorageTracker(), stack, size), player); RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, portableGrid.getItemStorageTracker(), stack, size), player);
} }
} }

View File

@@ -0,0 +1,57 @@
package com.raoulvdberge.refinedstorage.apiimpl.storage;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.storage.IStorageCacheListener;
import com.raoulvdberge.refinedstorage.api.storage.IStorageTracker;
import com.raoulvdberge.refinedstorage.network.MessageGridFluidDelta;
import com.raoulvdberge.refinedstorage.network.MessageGridFluidUpdate;
import com.raoulvdberge.refinedstorage.tile.grid.portable.IPortableGrid;
import com.raoulvdberge.refinedstorage.util.StackUtils;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import javax.annotation.Nonnull;
public class StorageCacheListenerGridPortableFluid implements IStorageCacheListener<FluidStack> {
private IPortableGrid portableGrid;
private EntityPlayerMP player;
public StorageCacheListenerGridPortableFluid(IPortableGrid portableGrid, EntityPlayerMP player) {
this.portableGrid = portableGrid;
this.player = player;
}
@Override
public void onAttached() {
RS.INSTANCE.network.sendTo(new MessageGridFluidUpdate(buf -> {
int size = portableGrid.getFluidCache().getList().getStacks().size();
buf.writeInt(size);
for (FluidStack stack : portableGrid.getFluidCache().getList().getStacks()) {
StackUtils.writeFluidStackAndHash(buf, stack);
IStorageTracker.IStorageTrackerEntry entry = portableGrid.getFluidStorageTracker().get(stack);
buf.writeBoolean(entry != null);
if (entry != null) {
buf.writeLong(entry.getTime());
ByteBufUtils.writeUTF8String(buf, entry.getName());
}
buf.writeBoolean(false);
buf.writeBoolean(false);
}
}, false), player);
}
@Override
public void onInvalidated() {
// NO OP
}
@Override
public void onChanged(@Nonnull FluidStack stack, int size) {
RS.INSTANCE.network.sendTo(new MessageGridFluidDelta(null, portableGrid.getFluidStorageTracker(), stack, size), player);
}
}

View File

@@ -0,0 +1,99 @@
package com.raoulvdberge.refinedstorage.apiimpl.storage.disk;
import com.raoulvdberge.refinedstorage.api.storage.AccessType;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskContainerContext;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskListener;
import com.raoulvdberge.refinedstorage.api.util.Action;
import com.raoulvdberge.refinedstorage.tile.grid.portable.IPortableGrid;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Collection;
public class StorageDiskFluidPortable implements IStorageDisk<FluidStack> {
private IStorageDisk<FluidStack> parent;
private IPortableGrid portableGrid;
public StorageDiskFluidPortable(IStorageDisk<FluidStack> parent, IPortableGrid portableGrid) {
this.parent = parent;
this.portableGrid = portableGrid;
}
@Override
public int getCapacity() {
return parent.getCapacity();
}
@Override
public void setSettings(@Nullable IStorageDiskListener listener, IStorageDiskContainerContext context) {
parent.setSettings(listener, context);
}
@Override
public NBTTagCompound writeToNbt() {
return parent.writeToNbt();
}
@Override
public Collection<FluidStack> getStacks() {
return parent.getStacks();
}
@Nullable
@Override
public FluidStack insert(@Nonnull FluidStack stack, int size, Action action) {
int storedPre = parent.getStored();
FluidStack remainder = parent.insert(stack, size, action);
if (action == Action.PERFORM) {
int inserted = parent.getCacheDelta(storedPre, size, remainder);
if (inserted > 0) {
portableGrid.getFluidCache().add(stack, inserted, false, false);
}
}
return remainder;
}
@Nullable
@Override
public FluidStack extract(@Nonnull FluidStack stack, int size, int flags, Action action) {
FluidStack extracted = parent.extract(stack, size, flags, action);
if (action == Action.PERFORM && extracted != null) {
portableGrid.getFluidCache().remove(extracted, extracted.amount, false);
}
return extracted;
}
@Override
public int getStored() {
return parent.getStored();
}
@Override
public int getPriority() {
return parent.getPriority();
}
@Override
public AccessType getAccessType() {
return parent.getAccessType();
}
@Override
public int getCacheDelta(int storedPreInsertion, int size, @Nullable FluidStack remainder) {
return parent.getCacheDelta(storedPreInsertion, size, remainder);
}
@Override
public String getId() {
return parent.getId();
}
}

View File

@@ -53,7 +53,7 @@ public class StorageDiskItemPortable implements IStorageDisk<ItemStack> {
int inserted = parent.getCacheDelta(storedPre, size, remainder); int inserted = parent.getCacheDelta(storedPre, size, remainder);
if (inserted > 0) { if (inserted > 0) {
portableGrid.getCache().add(stack, inserted, false, false); portableGrid.getItemCache().add(stack, inserted, false, false);
} }
} }
@@ -66,7 +66,7 @@ public class StorageDiskItemPortable implements IStorageDisk<ItemStack> {
ItemStack extracted = parent.extract(stack, size, flags, action); ItemStack extracted = parent.extract(stack, size, flags, action);
if (action == Action.PERFORM && extracted != null) { if (action == Action.PERFORM && extracted != null) {
portableGrid.getCache().remove(extracted, extracted.getCount(), false); portableGrid.getItemCache().remove(extracted, extracted.getCount(), false);
} }
return extracted; return extracted;

View File

@@ -54,7 +54,7 @@ public class ContainerGrid extends ContainerBase {
this.transferManager.clearTransfers(); this.transferManager.clearTransfers();
if (grid.getGridType() != GridType.FLUID) { if (grid.getGridType() != GridType.FLUID || grid instanceof IPortableGrid) {
addFilterSlots(); addFilterSlots();
} }

View File

@@ -57,19 +57,10 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
private int slotNumber; private int slotNumber;
public GuiGrid(ContainerGrid container, IGrid grid) { public GuiGrid(ContainerGrid container, IGrid grid) {
super(container, grid.getGridType() == GridType.FLUID ? 193 : 227, 0); super(container, (grid.getGridType() == GridType.FLUID && !(grid instanceof IPortableGrid)) ? 193 : 227, 0);
IGridSorter defaultSorter;
List<IGridSorter> sorters = new LinkedList<>();
sorters.add(defaultSorter = new GridSorterName());
sorters.add(new GridSorterQuantity());
sorters.add(new GridSorterID());
sorters.add(new GridSorterInventoryTweaks());
sorters.add(new GridSorterLastModified());
this.grid = grid; this.grid = grid;
this.view = grid.getGridType() == GridType.FLUID ? new GridViewFluid(this, defaultSorter, sorters) : new GridViewItem(this, defaultSorter, sorters); this.view = grid.getGridType() == GridType.FLUID ? new GridViewFluid(this, getDefaultSorter(), getSorters()) : new GridViewItem(this, getDefaultSorter(), getSorters());
this.wasConnected = this.grid.isActive(); this.wasConnected = this.grid.isActive();
this.tabs = new TabList(this, new ElementDrawers(), grid::getTabs, grid::getTotalTabPages, grid::getTabPage, grid::getTabSelected, IGrid.TABS_PER_PAGE); this.tabs = new TabList(this, new ElementDrawers(), grid::getTabs, grid::getTotalTabPages, grid::getTabPage, grid::getTabSelected, IGrid.TABS_PER_PAGE);
this.tabs.addListener(new TabList.ITabListListener() { this.tabs.addListener(new TabList.ITabListListener() {
@@ -151,6 +142,10 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
return grid; return grid;
} }
public void setView(IGridView view) {
this.view = view;
}
public IGridView getView() { public IGridView getView() {
return view; return view;
} }
@@ -271,12 +266,12 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
public void drawBackground(int x, int y, int mouseX, int mouseY) { public void drawBackground(int x, int y, int mouseX, int mouseY) {
tabs.drawBackground(x, y); tabs.drawBackground(x, y);
if (grid.getGridType() == GridType.CRAFTING) { if (grid instanceof IPortableGrid) {
bindTexture("gui/portable_grid.png");
} else if (grid.getGridType() == GridType.CRAFTING) {
bindTexture("gui/crafting_grid.png"); bindTexture("gui/crafting_grid.png");
} else if (grid.getGridType() == GridType.PATTERN) { } else if (grid.getGridType() == GridType.PATTERN) {
bindTexture("gui/pattern_grid" + (((NetworkNodeGrid) grid).isProcessingPattern() ? "_processing" : "") + ".png"); bindTexture("gui/pattern_grid" + (((NetworkNodeGrid) grid).isProcessingPattern() ? "_processing" : "") + ".png");
} else if (grid instanceof IPortableGrid) {
bindTexture("gui/portable_grid.png");
} else { } else {
bindTexture("gui/grid.png"); bindTexture("gui/grid.png");
} }
@@ -285,7 +280,8 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
drawTexture(x, yy, 0, 0, screenWidth - (grid.getGridType() != GridType.FLUID ? 34 : 0), getTopHeight()); drawTexture(x, yy, 0, 0, screenWidth - (grid.getGridType() != GridType.FLUID ? 34 : 0), getTopHeight());
if (grid.getGridType() != GridType.FLUID) { // Filters and portable grid disk
if (grid.getGridType() != GridType.FLUID || grid instanceof IPortableGrid) {
drawTexture(x + screenWidth - 34 + 4, y + tabs.getHeight(), 197, 0, 30, grid instanceof IPortableGrid ? 114 : 82); drawTexture(x + screenWidth - 34 + 4, y + tabs.getHeight(), 197, 0, 30, grid instanceof IPortableGrid ? 114 : 82);
} }
@@ -294,12 +290,12 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
for (int i = 0; i < rows; ++i) { for (int i = 0; i < rows; ++i) {
yy += 18; yy += 18;
drawTexture(x, yy, 0, getTopHeight() + (i > 0 ? (i == rows - 1 ? 18 * 2 : 18) : 0), screenWidth - (grid.getGridType() != GridType.FLUID ? 34 : 0), 18); drawTexture(x, yy, 0, getTopHeight() + (i > 0 ? (i == rows - 1 ? 18 * 2 : 18) : 0), screenWidth - ((grid.getGridType() != GridType.FLUID || grid instanceof IPortableGrid) ? 34 : 0), 18);
} }
yy += 18; yy += 18;
drawTexture(x, yy, 0, getTopHeight() + (18 * 3), screenWidth - (grid.getGridType() != GridType.FLUID ? 34 : 0), getBottomHeight()); drawTexture(x, yy, 0, getTopHeight() + (18 * 3), screenWidth - ((grid.getGridType() != GridType.FLUID || grid instanceof IPortableGrid) ? 34 : 0), getBottomHeight());
if (grid.getGridType() == GridType.PATTERN) { if (grid.getGridType() == GridType.PATTERN) {
int ty = 0; int ty = 0;
@@ -526,4 +522,19 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
scrollbar.setMaxOffset(getRows() - getVisibleRows()); scrollbar.setMaxOffset(getRows() - getVisibleRows());
} }
} }
public static List<IGridSorter> getSorters() {
List<IGridSorter> sorters = new LinkedList<>();
sorters.add(getDefaultSorter());
sorters.add(new GridSorterQuantity());
sorters.add(new GridSorterID());
sorters.add(new GridSorterInventoryTweaks());
sorters.add(new GridSorterLastModified());
return sorters;
}
public static IGridSorter getDefaultSorter() {
return new GridSorterName();
}
} }

View File

@@ -22,7 +22,7 @@ public class RSJEIPlugin implements IModPlugin {
registry.addRecipeRegistryPlugin(new RecipeRegistryPluginCover()); registry.addRecipeRegistryPlugin(new RecipeRegistryPluginCover());
registry.addRecipeRegistryPlugin(new RecipeRegistryPluginHollowCover()); registry.addRecipeRegistryPlugin(new RecipeRegistryPluginHollowCover());
// TODO: #1905 // TODO: https://github.com/mezz/JustEnoughItems/issues/1307
// registry.addGhostIngredientHandler(GuiBase.class, new GhostIngredientHandler()); // registry.addGhostIngredientHandler(GuiBase.class, new GhostIngredientHandler());
} }

View File

@@ -8,17 +8,17 @@ import net.minecraftforge.fluids.capability.IFluidTankProperties;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public class FluidHandlerFluidInterface implements IFluidHandler { public class FluidHandlerProxy implements IFluidHandler {
private FluidTank input; private FluidTank insertHandler;
private FluidTank output; private FluidTank extractHandler;
private IFluidTankProperties[] properties; private IFluidTankProperties[] properties;
public FluidHandlerFluidInterface(FluidTank input, FluidTank output) { public FluidHandlerProxy(FluidTank insertHandler, FluidTank extractHandler) {
this.input = input; this.insertHandler = insertHandler;
this.output = output; this.extractHandler = extractHandler;
this.properties = new IFluidTankProperties[]{ this.properties = new IFluidTankProperties[]{
new FluidTankPropertiesWrapper(input), new FluidTankPropertiesWrapper(insertHandler),
new FluidTankPropertiesWrapper(output) new FluidTankPropertiesWrapper(extractHandler)
}; };
} }
@@ -29,18 +29,18 @@ public class FluidHandlerFluidInterface implements IFluidHandler {
@Override @Override
public int fill(FluidStack resource, boolean doFill) { public int fill(FluidStack resource, boolean doFill) {
return input.fill(resource, doFill); return insertHandler.fill(resource, doFill);
} }
@Nullable @Nullable
@Override @Override
public FluidStack drain(FluidStack resource, boolean doDrain) { public FluidStack drain(FluidStack resource, boolean doDrain) {
return output.drain(resource, doDrain); return extractHandler.drain(resource, doDrain);
} }
@Nullable @Nullable
@Override @Override
public FluidStack drain(int maxDrain, boolean doDrain) { public FluidStack drain(int maxDrain, boolean doDrain) {
return output.drain(maxDrain, doDrain); return extractHandler.drain(maxDrain, doDrain);
} }
} }

View File

@@ -15,8 +15,12 @@ import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nullable;
public class MessageGridFluidDelta implements IMessage, IMessageHandler<MessageGridFluidDelta, IMessage> { public class MessageGridFluidDelta implements IMessage, IMessageHandler<MessageGridFluidDelta, IMessage> {
@Nullable
private INetwork network; private INetwork network;
private IStorageTracker<FluidStack> storageTracker;
private FluidStack stack; private FluidStack stack;
private int delta; private int delta;
@@ -25,8 +29,9 @@ public class MessageGridFluidDelta implements IMessage, IMessageHandler<MessageG
public MessageGridFluidDelta() { public MessageGridFluidDelta() {
} }
public MessageGridFluidDelta(INetwork network, FluidStack stack, int delta) { public MessageGridFluidDelta(@Nullable INetwork network, IStorageTracker<FluidStack> storageTracker, FluidStack stack, int delta) {
this.network = network; this.network = network;
this.storageTracker = storageTracker;
this.stack = stack; this.stack = stack;
this.delta = delta; this.delta = delta;
} }
@@ -43,14 +48,18 @@ public class MessageGridFluidDelta implements IMessage, IMessageHandler<MessageG
public void toBytes(ByteBuf buf) { public void toBytes(ByteBuf buf) {
StackUtils.writeFluidStackAndHash(buf, stack); StackUtils.writeFluidStackAndHash(buf, stack);
IStorageTracker.IStorageTrackerEntry entry = network.getFluidStorageTracker().get(stack); IStorageTracker.IStorageTrackerEntry entry = storageTracker.get(stack);
buf.writeBoolean(entry != null); buf.writeBoolean(entry != null);
if (entry != null) { if (entry != null) {
buf.writeLong(entry.getTime()); buf.writeLong(entry.getTime());
ByteBufUtils.writeUTF8String(buf, entry.getName()); ByteBufUtils.writeUTF8String(buf, entry.getName());
} }
if (network != null) {
buf.writeBoolean(network.getCraftingManager().getPattern(stack) != null); buf.writeBoolean(network.getCraftingManager().getPattern(stack) != null);
} else {
buf.writeBoolean(false);
}
buf.writeInt(delta); buf.writeInt(delta);
} }

View File

@@ -8,6 +8,7 @@ import com.raoulvdberge.refinedstorage.gui.GuiBase;
import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid;
import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackFluid; import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackFluid;
import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack;
import com.raoulvdberge.refinedstorage.gui.grid.view.GridViewFluid;
import com.raoulvdberge.refinedstorage.util.StackUtils; import com.raoulvdberge.refinedstorage.util.StackUtils;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
@@ -19,37 +20,19 @@ import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
public class MessageGridFluidUpdate implements IMessage, IMessageHandler<MessageGridFluidUpdate, IMessage> { public class MessageGridFluidUpdate implements IMessage, IMessageHandler<MessageGridFluidUpdate, IMessage> {
private INetwork network; private INetwork network;
private boolean canCraft; private boolean canCraft;
private List<IGridStack> stacks = new ArrayList<>(); private List<IGridStack> stacks = new ArrayList<>();
private Consumer<ByteBuf> sendHandler;
public MessageGridFluidUpdate() { public MessageGridFluidUpdate() {
} }
public MessageGridFluidUpdate(INetwork network, boolean canCraft) { public MessageGridFluidUpdate(INetwork network, boolean canCraft) {
this.network = network; this(buf -> {
this.canCraft = canCraft;
}
@Override
public void fromBytes(ByteBuf buf) {
canCraft = buf.readBoolean();
int items = buf.readInt();
for (int i = 0; i < items; ++i) {
Pair<Integer, FluidStack> hashAndFluidStack = StackUtils.readFluidStackAndHash(buf);
this.stacks.add(new GridStackFluid(hashAndFluidStack.getLeft(), hashAndFluidStack.getRight(), buf.readBoolean() ? new StorageTrackerEntry(buf) : null, buf.readBoolean(), buf.readBoolean()));
}
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeBoolean(canCraft);
int size = network.getFluidStorageCache().getList().getStacks().size(); int size = network.getFluidStorageCache().getList().getStacks().size();
for (ICraftingPattern pattern : network.getCraftingManager().getPatterns()) { for (ICraftingPattern pattern : network.getCraftingManager().getPatterns()) {
@@ -87,11 +70,38 @@ public class MessageGridFluidUpdate implements IMessage, IMessageHandler<Message
buf.writeBoolean(true); buf.writeBoolean(true);
} }
} }
}, canCraft);
}
public MessageGridFluidUpdate(Consumer<ByteBuf> sendHandler, boolean canCraft) {
this.sendHandler = sendHandler;
this.canCraft = canCraft;
}
@Override
public void fromBytes(ByteBuf buf) {
canCraft = buf.readBoolean();
int items = buf.readInt();
for (int i = 0; i < items; ++i) {
Pair<Integer, FluidStack> hashAndFluidStack = StackUtils.readFluidStackAndHash(buf);
this.stacks.add(new GridStackFluid(hashAndFluidStack.getLeft(), hashAndFluidStack.getRight(), buf.readBoolean() ? new StorageTrackerEntry(buf) : null, buf.readBoolean(), buf.readBoolean()));
}
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeBoolean(canCraft);
sendHandler.accept(buf);
} }
@Override @Override
public IMessage onMessage(MessageGridFluidUpdate message, MessageContext ctx) { public IMessage onMessage(MessageGridFluidUpdate message, MessageContext ctx) {
GuiBase.executeLater(GuiGrid.class, grid -> { GuiBase.executeLater(GuiGrid.class, grid -> {
grid.setView(new GridViewFluid(grid, GuiGrid.getDefaultSorter(), GuiGrid.getSorters()));
grid.getView().setCanCraft(message.canCraft); grid.getView().setCanCraft(message.canCraft);
grid.getView().setStacks(message.stacks); grid.getView().setStacks(message.stacks);
grid.getView().sort(); grid.getView().sort();

View File

@@ -7,6 +7,7 @@ import com.raoulvdberge.refinedstorage.gui.GuiBase;
import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid;
import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackItem; import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackItem;
import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack;
import com.raoulvdberge.refinedstorage.gui.grid.view.GridViewItem;
import com.raoulvdberge.refinedstorage.util.StackUtils; import com.raoulvdberge.refinedstorage.util.StackUtils;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -91,6 +92,7 @@ public class MessageGridItemUpdate implements IMessage, IMessageHandler<MessageG
@Override @Override
public IMessage onMessage(MessageGridItemUpdate message, MessageContext ctx) { public IMessage onMessage(MessageGridItemUpdate message, MessageContext ctx) {
GuiBase.executeLater(GuiGrid.class, grid -> { GuiBase.executeLater(GuiGrid.class, grid -> {
grid.setView(new GridViewItem(grid, GuiGrid.getDefaultSorter(), GuiGrid.getSorters()));
grid.getView().setCanCraft(message.canCraft); grid.getView().setCanCraft(message.canCraft);
grid.getView().setStacks(message.stacks); grid.getView().setStacks(message.stacks);
grid.getView().sort(); grid.getView().sort();

View File

@@ -1,10 +1,11 @@
package com.raoulvdberge.refinedstorage.tile.grid.portable; package com.raoulvdberge.refinedstorage.tile.grid.portable;
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
import com.raoulvdberge.refinedstorage.api.storage.IStorageTracker;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageTrackerItem;
import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerBase;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -20,10 +21,27 @@ public interface IPortableGrid {
boolean isActive(); boolean isActive();
} }
IStorageCache<ItemStack> getCache(); @Nullable
IStorageCache getCache();
default IStorageCache<ItemStack> getItemCache() {
return (IStorageCache<ItemStack>) getCache();
}
default IStorageCache<FluidStack> getFluidCache() {
return (IStorageCache<FluidStack>) getCache();
}
@Nullable @Nullable
IStorageDisk<ItemStack> getStorage(); IStorageDisk getStorage();
default IStorageDisk<ItemStack> getItemStorage() {
return (IStorageDisk<ItemStack>) getStorage();
}
default IStorageDisk<FluidStack> getFluidStorage() {
return (IStorageDisk<FluidStack>) getStorage();
}
void drainEnergy(int energy); void drainEnergy(int energy);
@@ -33,5 +51,7 @@ public interface IPortableGrid {
IItemHandlerModifiable getFilter(); IItemHandlerModifiable getFilter();
StorageTrackerItem getStorageTracker(); IStorageTracker<ItemStack> getItemStorageTracker();
IStorageTracker<FluidStack> getFluidStorageTracker();
} }

View File

@@ -9,15 +9,17 @@ import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler
import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.AccessType;
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
import com.raoulvdberge.refinedstorage.api.storage.IStorageCacheListener; import com.raoulvdberge.refinedstorage.api.storage.IStorageCacheListener;
import com.raoulvdberge.refinedstorage.api.storage.StorageType;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskContainerContext; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskContainerContext;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider;
import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.api.util.IFilter;
import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.FluidGridHandlerPortable;
import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.ItemGridHandlerPortable; import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.ItemGridHandlerPortable;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.NetworkNodeDiskDrive; import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.NetworkNodeDiskDrive;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheItemPortable; import com.raoulvdberge.refinedstorage.apiimpl.storage.*;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheListenerGridPortable; import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskFluidPortable;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageTrackerItem;
import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskItemPortable; import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskItemPortable;
import com.raoulvdberge.refinedstorage.gui.GuiBase; import com.raoulvdberge.refinedstorage.gui.GuiBase;
import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid;
@@ -47,12 +49,16 @@ import java.util.List;
public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainerContext { public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainerContext {
public static int ID; public static int ID;
public static final String NBT_STORAGE_TRACKER = "StorageTracker"; static final String NBT_STORAGE_TRACKER = "StorageTracker";
static final String NBT_FLUID_STORAGE_TRACKER = "FluidStorageTracker";
@Nullable @Nullable
private IStorageDisk<ItemStack> storage; private IStorageDisk storage;
private StorageCacheItemPortable cache = new StorageCacheItemPortable(this); @Nullable
private ItemGridHandlerPortable handler = new ItemGridHandlerPortable(this, this); private IStorageCache cache;
private ItemGridHandlerPortable itemHandler = new ItemGridHandlerPortable(this, this);
private FluidGridHandlerPortable fluidHandler = new FluidGridHandlerPortable(this);
private EntityPlayer player; private EntityPlayer player;
private ItemStack stack; private ItemStack stack;
@@ -64,7 +70,8 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
private int tabPage; private int tabPage;
private int size; private int size;
private StorageTrackerItem storageTracker = new StorageTrackerItem(() -> stack.getTagCompound().setTag(NBT_STORAGE_TRACKER, getStorageTracker().serializeNbt())); private StorageTrackerItem storageTracker = new StorageTrackerItem(() -> stack.getTagCompound().setTag(NBT_STORAGE_TRACKER, getItemStorageTracker().serializeNbt()));
private StorageTrackerFluid fluidStorageTracker = new StorageTrackerFluid(() -> stack.getTagCompound().setTag(NBT_FLUID_STORAGE_TRACKER, getFluidStorageTracker().serializeNbt()));
private List<IFilter> filters = new ArrayList<>(); private List<IFilter> filters = new ArrayList<>();
private List<IGridTab> tabs = new ArrayList<>(); private List<IGridTab> tabs = new ArrayList<>();
@@ -80,7 +87,7 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
StackUtils.writeItems(this, 0, stack.getTagCompound()); StackUtils.writeItems(this, 0, stack.getTagCompound());
} }
}; };
private ItemHandlerBase disk = new ItemHandlerBase(1, s -> NetworkNodeDiskDrive.VALIDATOR_STORAGE_DISK.test(s) && true) { private ItemHandlerBase disk = new ItemHandlerBase(1, NetworkNodeDiskDrive.VALIDATOR_STORAGE_DISK) {
@Override @Override
protected void onContentsChanged(int slot) { protected void onContentsChanged(int slot) {
super.onContentsChanged(slot); super.onContentsChanged(slot);
@@ -90,18 +97,34 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
if (diskStack.isEmpty()) { if (diskStack.isEmpty()) {
storage = null; storage = null;
cache = null;
} else { } else {
IStorageDisk disk = API.instance().getStorageDiskManager(player.getEntityWorld()).getByStack(diskStack); IStorageDisk disk = API.instance().getStorageDiskManager(player.getEntityWorld()).getByStack(getDisk().getStackInSlot(0));
if (disk != null) { if (disk != null) {
StorageType type = ((IStorageDiskProvider) getDisk().getStackInSlot(0).getItem()).getType();
switch (type) {
case ITEM:
storage = new StorageDiskItemPortable(disk, PortableGrid.this); storage = new StorageDiskItemPortable(disk, PortableGrid.this);
cache = new StorageCacheItemPortable(PortableGrid.this);
break;
case FLUID:
storage = new StorageDiskFluidPortable(disk, PortableGrid.this);
cache = new StorageCacheFluidPortable(PortableGrid.this);
break;
}
storage.setSettings(null, PortableGrid.this); storage.setSettings(null, PortableGrid.this);
} else { } else {
storage = null; storage = null;
cache = null;
} }
} }
if (cache != null) {
cache.invalidate(); cache.invalidate();
}
StackUtils.writeItems(this, 4, stack.getTagCompound()); StackUtils.writeItems(this, 4, stack.getTagCompound());
} }
@@ -129,6 +152,10 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
storageTracker.readFromNbt(stack.getTagCompound().getTagList(NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); storageTracker.readFromNbt(stack.getTagCompound().getTagList(NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND));
} }
if (stack.getTagCompound().hasKey(NBT_FLUID_STORAGE_TRACKER)) {
fluidStorageTracker.readFromNbt(stack.getTagCompound().getTagList(NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND));
}
StackUtils.readItems(disk, 4, stack.getTagCompound()); StackUtils.readItems(disk, 4, stack.getTagCompound());
if (!player.getEntityWorld().isRemote) { if (!player.getEntityWorld().isRemote) {
@@ -138,11 +165,6 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
StackUtils.readItems(filter, 0, stack.getTagCompound()); StackUtils.readItems(filter, 0, stack.getTagCompound());
drainEnergy(RS.INSTANCE.config.portableGridOpenUsage); drainEnergy(RS.INSTANCE.config.portableGridOpenUsage);
// If there is no disk onContentsChanged isn't called and the update isn't sent, thus items from the previous grid view would remain clientside
if (!player.getEntityWorld().isRemote && disk.getStackInSlot(0).isEmpty()) {
cache.invalidate();
}
} }
public ItemStack getStack() { public ItemStack getStack() {
@@ -150,13 +172,14 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
} }
@Override @Override
public StorageCacheItemPortable getCache() { @Nullable
public IStorageCache getCache() {
return cache; return cache;
} }
@Override @Override
@Nullable @Nullable
public IStorageDisk<ItemStack> getStorage() { public IStorageDisk getStorage() {
return storage; return storage;
} }
@@ -187,7 +210,7 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
@Override @Override
public GridType getGridType() { public GridType getGridType() {
return GridType.NORMAL; return (getDisk().getStackInSlot(0).isEmpty() || ((IStorageDiskProvider) getDisk().getStackInSlot(0).getItem()).getType() == StorageType.ITEM) ? GridType.NORMAL : GridType.FLUID;
} }
@Nullable @Nullable
@@ -198,19 +221,19 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
@Override @Override
public IStorageCacheListener createListener(EntityPlayerMP player) { public IStorageCacheListener createListener(EntityPlayerMP player) {
return new StorageCacheListenerGridPortable(this, player); return getGridType() == GridType.FLUID ? new StorageCacheListenerGridPortableFluid(this, player) : new StorageCacheListenerGridPortable(this, player);
} }
@Nullable @Nullable
@Override @Override
public IItemGridHandler getItemHandler() { public IItemGridHandler getItemHandler() {
return handler; return itemHandler;
} }
@Nullable @Nullable
@Override @Override
public IFluidGridHandler getFluidHandler() { public IFluidGridHandler getFluidHandler() {
return null; return fluidHandler;
} }
@Override @Override
@@ -333,10 +356,15 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
} }
@Override @Override
public StorageTrackerItem getStorageTracker() { public StorageTrackerItem getItemStorageTracker() {
return storageTracker; return storageTracker;
} }
@Override
public StorageTrackerFluid getFluidStorageTracker() {
return fluidStorageTracker;
}
@Override @Override
public InventoryCrafting getCraftingMatrix() { public InventoryCrafting getCraftingMatrix() {
return null; return null;

View File

@@ -7,21 +7,18 @@ import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab; import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab;
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.*;
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
import com.raoulvdberge.refinedstorage.api.storage.IStorageCacheListener;
import com.raoulvdberge.refinedstorage.api.storage.StorageType;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskContainerContext; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskContainerContext;
import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider;
import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.api.util.IFilter;
import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.FluidGridHandlerPortable;
import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.ItemGridHandlerPortable; import com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler.ItemGridHandlerPortable;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeGrid; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeGrid;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.NetworkNodeDiskDrive; import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.NetworkNodeDiskDrive;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheItemPortable; import com.raoulvdberge.refinedstorage.apiimpl.storage.*;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageCacheListenerGridPortable; import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskFluidPortable;
import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageTrackerItem;
import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskItemPortable; import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskItemPortable;
import com.raoulvdberge.refinedstorage.block.BlockPortableGrid; import com.raoulvdberge.refinedstorage.block.BlockPortableGrid;
import com.raoulvdberge.refinedstorage.block.enums.PortableGridDiskState; import com.raoulvdberge.refinedstorage.block.enums.PortableGridDiskState;
@@ -55,6 +52,7 @@ import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.Constants;
import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.CapabilityEnergy;
import net.minecraftforge.energy.EnergyStorage; import net.minecraftforge.energy.EnergyStorage;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -64,32 +62,32 @@ import java.util.List;
public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, IRedstoneConfigurable, IStorageDiskContainerContext, IPortableGrid.IPortableGridRenderInfo { public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, IRedstoneConfigurable, IStorageDiskContainerContext, IPortableGrid.IPortableGridRenderInfo {
public static final TileDataParameter<Integer, TilePortableGrid> REDSTONE_MODE = RedstoneMode.createParameter(); public static final TileDataParameter<Integer, TilePortableGrid> REDSTONE_MODE = RedstoneMode.createParameter();
public static final TileDataParameter<Integer, TilePortableGrid> ENERGY_STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.energyStorage.getEnergyStored()); private static final TileDataParameter<Integer, TilePortableGrid> ENERGY_STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.energyStorage.getEnergyStored());
public static final TileDataParameter<Integer, TilePortableGrid> SORTING_DIRECTION = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getSortingDirection, (t, v) -> { private static final TileDataParameter<Integer, TilePortableGrid> SORTING_DIRECTION = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getSortingDirection, (t, v) -> {
if (IGrid.isValidSortingDirection(v)) { if (IGrid.isValidSortingDirection(v)) {
t.setSortingDirection(v); t.setSortingDirection(v);
t.markDirty(); t.markDirty();
} }
}, (initial, p) -> TileGrid.trySortGrid(initial)); }, (initial, p) -> TileGrid.trySortGrid(initial));
public static final TileDataParameter<Integer, TilePortableGrid> SORTING_TYPE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getSortingType, (t, v) -> { private static final TileDataParameter<Integer, TilePortableGrid> SORTING_TYPE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getSortingType, (t, v) -> {
if (IGrid.isValidSortingType(v)) { if (IGrid.isValidSortingType(v)) {
t.setSortingType(v); t.setSortingType(v);
t.markDirty(); t.markDirty();
} }
}, (initial, p) -> TileGrid.trySortGrid(initial)); }, (initial, p) -> TileGrid.trySortGrid(initial));
public static final TileDataParameter<Integer, TilePortableGrid> SEARCH_BOX_MODE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getSearchBoxMode, (t, v) -> { private static final TileDataParameter<Integer, TilePortableGrid> SEARCH_BOX_MODE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getSearchBoxMode, (t, v) -> {
if (IGrid.isValidSearchBoxMode(v)) { if (IGrid.isValidSearchBoxMode(v)) {
t.setSearchBoxMode(v); t.setSearchBoxMode(v);
t.markDirty(); t.markDirty();
} }
}, (initial, p) -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getSearchField().setMode(p))); }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getSearchField().setMode(p)));
public static final TileDataParameter<Integer, TilePortableGrid> SIZE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getSize, (t, v) -> { private static final TileDataParameter<Integer, TilePortableGrid> SIZE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getSize, (t, v) -> {
if (IGrid.isValidSize(v)) { if (IGrid.isValidSize(v)) {
t.setSize(v); t.setSize(v);
t.markDirty(); t.markDirty();
} }
}, (initial, p) -> GuiBase.executeLater(GuiGrid.class, GuiBase::initGui)); }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, GuiBase::initGui));
public static final TileDataParameter<Integer, TilePortableGrid> TAB_SELECTED = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabSelected, (t, v) -> { private static final TileDataParameter<Integer, TilePortableGrid> TAB_SELECTED = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabSelected, (t, v) -> {
t.setTabSelected(v == t.getTabSelected() ? -1 : v); t.setTabSelected(v == t.getTabSelected() ? -1 : v);
t.markDirty(); t.markDirty();
}, (initial, p) -> { }, (initial, p) -> {
@@ -97,7 +95,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort()); GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort());
} }
}); });
public static final TileDataParameter<Integer, TilePortableGrid> TAB_PAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabPage, (t, v) -> { private static final TileDataParameter<Integer, TilePortableGrid> TAB_PAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabPage, (t, v) -> {
if (v >= 0 && v <= t.getTotalTabPages()) { if (v >= 0 && v <= t.getTotalTabPages()) {
t.setTabPage(v); t.setTabPage(v);
t.markDirty(); t.markDirty();
@@ -108,6 +106,8 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
private static final String NBT_DISK_STATE = "DiskState"; private static final String NBT_DISK_STATE = "DiskState";
private static final String NBT_CONNECTED = "Connected"; private static final String NBT_CONNECTED = "Connected";
private static final String NBT_STORAGE_TRACKER = "StorageTracker"; private static final String NBT_STORAGE_TRACKER = "StorageTracker";
private static final String NBT_FLUID_STORAGE_TRACKER = "FluidStorageTracker";
private static final String NBT_TYPE = "Type";
private EnergyStorage energyStorage = recreateEnergyStorage(0); private EnergyStorage energyStorage = recreateEnergyStorage(0);
private PortableGridType type; private PortableGridType type;
@@ -121,10 +121,12 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
private int tabPage; private int tabPage;
private int size; private int size;
private GridType clientGridType;
private List<IFilter> filters = new ArrayList<>(); private List<IFilter> filters = new ArrayList<>();
private List<IGridTab> tabs = new ArrayList<>(); private List<IGridTab> tabs = new ArrayList<>();
private ItemHandlerFilter filter = new ItemHandlerFilter(filters, tabs, new ListenerTile(this)); private ItemHandlerFilter filter = new ItemHandlerFilter(filters, tabs, new ListenerTile(this));
private ItemHandlerBase disk = new ItemHandlerBase(1, new ListenerTile(this), s -> NetworkNodeDiskDrive.VALIDATOR_STORAGE_DISK.test(s) && ((IStorageDiskProvider) s.getItem()).getType() == StorageType.ITEM) { private ItemHandlerBase disk = new ItemHandlerBase(1, new ListenerTile(this), NetworkNodeDiskDrive.VALIDATOR_STORAGE_DISK) {
@Override @Override
protected void onContentsChanged(int slot) { protected void onContentsChanged(int slot) {
super.onContentsChanged(slot); super.onContentsChanged(slot);
@@ -136,14 +138,17 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
}; };
@Nullable @Nullable
private IStorageDisk<ItemStack> storage; private IStorageDisk storage;
@Nullable
private IStorageCache cache;
private StorageCacheItemPortable cache = new StorageCacheItemPortable(this); private ItemGridHandlerPortable itemHandler = new ItemGridHandlerPortable(this, this);
private ItemGridHandlerPortable handler = new ItemGridHandlerPortable(this, this); private FluidGridHandlerPortable fluidHandler = new FluidGridHandlerPortable(this);
private PortableGridDiskState diskState = PortableGridDiskState.NONE; private PortableGridDiskState diskState = PortableGridDiskState.NONE;
private boolean connected; private boolean connected;
private StorageTrackerItem storageTracker = new StorageTrackerItem(this::markDirty); private StorageTrackerItem storageTracker = new StorageTrackerItem(this::markDirty);
private StorageTrackerFluid fluidStorageTracker = new StorageTrackerFluid(this::markDirty);
public TilePortableGrid() { public TilePortableGrid() {
dataManager.addWatchedParameter(REDSTONE_MODE); dataManager.addWatchedParameter(REDSTONE_MODE);
@@ -161,20 +166,38 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
if (diskStack.isEmpty()) { if (diskStack.isEmpty()) {
this.storage = null; this.storage = null;
this.cache = null;
} else { } else {
IStorageDisk disk = API.instance().getStorageDiskManager(world).getByStack(getDisk().getStackInSlot(0)); IStorageDisk disk = API.instance().getStorageDiskManager(world).getByStack(getDisk().getStackInSlot(0));
if (disk != null) { if (disk != null) {
StorageType type = ((IStorageDiskProvider) getDisk().getStackInSlot(0).getItem()).getType();
switch (type) {
case ITEM:
this.storage = new StorageDiskItemPortable(disk, this); this.storage = new StorageDiskItemPortable(disk, this);
this.cache = new StorageCacheItemPortable(this);
break;
case FLUID:
this.storage = new StorageDiskFluidPortable(disk, this);
this.cache = new StorageCacheFluidPortable(this);
break;
}
this.storage.setSettings(TilePortableGrid.this::checkIfDiskStateChanged, TilePortableGrid.this); this.storage.setSettings(TilePortableGrid.this::checkIfDiskStateChanged, TilePortableGrid.this);
} else { } else {
this.storage = null; this.storage = null;
this.cache = null;
} }
} }
this.cache.invalidate(); if (cache != null) {
cache.invalidate();
}
this.checkIfDiskStateChanged(); checkIfDiskStateChanged();
WorldUtils.updateBlock(world, pos);
} }
public PortableGridDiskState getDiskState() { public PortableGridDiskState getDiskState() {
@@ -188,6 +211,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
public PortableGridType getPortableType() { public PortableGridType getPortableType() {
if (type == null) { if (type == null) {
IBlockState state = world.getBlockState(pos); IBlockState state = world.getBlockState(pos);
if (state.getBlock() == RSBlocks.PORTABLE_GRID) { if (state.getBlock() == RSBlocks.PORTABLE_GRID) {
this.type = (PortableGridType) state.getValue(BlockPortableGrid.TYPE); this.type = (PortableGridType) state.getValue(BlockPortableGrid.TYPE);
} }
@@ -218,6 +242,10 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
if (stack.getTagCompound().hasKey(PortableGrid.NBT_STORAGE_TRACKER)) { if (stack.getTagCompound().hasKey(PortableGrid.NBT_STORAGE_TRACKER)) {
storageTracker.readFromNbt(stack.getTagCompound().getTagList(PortableGrid.NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); storageTracker.readFromNbt(stack.getTagCompound().getTagList(PortableGrid.NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND));
} }
if (stack.getTagCompound().hasKey(PortableGrid.NBT_FLUID_STORAGE_TRACKER)) {
fluidStorageTracker.readFromNbt(stack.getTagCompound().getTagList(PortableGrid.NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND));
}
} }
this.diskState = getDiskState(this); this.diskState = getDiskState(this);
@@ -242,6 +270,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
stack.getTagCompound().setInteger(NetworkNodeGrid.NBT_TAB_PAGE, tabPage); stack.getTagCompound().setInteger(NetworkNodeGrid.NBT_TAB_PAGE, tabPage);
stack.getTagCompound().setTag(PortableGrid.NBT_STORAGE_TRACKER, storageTracker.serializeNbt()); stack.getTagCompound().setTag(PortableGrid.NBT_STORAGE_TRACKER, storageTracker.serializeNbt());
stack.getTagCompound().setTag(PortableGrid.NBT_FLUID_STORAGE_TRACKER, fluidStorageTracker.serializeNbt());
stack.getCapability(CapabilityEnergy.ENERGY, null).receiveEnergy(energyStorage.getEnergyStored(), false); stack.getCapability(CapabilityEnergy.ENERGY, null).receiveEnergy(energyStorage.getEnergyStored(), false);
@@ -258,7 +287,11 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
@Override @Override
public GridType getGridType() { public GridType getGridType() {
return GridType.NORMAL; return clientGridType != null ? clientGridType : getServerGridType();
}
private GridType getServerGridType() {
return (getDisk().getStackInSlot(0).isEmpty() || ((IStorageDiskProvider) getDisk().getStackInSlot(0).getItem()).getType() == StorageType.ITEM) ? GridType.NORMAL : GridType.FLUID;
} }
@Nullable @Nullable
@@ -269,19 +302,19 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
@Override @Override
public IStorageCacheListener createListener(EntityPlayerMP player) { public IStorageCacheListener createListener(EntityPlayerMP player) {
return new StorageCacheListenerGridPortable(this, player); return getServerGridType() == GridType.FLUID ? new StorageCacheListenerGridPortableFluid(this, player) : new StorageCacheListenerGridPortable(this, player);
} }
@Nullable @Nullable
@Override @Override
public IItemGridHandler getItemHandler() { public IItemGridHandler getItemHandler() {
return handler; return itemHandler;
} }
@Nullable @Nullable
@Override @Override
public IFluidGridHandler getFluidHandler() { public IFluidGridHandler getFluidHandler() {
return null; return fluidHandler;
} }
@Override @Override
@@ -406,10 +439,15 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
} }
@Override @Override
public StorageTrackerItem getStorageTracker() { public IStorageTracker<ItemStack> getItemStorageTracker() {
return storageTracker; return storageTracker;
} }
@Override
public IStorageTracker<FluidStack> getFluidStorageTracker() {
return fluidStorageTracker;
}
@Override @Override
public InventoryCrafting getCraftingMatrix() { public InventoryCrafting getCraftingMatrix() {
return null; return null;
@@ -463,13 +501,14 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
} }
@Override @Override
public IStorageCache<ItemStack> getCache() { @Nullable
public IStorageCache getCache() {
return cache; return cache;
} }
@Override @Override
@Nullable @Nullable
public IStorageDisk<ItemStack> getStorage() { public IStorageDisk getStorage() {
return storage; return storage;
} }
@@ -552,6 +591,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
redstoneMode.write(tag); redstoneMode.write(tag);
tag.setTag(NBT_STORAGE_TRACKER, storageTracker.serializeNbt()); tag.setTag(NBT_STORAGE_TRACKER, storageTracker.serializeNbt());
tag.setTag(NBT_FLUID_STORAGE_TRACKER, fluidStorageTracker.serializeNbt());
return tag; return tag;
} }
@@ -596,6 +636,10 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
if (tag.hasKey(NBT_STORAGE_TRACKER)) { if (tag.hasKey(NBT_STORAGE_TRACKER)) {
storageTracker.readFromNbt(tag.getTagList(NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); storageTracker.readFromNbt(tag.getTagList(NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND));
} }
if (tag.hasKey(NBT_FLUID_STORAGE_TRACKER)) {
fluidStorageTracker.readFromNbt(tag.getTagList(NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND));
}
} }
@Override @Override
@@ -612,6 +656,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
public NBTTagCompound writeUpdate(NBTTagCompound tag) { public NBTTagCompound writeUpdate(NBTTagCompound tag) {
tag.setInteger(NBT_DISK_STATE, diskState.getId()); tag.setInteger(NBT_DISK_STATE, diskState.getId());
tag.setBoolean(NBT_CONNECTED, getEnergy() != 0); tag.setBoolean(NBT_CONNECTED, getEnergy() != 0);
tag.setInteger(NBT_TYPE, getServerGridType().ordinal());
return super.writeUpdate(tag); return super.writeUpdate(tag);
} }
@@ -622,6 +667,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
diskState = PortableGridDiskState.getById(tag.getInteger(NBT_DISK_STATE)); diskState = PortableGridDiskState.getById(tag.getInteger(NBT_DISK_STATE));
connected = tag.getBoolean(NBT_CONNECTED); connected = tag.getBoolean(NBT_CONNECTED);
clientGridType = GridType.values()[tag.getInteger(NBT_TYPE)];
} }
@Override @Override