diff --git a/src/main/java/com/refinedmods/refinedstorage/api/IRSAPI.java b/src/main/java/com/refinedmods/refinedstorage/api/IRSAPI.java index 91f9e9d09..bca2a3147 100644 --- a/src/main/java/com/refinedmods/refinedstorage/api/IRSAPI.java +++ b/src/main/java/com/refinedmods/refinedstorage/api/IRSAPI.java @@ -18,6 +18,7 @@ import com.refinedmods.refinedstorage.api.storage.disk.IStorageDiskManager; import com.refinedmods.refinedstorage.api.storage.disk.IStorageDiskRegistry; import com.refinedmods.refinedstorage.api.storage.disk.IStorageDiskSync; import com.refinedmods.refinedstorage.api.storage.externalstorage.IExternalStorageProvider; +import com.refinedmods.refinedstorage.api.storage.tracker.IStorageTrackerManager; import com.refinedmods.refinedstorage.api.util.IComparer; import com.refinedmods.refinedstorage.api.util.IQuantityFormatter; import com.refinedmods.refinedstorage.api.util.IStackList; @@ -138,6 +139,12 @@ public interface IRSAPI { @Nonnull IStorageDiskSync getStorageDiskSync(); + /** + * @return the storage tracker manager + */ + @Nonnull + IStorageTrackerManager getStorageTrackerManager(ServerWorld anyWorld); + /** * Adds an external storage provider for the given storage type. * diff --git a/src/main/java/com/refinedmods/refinedstorage/api/storage/tracker/IStorageTracker.java b/src/main/java/com/refinedmods/refinedstorage/api/storage/tracker/IStorageTracker.java index b8c8bc569..66a4604ba 100644 --- a/src/main/java/com/refinedmods/refinedstorage/api/storage/tracker/IStorageTracker.java +++ b/src/main/java/com/refinedmods/refinedstorage/api/storage/tracker/IStorageTracker.java @@ -1,6 +1,7 @@ package com.refinedmods.refinedstorage.api.storage.tracker; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.ListNBT; import javax.annotation.Nullable; @@ -22,4 +23,18 @@ public interface IStorageTracker { */ @Nullable StorageTrackerEntry get(T stack); + + /** + * initialize tracker from nbt + * + * @param nbt to read from + */ + void readFromNbt(ListNBT nbt); + + /** + * write data to nbt + * + * @return data as nbt + */ + ListNBT serializeNbt(); } diff --git a/src/main/java/com/refinedmods/refinedstorage/api/storage/tracker/IStorageTrackerManager.java b/src/main/java/com/refinedmods/refinedstorage/api/storage/tracker/IStorageTrackerManager.java new file mode 100644 index 000000000..04a644f7d --- /dev/null +++ b/src/main/java/com/refinedmods/refinedstorage/api/storage/tracker/IStorageTrackerManager.java @@ -0,0 +1,27 @@ +package com.refinedmods.refinedstorage.api.storage.tracker; + +import com.refinedmods.refinedstorage.api.storage.StorageType; + +import java.util.UUID; + +public interface IStorageTrackerManager { + + /** + * Marks this manager for saving. + */ + void markForSaving(); + + /** + * get a storage tracker or create a new Storage Tracker if it doesn't exist + * + * @param itemStorageTrackerId UUID for that tracker + * @param type Storage type of that tracker + * @return StorageTracker + */ + IStorageTracker getOrCreate(UUID itemStorageTrackerId, StorageType type); + + /** + * @param id of the Storage tracker that will be removed + */ + void remove(UUID id); +} diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/API.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/API.java index cdb9a76ca..693810377 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/API.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/API.java @@ -20,6 +20,7 @@ import com.refinedmods.refinedstorage.api.storage.disk.IStorageDiskManager; import com.refinedmods.refinedstorage.api.storage.disk.IStorageDiskRegistry; import com.refinedmods.refinedstorage.api.storage.disk.IStorageDiskSync; import com.refinedmods.refinedstorage.api.storage.externalstorage.IExternalStorageProvider; +import com.refinedmods.refinedstorage.api.storage.tracker.IStorageTrackerManager; import com.refinedmods.refinedstorage.api.util.IComparer; import com.refinedmods.refinedstorage.api.util.IQuantityFormatter; import com.refinedmods.refinedstorage.api.util.IStackList; @@ -34,6 +35,7 @@ import com.refinedmods.refinedstorage.apiimpl.network.NetworkNodeRegistry; import com.refinedmods.refinedstorage.apiimpl.network.grid.CraftingGridBehavior; import com.refinedmods.refinedstorage.apiimpl.network.grid.GridManager; import com.refinedmods.refinedstorage.apiimpl.storage.disk.*; +import com.refinedmods.refinedstorage.apiimpl.storage.tracker.StorageTrackerManager; import com.refinedmods.refinedstorage.apiimpl.util.Comparer; import com.refinedmods.refinedstorage.apiimpl.util.FluidStackList; import com.refinedmods.refinedstorage.apiimpl.util.ItemStackList; @@ -204,6 +206,14 @@ public class API implements IRSAPI { return storageDiskSync; } + @Nonnull + @Override + public IStorageTrackerManager getStorageTrackerManager(ServerWorld anyWorld) { + ServerWorld world = anyWorld.getServer().func_241755_D_(); // Get the overworld + + return world.getSavedData().getOrCreate(() -> new StorageTrackerManager(StorageTrackerManager.NAME), StorageTrackerManager.NAME); + } + @Override public void addExternalStorageProvider(StorageType type, IExternalStorageProvider provider) { externalStorageProviders.computeIfAbsent(type, k -> new TreeSet<>((a, b) -> Integer.compare(b.getPriority(), a.getPriority()))).add(provider); diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/Network.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/Network.java index 18d3212f1..8365665a9 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/Network.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/Network.java @@ -13,6 +13,7 @@ import com.refinedmods.refinedstorage.api.network.item.INetworkItemManager; import com.refinedmods.refinedstorage.api.network.security.ISecurityManager; import com.refinedmods.refinedstorage.api.storage.AccessType; import com.refinedmods.refinedstorage.api.storage.IStorage; +import com.refinedmods.refinedstorage.api.storage.StorageType; import com.refinedmods.refinedstorage.api.storage.cache.IStorageCache; import com.refinedmods.refinedstorage.api.storage.externalstorage.IExternalStorage; import com.refinedmods.refinedstorage.api.storage.tracker.IStorageTracker; @@ -50,6 +51,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.annotation.Nonnull; +import java.util.UUID; import java.util.function.Predicate; public class Network implements INetwork, IRedstoneConfigurable { @@ -57,8 +59,10 @@ public class Network implements INetwork, IRedstoneConfigurable { private static final int THROTTLE_ACTIVE_TO_INACTIVE = 4; private static final String NBT_ENERGY = "Energy"; - private static final String NBT_ITEM_STORAGE_TRACKER = "ItemStorageTracker"; - private static final String NBT_FLUID_STORAGE_TRACKER = "FluidStorageTracker"; + private static final String NBT_ITEM_STORAGE_TRACKER = "ItemStorageTracker"; //TODO: remove next version + private static final String NBT_ITEM_STORAGE_TRACKER_ID = "ItemStorageTrackerId"; + private static final String NBT_FLUID_STORAGE_TRACKER = "FluidStorageTracker"; //TODO: remove next version + private static final String NBT_FLUID_STORAGE_TRACKER_ID = "FluidStorageTrackerId"; private static final Logger LOGGER = LogManager.getLogger(Network.class); @@ -69,12 +73,16 @@ public class Network implements INetwork, IRedstoneConfigurable { private final ICraftingManager craftingManager = new CraftingManager(this); private final ISecurityManager securityManager = new SecurityManager(this); private final IStorageCache itemStorage = new ItemStorageCache(this); - private final ItemStorageTracker itemStorageTracker = new ItemStorageTracker(this::markDirty); private final IStorageCache fluidStorage = new FluidStorageCache(this); - private final FluidStorageTracker fluidStorageTracker = new FluidStorageTracker(this::markDirty); private final BaseEnergyStorage energy = new BaseEnergyStorage(RS.SERVER_CONFIG.getController().getCapacity(), RS.SERVER_CONFIG.getController().getMaxTransfer(), 0); private final RootNetworkNode root; + + private ItemStorageTracker itemStorageTracker; + private UUID itemStorageTrackerId; + private FluidStorageTracker fluidStorageTracker; + private UUID fluidStorageTrackerId; + private final BlockPos pos; private final World world; private final NetworkType type; @@ -228,6 +236,8 @@ public class Network implements INetwork, IRedstoneConfigurable { } nodeGraph.disconnectAll(); + API.instance().getStorageTrackerManager((ServerWorld) getWorld()).remove(itemStorageTrackerId); + API.instance().getStorageTrackerManager((ServerWorld) getWorld()).remove(fluidStorageTrackerId); } @Override @@ -456,11 +466,27 @@ public class Network implements INetwork, IRedstoneConfigurable { @Override public IStorageTracker getItemStorageTracker() { + if (itemStorageTracker == null) { + if (itemStorageTrackerId == null) { + this.itemStorageTrackerId = UUID.randomUUID(); + } + + this.itemStorageTracker = (ItemStorageTracker) API.instance().getStorageTrackerManager((ServerWorld) world).getOrCreate(itemStorageTrackerId, StorageType.ITEM); + } + return itemStorageTracker; } @Override public IStorageTracker getFluidStorageTracker() { + if (fluidStorageTracker == null) { + if (fluidStorageTrackerId == null) { + this.fluidStorageTrackerId = UUID.randomUUID(); + } + + this.fluidStorageTracker = (FluidStorageTracker) API.instance().getStorageTrackerManager((ServerWorld) world).getOrCreate(fluidStorageTrackerId, StorageType.FLUID); + } + return fluidStorageTracker; } @@ -479,12 +505,20 @@ public class Network implements INetwork, IRedstoneConfigurable { craftingManager.readFromNbt(tag); - if (tag.contains(NBT_ITEM_STORAGE_TRACKER)) { - itemStorageTracker.readFromNbt(tag.getList(NBT_ITEM_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + if (tag.contains(NBT_ITEM_STORAGE_TRACKER_ID)) { + this.itemStorageTrackerId = tag.getUniqueId(NBT_ITEM_STORAGE_TRACKER_ID); + } else { + if (tag.contains(NBT_ITEM_STORAGE_TRACKER)) { //TODO: remove next version + getItemStorageTracker().readFromNbt(tag.getList(NBT_ITEM_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + } } - if (tag.contains(NBT_FLUID_STORAGE_TRACKER)) { - fluidStorageTracker.readFromNbt(tag.getList(NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + if (tag.contains(NBT_FLUID_STORAGE_TRACKER_ID)) { + this.fluidStorageTrackerId = tag.getUniqueId(NBT_FLUID_STORAGE_TRACKER_ID); + } else { + if (tag.contains(NBT_FLUID_STORAGE_TRACKER)) { //TODO: remove next version + getFluidStorageTracker().readFromNbt(tag.getList(NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + } } return this; @@ -497,9 +531,13 @@ public class Network implements INetwork, IRedstoneConfigurable { redstoneMode.write(tag); craftingManager.writeToNbt(tag); + if (itemStorageTrackerId != null) { + tag.putUniqueId(NBT_ITEM_STORAGE_TRACKER_ID, itemStorageTrackerId); + } - tag.put(NBT_ITEM_STORAGE_TRACKER, itemStorageTracker.serializeNbt()); - tag.put(NBT_FLUID_STORAGE_TRACKER, fluidStorageTracker.serializeNbt()); + if (fluidStorageTrackerId != null) { + tag.putUniqueId(NBT_FLUID_STORAGE_TRACKER_ID, fluidStorageTrackerId); + } return tag; } diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/tracker/FluidStorageTracker.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/tracker/FluidStorageTracker.java index 6857696be..4122a3d37 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/tracker/FluidStorageTracker.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/tracker/FluidStorageTracker.java @@ -36,6 +36,7 @@ public class FluidStorageTracker implements IStorageTracker { return changes.get(new Key(stack)); } + @Override public void readFromNbt(ListNBT list) { for (int i = 0; i < list.size(); ++i) { CompoundNBT tag = list.getCompound(i); @@ -48,6 +49,7 @@ public class FluidStorageTracker implements IStorageTracker { } } + @Override public ListNBT serializeNbt() { ListNBT list = new ListNBT(); diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/tracker/ItemStorageTracker.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/tracker/ItemStorageTracker.java index 18fc55b60..464d27155 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/tracker/ItemStorageTracker.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/tracker/ItemStorageTracker.java @@ -36,6 +36,7 @@ public class ItemStorageTracker implements IStorageTracker { return changes.get(new ItemStackKey(stack)); } + @Override public void readFromNbt(ListNBT list) { for (int i = 0; i < list.size(); ++i) { CompoundNBT tag = list.getCompound(i); @@ -48,6 +49,7 @@ public class ItemStorageTracker implements IStorageTracker { } } + @Override public ListNBT serializeNbt() { ListNBT list = new ListNBT(); diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/tracker/StorageTrackerManager.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/tracker/StorageTrackerManager.java new file mode 100644 index 000000000..632d92d78 --- /dev/null +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/tracker/StorageTrackerManager.java @@ -0,0 +1,93 @@ +package com.refinedmods.refinedstorage.apiimpl.storage.tracker; + +import com.refinedmods.refinedstorage.api.storage.StorageType; +import com.refinedmods.refinedstorage.api.storage.tracker.IStorageTracker; +import com.refinedmods.refinedstorage.api.storage.tracker.IStorageTrackerManager; +import com.refinedmods.refinedstorage.apiimpl.util.RSWorldSavedData; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraftforge.common.util.Constants; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class StorageTrackerManager extends RSWorldSavedData implements IStorageTrackerManager { + public static final String NAME = "refinedstorage_tracker"; + + private static final String NBT_TRACKERS = "Tracker"; + private static final String NBT_TRACKER_ID = "Id"; + private static final String NBT_TRACKER_DATA = "Data"; + private static final String NBT_TRACKER_TYPE = "Type"; + + private final Map> trackers = new HashMap<>(); + + public StorageTrackerManager(String name) { + super(name); + } + + @Override + public void markForSaving() { + this.markDirty(); + } + + + @Override + public IStorageTracker getOrCreate(UUID uuid, StorageType type) { + IStorageTracker tracker = trackers.get(uuid); + + if (tracker == null) { + if (type == StorageType.ITEM) { + tracker = new ItemStorageTracker(this::markForSaving); + } else if (type == StorageType.FLUID) { + tracker = new FluidStorageTracker(this::markForSaving); + } + + trackers.put(uuid, tracker); + } + + return tracker; + } + + @Override + public void remove(UUID id) { + trackers.remove(id); + } + + @Override + public void read(CompoundNBT nbt) { + if (nbt.contains(NBT_TRACKERS)) { + ListNBT trackerTags = nbt.getList(NBT_TRACKERS, Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < trackerTags.size(); ++i) { + CompoundNBT trackerTag = trackerTags.getCompound(i); + + UUID id = trackerTag.getUniqueId(NBT_TRACKER_ID); + ListNBT data = trackerTag.getList(NBT_TRACKER_DATA, Constants.NBT.TAG_COMPOUND); + StorageType type = StorageType.values()[trackerTag.getInt(NBT_TRACKER_TYPE)]; + + IStorageTracker tracker = getOrCreate(id, type); + tracker.readFromNbt(data); + } + } + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + ListNBT trackerListTag = new ListNBT(); + + for (Map.Entry> entry : trackers.entrySet()) { + CompoundNBT trackerTag = new CompoundNBT(); + + trackerTag.putUniqueId(NBT_TRACKER_ID, entry.getKey()); + trackerTag.put(NBT_TRACKER_DATA, entry.getValue().serializeNbt()); + trackerTag.putInt(NBT_TRACKER_TYPE, entry.getValue() instanceof ItemStorageTracker ? StorageType.ITEM.ordinal() : StorageType.FLUID.ordinal()); + + trackerListTag.add(trackerTag); + } + + compound.put(NBT_TRACKERS, trackerListTag); + + return compound; + } +} diff --git a/src/main/java/com/refinedmods/refinedstorage/tile/grid/portable/PortableGrid.java b/src/main/java/com/refinedmods/refinedstorage/tile/grid/portable/PortableGrid.java index 58b66050a..a4fd6be52 100644 --- a/src/main/java/com/refinedmods/refinedstorage/tile/grid/portable/PortableGrid.java +++ b/src/main/java/com/refinedmods/refinedstorage/tile/grid/portable/PortableGrid.java @@ -60,8 +60,10 @@ import java.util.List; import java.util.UUID; public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainerContext { - static final String NBT_STORAGE_TRACKER = "StorageTracker"; - static final String NBT_FLUID_STORAGE_TRACKER = "FluidStorageTracker"; + static final String NBT_STORAGE_TRACKER = "StorageTracker"; //TODO: remove next version + static final String NBT_ITEM_STORAGE_TRACKER_ID = "ItemStorageTrackerId"; + static final String NBT_FLUID_STORAGE_TRACKER = "FluidStorageTracker"; // TODO: remove next version + static final String NBT_FLUID_STORAGE_TRACKER_ID = "FluidStorageTrackerId"; @Nullable private IStorageDisk storage; @@ -83,8 +85,10 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer private int tabPage; private int size; - private final ItemStorageTracker storageTracker = new ItemStorageTracker(() -> stack.getTag().put(NBT_STORAGE_TRACKER, getItemStorageTracker().serializeNbt())); - private final FluidStorageTracker fluidStorageTracker = new FluidStorageTracker(() -> stack.getTag().put(NBT_FLUID_STORAGE_TRACKER, getFluidStorageTracker().serializeNbt())); + private ItemStorageTracker itemStorageTracker; + private UUID itemStorageTrackerId; + private FluidStorageTracker fluidStorageTracker; + private UUID fluidStorageTrackerId; private final List filters = new ArrayList<>(); private final List tabs = new ArrayList<>(); @@ -151,14 +155,32 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer if (!stack.hasTag()) { stack.setTag(new CompoundNBT()); } + if (player != null) { //baked model does not need a storage tracker + if (stack.getTag().contains(NBT_ITEM_STORAGE_TRACKER_ID)) { + itemStorageTrackerId = stack.getTag().getUniqueId(NBT_ITEM_STORAGE_TRACKER_ID); + } else { + if (stack.getTag().contains(NBT_STORAGE_TRACKER)) { //TODO: remove next version + getItemStorageTracker().readFromNbt(stack.getTag().getList(NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + } - if (stack.getTag().contains(NBT_STORAGE_TRACKER)) { - storageTracker.readFromNbt(stack.getTag().getList(NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + UUID id = UUID.randomUUID(); + stack.getTag().putUniqueId(NBT_ITEM_STORAGE_TRACKER_ID, id); + itemStorageTrackerId = id; + } + + if (stack.getTag().contains(NBT_FLUID_STORAGE_TRACKER_ID)) { + fluidStorageTrackerId = stack.getTag().getUniqueId(NBT_FLUID_STORAGE_TRACKER_ID); + } else { + if (stack.getTag().contains(NBT_FLUID_STORAGE_TRACKER)) { //TODO: remove next version + getFluidStorageTracker().readFromNbt(stack.getTag().getList(NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + } + + UUID id = UUID.randomUUID(); + stack.getTag().putUniqueId(NBT_FLUID_STORAGE_TRACKER_ID, id); + fluidStorageTrackerId = id; + } } - if (stack.getTag().contains(NBT_FLUID_STORAGE_TRACKER)) { - fluidStorageTracker.readFromNbt(stack.getTag().getList(NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); - } StackUtils.readItems(disk, 4, stack.getTag()); StackUtils.readItems(filter, 0, stack.getTag()); @@ -369,11 +391,31 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer @Override public ItemStorageTracker getItemStorageTracker() { - return storageTracker; + if (itemStorageTracker == null) { + if (player != null) { + if (itemStorageTrackerId == null) { + this.itemStorageTrackerId = UUID.randomUUID(); + } + + this.itemStorageTracker = (ItemStorageTracker) API.instance().getStorageTrackerManager((ServerWorld) player.world).getOrCreate(itemStorageTrackerId, StorageType.ITEM); + } + } + + return itemStorageTracker; } @Override public FluidStorageTracker getFluidStorageTracker() { + if (fluidStorageTracker == null) { + if (player != null) { + if (fluidStorageTrackerId == null) { + this.fluidStorageTrackerId = UUID.randomUUID(); + } + + this.fluidStorageTracker = (FluidStorageTracker) API.instance().getStorageTrackerManager((ServerWorld) player.world).getOrCreate(fluidStorageTrackerId, StorageType.FLUID); + } + } + return fluidStorageTracker; } diff --git a/src/main/java/com/refinedmods/refinedstorage/tile/grid/portable/PortableGridTile.java b/src/main/java/com/refinedmods/refinedstorage/tile/grid/portable/PortableGridTile.java index ff84b1223..0c10171ea 100644 --- a/src/main/java/com/refinedmods/refinedstorage/tile/grid/portable/PortableGridTile.java +++ b/src/main/java/com/refinedmods/refinedstorage/tile/grid/portable/PortableGridTile.java @@ -76,6 +76,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.UUID; public class PortableGridTile extends BaseTile implements ITickableTileEntity, IGrid, IPortableGrid, IRedstoneConfigurable, IStorageDiskContainerContext { public static final TileDataParameter REDSTONE_MODE = RedstoneMode.createParameter(); @@ -114,8 +115,10 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I } }); - private static final String NBT_STORAGE_TRACKER = "StorageTracker"; - private static final String NBT_FLUID_STORAGE_TRACKER = "FluidStorageTracker"; + private static final String NBT_STORAGE_TRACKER = "StorageTracker"; //TODO: remove next version + private static final String NBT_ITEM_STORAGE_TRACKER_ID = "ItemStorageTrackerId"; + private static final String NBT_FLUID_STORAGE_TRACKER = "FluidStorageTracker"; //TODO: remove next version + private static final String NBT_FLUID_STORAGE_TRACKER_ID = "FluidStorageTrackerId"; private static final String NBT_TYPE = "Type"; private static final String NBT_ENERGY = "Energy"; private static final String NBT_ENCHANTMENTS = "Enchantments"; // @Volatile: Minecraft specific nbt key, see EnchantmentHelper @@ -166,8 +169,10 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I private PortableGridDiskState diskState = PortableGridDiskState.NONE; private boolean active; - private final ItemStorageTracker storageTracker = new ItemStorageTracker(this::markDirty); - private final FluidStorageTracker fluidStorageTracker = new FluidStorageTracker(this::markDirty); + private ItemStorageTracker itemStorageTracker; + private UUID itemStorageTrackerId; + private FluidStorageTracker fluidStorageTracker; + private UUID fluidStorageTrackerId; private ListNBT enchants = null; @@ -246,13 +251,20 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I StackUtils.readItems(disk, 4, stack.getTag()); this.redstoneMode = RedstoneMode.read(stack.getTag()); - - if (stack.getTag().contains(PortableGrid.NBT_STORAGE_TRACKER)) { - storageTracker.readFromNbt(stack.getTag().getList(PortableGrid.NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + if (stack.getTag().contains(PortableGrid.NBT_ITEM_STORAGE_TRACKER_ID)) { + itemStorageTrackerId = stack.getTag().getUniqueId(NBT_ITEM_STORAGE_TRACKER_ID); + } else { + if (stack.getTag().contains(PortableGrid.NBT_STORAGE_TRACKER)) { //TODO: remove next version + getItemStorageTracker().readFromNbt(stack.getTag().getList(PortableGrid.NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + } } - if (stack.getTag().contains(PortableGrid.NBT_FLUID_STORAGE_TRACKER)) { - fluidStorageTracker.readFromNbt(stack.getTag().getList(PortableGrid.NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + if (stack.getTag().contains(PortableGrid.NBT_FLUID_STORAGE_TRACKER_ID)) { + fluidStorageTrackerId = stack.getTag().getUniqueId(NBT_FLUID_STORAGE_TRACKER_ID); + } else { + if (stack.getTag().contains(PortableGrid.NBT_FLUID_STORAGE_TRACKER)) { //TODO: remove next version + getFluidStorageTracker().readFromNbt(stack.getTag().getList(PortableGrid.NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + } } if (stack.getTag().contains(NBT_ENCHANTMENTS)) { @@ -273,8 +285,12 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I stack.getTag().putInt(GridNetworkNode.NBT_TAB_SELECTED, tabSelected); stack.getTag().putInt(GridNetworkNode.NBT_TAB_PAGE, tabPage); - stack.getTag().put(PortableGrid.NBT_STORAGE_TRACKER, storageTracker.serializeNbt()); - stack.getTag().put(PortableGrid.NBT_FLUID_STORAGE_TRACKER, fluidStorageTracker.serializeNbt()); + if (itemStorageTrackerId != null) { + stack.getTag().putUniqueId(PortableGrid.NBT_ITEM_STORAGE_TRACKER_ID, itemStorageTrackerId); + } + if (fluidStorageTrackerId != null) { + stack.getTag().putUniqueId(PortableGrid.NBT_FLUID_STORAGE_TRACKER_ID, fluidStorageTrackerId); + } if (enchants != null) { stack.getTag().put(NBT_ENCHANTMENTS, enchants); @@ -465,11 +481,27 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I @Override public IStorageTracker getItemStorageTracker() { - return storageTracker; + if (itemStorageTracker == null) { + if (itemStorageTrackerId == null) { + this.itemStorageTrackerId = UUID.randomUUID(); + } + + this.itemStorageTracker = (ItemStorageTracker) API.instance().getStorageTrackerManager((ServerWorld) world).getOrCreate(itemStorageTrackerId, StorageType.ITEM); + } + + return itemStorageTracker; } @Override public IStorageTracker getFluidStorageTracker() { + if (fluidStorageTracker == null) { + if (fluidStorageTrackerId == null) { + this.fluidStorageTrackerId = UUID.randomUUID(); + } + + this.fluidStorageTracker = (FluidStorageTracker) API.instance().getStorageTrackerManager((ServerWorld) world).getOrCreate(fluidStorageTrackerId, StorageType.FLUID); + } + return fluidStorageTracker; } @@ -642,8 +674,12 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I redstoneMode.write(tag); - tag.put(NBT_STORAGE_TRACKER, storageTracker.serializeNbt()); - tag.put(NBT_FLUID_STORAGE_TRACKER, fluidStorageTracker.serializeNbt()); + if (itemStorageTrackerId != null) { + tag.putUniqueId(NBT_ITEM_STORAGE_TRACKER_ID, itemStorageTrackerId); + } + if (fluidStorageTrackerId != null) { + tag.putUniqueId(NBT_FLUID_STORAGE_TRACKER_ID, fluidStorageTrackerId); + } if (enchants != null) { tag.put(NBT_ENCHANTMENTS, enchants); @@ -689,12 +725,20 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I redstoneMode = RedstoneMode.read(tag); - if (tag.contains(NBT_STORAGE_TRACKER)) { - storageTracker.readFromNbt(tag.getList(NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + if (tag.contains(NBT_ITEM_STORAGE_TRACKER_ID)) { + itemStorageTrackerId = tag.getUniqueId(NBT_ITEM_STORAGE_TRACKER_ID); + } else { + if (tag.contains(NBT_STORAGE_TRACKER)) { //TODO: remove next version + getItemStorageTracker().readFromNbt(tag.getList(NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + } } - if (tag.contains(NBT_FLUID_STORAGE_TRACKER)) { - fluidStorageTracker.readFromNbt(tag.getList(NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + if (tag.contains(NBT_FLUID_STORAGE_TRACKER_ID)) { + fluidStorageTrackerId = tag.getUniqueId(NBT_FLUID_STORAGE_TRACKER_ID); + } else { + if (tag.contains(NBT_FLUID_STORAGE_TRACKER)) { //TODO: remove next version + getFluidStorageTracker().readFromNbt(tag.getList(NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); + } } if (tag.contains(NBT_ENCHANTMENTS)) {