move storage tracker to its own file to avoid nbt size problems

This commit is contained in:
Darkere
2021-05-12 13:49:25 +02:00
parent 57f6c2b550
commit be599ac9aa
10 changed files with 314 additions and 38 deletions

View File

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

View File

@@ -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<T> {
*/
@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();
}

View File

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

View File

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

View File

@@ -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<ItemStack> itemStorage = new ItemStorageCache(this);
private final ItemStorageTracker itemStorageTracker = new ItemStorageTracker(this::markDirty);
private final IStorageCache<FluidStack> 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<ItemStack> 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<FluidStack> 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_ITEM_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;
}

View File

@@ -36,6 +36,7 @@ public class FluidStorageTracker implements IStorageTracker<FluidStack> {
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<FluidStack> {
}
}
@Override
public ListNBT serializeNbt() {
ListNBT list = new ListNBT();

View File

@@ -36,6 +36,7 @@ public class ItemStorageTracker implements IStorageTracker<ItemStack> {
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 ItemStorageTracker implements IStorageTracker<ItemStack> {
}
}
@Override
public ListNBT serializeNbt() {
ListNBT list = new ListNBT();

View File

@@ -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<UUID, IStorageTracker<?>> 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<UUID, IStorageTracker<?>> 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;
}
}

View File

@@ -59,8 +59,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;
@@ -82,8 +84,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<IFilter> filters = new ArrayList<>();
private final List<IGridTab> tabs = new ArrayList<>();
@@ -150,15 +154,33 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
if (!stack.hasTag()) {
stack.setTag(new CompoundNBT());
}
if (stack.getTag().contains(NBT_STORAGE_TRACKER)) {
storageTracker.readFromNbt(stack.getTag().getList(NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND));
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_FLUID_STORAGE_TRACKER)) {
fluidStorageTracker.readFromNbt(stack.getTag().getList(NBT_FLUID_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;
}
}
StackUtils.readItems(disk, 4, stack.getTag());
StackUtils.readItems(filter, 0, stack.getTag());
}
@@ -368,11 +390,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;
}

View File

@@ -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<Integer, PortableGridTile> 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,8 @@ 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());
stack.getTag().putUniqueId(PortableGrid.NBT_ITEM_STORAGE_TRACKER_ID, itemStorageTrackerId);
stack.getTag().putUniqueId(PortableGrid.NBT_FLUID_STORAGE_TRACKER_ID, fluidStorageTrackerId);
if (enchants != null) {
stack.getTag().put(NBT_ENCHANTMENTS, enchants);
@@ -465,11 +477,27 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I
@Override
public IStorageTracker<ItemStack> 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<FluidStack> 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 +670,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 +721,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)) {