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.IStorageDiskRegistry;
import com.refinedmods.refinedstorage.api.storage.disk.IStorageDiskSync; import com.refinedmods.refinedstorage.api.storage.disk.IStorageDiskSync;
import com.refinedmods.refinedstorage.api.storage.externalstorage.IExternalStorageProvider; 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.IComparer;
import com.refinedmods.refinedstorage.api.util.IQuantityFormatter; import com.refinedmods.refinedstorage.api.util.IQuantityFormatter;
import com.refinedmods.refinedstorage.api.util.IStackList; import com.refinedmods.refinedstorage.api.util.IStackList;
@@ -138,6 +139,12 @@ public interface IRSAPI {
@Nonnull @Nonnull
IStorageDiskSync getStorageDiskSync(); IStorageDiskSync getStorageDiskSync();
/**
* @return the storage tracker manager
*/
@Nonnull
IStorageTrackerManager getStorageTrackerManager(ServerWorld anyWorld);
/** /**
* Adds an external storage provider for the given storage type. * Adds an external storage provider for the given storage type.
* *

View File

@@ -1,6 +1,7 @@
package com.refinedmods.refinedstorage.api.storage.tracker; package com.refinedmods.refinedstorage.api.storage.tracker;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.ListNBT;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -22,4 +23,18 @@ public interface IStorageTracker<T> {
*/ */
@Nullable @Nullable
StorageTrackerEntry get(T stack); 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.IStorageDiskRegistry;
import com.refinedmods.refinedstorage.api.storage.disk.IStorageDiskSync; import com.refinedmods.refinedstorage.api.storage.disk.IStorageDiskSync;
import com.refinedmods.refinedstorage.api.storage.externalstorage.IExternalStorageProvider; 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.IComparer;
import com.refinedmods.refinedstorage.api.util.IQuantityFormatter; import com.refinedmods.refinedstorage.api.util.IQuantityFormatter;
import com.refinedmods.refinedstorage.api.util.IStackList; 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.CraftingGridBehavior;
import com.refinedmods.refinedstorage.apiimpl.network.grid.GridManager; import com.refinedmods.refinedstorage.apiimpl.network.grid.GridManager;
import com.refinedmods.refinedstorage.apiimpl.storage.disk.*; 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.Comparer;
import com.refinedmods.refinedstorage.apiimpl.util.FluidStackList; import com.refinedmods.refinedstorage.apiimpl.util.FluidStackList;
import com.refinedmods.refinedstorage.apiimpl.util.ItemStackList; import com.refinedmods.refinedstorage.apiimpl.util.ItemStackList;
@@ -204,6 +206,14 @@ public class API implements IRSAPI {
return storageDiskSync; 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 @Override
public void addExternalStorageProvider(StorageType type, IExternalStorageProvider<?> provider) { public void addExternalStorageProvider(StorageType type, IExternalStorageProvider<?> provider) {
externalStorageProviders.computeIfAbsent(type, k -> new TreeSet<>((a, b) -> Integer.compare(b.getPriority(), a.getPriority()))).add(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.network.security.ISecurityManager;
import com.refinedmods.refinedstorage.api.storage.AccessType; import com.refinedmods.refinedstorage.api.storage.AccessType;
import com.refinedmods.refinedstorage.api.storage.IStorage; 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.cache.IStorageCache;
import com.refinedmods.refinedstorage.api.storage.externalstorage.IExternalStorage; import com.refinedmods.refinedstorage.api.storage.externalstorage.IExternalStorage;
import com.refinedmods.refinedstorage.api.storage.tracker.IStorageTracker; 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 org.apache.logging.log4j.Logger;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.UUID;
import java.util.function.Predicate; import java.util.function.Predicate;
public class Network implements INetwork, IRedstoneConfigurable { 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 int THROTTLE_ACTIVE_TO_INACTIVE = 4;
private static final String NBT_ENERGY = "Energy"; private static final String NBT_ENERGY = "Energy";
private static final String NBT_ITEM_STORAGE_TRACKER = "ItemStorageTracker"; private static final String NBT_ITEM_STORAGE_TRACKER = "ItemStorageTracker"; //TODO: remove next version
private static final String NBT_FLUID_STORAGE_TRACKER = "FluidStorageTracker"; 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); 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 ICraftingManager craftingManager = new CraftingManager(this);
private final ISecurityManager securityManager = new SecurityManager(this); private final ISecurityManager securityManager = new SecurityManager(this);
private final IStorageCache<ItemStack> itemStorage = new ItemStorageCache(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 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 BaseEnergyStorage energy = new BaseEnergyStorage(RS.SERVER_CONFIG.getController().getCapacity(), RS.SERVER_CONFIG.getController().getMaxTransfer(), 0);
private final RootNetworkNode root; private final RootNetworkNode root;
private ItemStorageTracker itemStorageTracker;
private UUID itemStorageTrackerId;
private FluidStorageTracker fluidStorageTracker;
private UUID fluidStorageTrackerId;
private final BlockPos pos; private final BlockPos pos;
private final World world; private final World world;
private final NetworkType type; private final NetworkType type;
@@ -228,6 +236,8 @@ public class Network implements INetwork, IRedstoneConfigurable {
} }
nodeGraph.disconnectAll(); nodeGraph.disconnectAll();
API.instance().getStorageTrackerManager((ServerWorld) getWorld()).remove(itemStorageTrackerId);
API.instance().getStorageTrackerManager((ServerWorld) getWorld()).remove(fluidStorageTrackerId);
} }
@Override @Override
@@ -456,11 +466,27 @@ public class Network implements INetwork, IRedstoneConfigurable {
@Override @Override
public IStorageTracker<ItemStack> getItemStorageTracker() { 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; return itemStorageTracker;
} }
@Override @Override
public IStorageTracker<FluidStack> getFluidStorageTracker() { 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; return fluidStorageTracker;
} }
@@ -479,12 +505,20 @@ public class Network implements INetwork, IRedstoneConfigurable {
craftingManager.readFromNbt(tag); craftingManager.readFromNbt(tag);
if (tag.contains(NBT_ITEM_STORAGE_TRACKER)) { if (tag.contains(NBT_ITEM_STORAGE_TRACKER_ID)) {
itemStorageTracker.readFromNbt(tag.getList(NBT_ITEM_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); 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)) { if (tag.contains(NBT_FLUID_STORAGE_TRACKER_ID)) {
fluidStorageTracker.readFromNbt(tag.getList(NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); 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; return this;
@@ -497,9 +531,13 @@ public class Network implements INetwork, IRedstoneConfigurable {
redstoneMode.write(tag); redstoneMode.write(tag);
craftingManager.writeToNbt(tag); craftingManager.writeToNbt(tag);
if (itemStorageTrackerId != null) {
tag.putUniqueId(NBT_ITEM_STORAGE_TRACKER_ID, itemStorageTrackerId);
}
tag.put(NBT_ITEM_STORAGE_TRACKER, itemStorageTracker.serializeNbt()); if (fluidStorageTrackerId != null) {
tag.put(NBT_FLUID_STORAGE_TRACKER, fluidStorageTracker.serializeNbt()); tag.putUniqueId(NBT_FLUID_STORAGE_TRACKER_ID, fluidStorageTrackerId);
}
return tag; return tag;
} }

View File

@@ -36,6 +36,7 @@ public class FluidStorageTracker implements IStorageTracker<FluidStack> {
return changes.get(new Key(stack)); return changes.get(new Key(stack));
} }
@Override
public void readFromNbt(ListNBT list) { public void readFromNbt(ListNBT list) {
for (int i = 0; i < list.size(); ++i) { for (int i = 0; i < list.size(); ++i) {
CompoundNBT tag = list.getCompound(i); CompoundNBT tag = list.getCompound(i);
@@ -48,6 +49,7 @@ public class FluidStorageTracker implements IStorageTracker<FluidStack> {
} }
} }
@Override
public ListNBT serializeNbt() { public ListNBT serializeNbt() {
ListNBT list = new ListNBT(); ListNBT list = new ListNBT();

View File

@@ -36,6 +36,7 @@ public class ItemStorageTracker implements IStorageTracker<ItemStack> {
return changes.get(new Key(stack)); return changes.get(new Key(stack));
} }
@Override
public void readFromNbt(ListNBT list) { public void readFromNbt(ListNBT list) {
for (int i = 0; i < list.size(); ++i) { for (int i = 0; i < list.size(); ++i) {
CompoundNBT tag = list.getCompound(i); CompoundNBT tag = list.getCompound(i);
@@ -48,6 +49,7 @@ public class ItemStorageTracker implements IStorageTracker<ItemStack> {
} }
} }
@Override
public ListNBT serializeNbt() { public ListNBT serializeNbt() {
ListNBT list = new ListNBT(); 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; import java.util.UUID;
public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainerContext { public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainerContext {
static final String NBT_STORAGE_TRACKER = "StorageTracker"; static final String NBT_STORAGE_TRACKER = "StorageTracker"; //TODO: remove next version
static final String NBT_FLUID_STORAGE_TRACKER = "FluidStorageTracker"; 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 @Nullable
private IStorageDisk storage; private IStorageDisk storage;
@@ -82,8 +84,10 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
private int tabPage; private int tabPage;
private int size; private int size;
private final ItemStorageTracker storageTracker = new ItemStorageTracker(() -> stack.getTag().put(NBT_STORAGE_TRACKER, getItemStorageTracker().serializeNbt())); private ItemStorageTracker itemStorageTracker;
private final FluidStorageTracker fluidStorageTracker = new FluidStorageTracker(() -> stack.getTag().put(NBT_FLUID_STORAGE_TRACKER, getFluidStorageTracker().serializeNbt())); private UUID itemStorageTrackerId;
private FluidStorageTracker fluidStorageTracker;
private UUID fluidStorageTrackerId;
private final List<IFilter> filters = new ArrayList<>(); private final List<IFilter> filters = new ArrayList<>();
private final List<IGridTab> tabs = new ArrayList<>(); private final List<IGridTab> tabs = new ArrayList<>();
@@ -150,14 +154,32 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
if (!stack.hasTag()) { if (!stack.hasTag()) {
stack.setTag(new CompoundNBT()); 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)) { UUID id = UUID.randomUUID();
storageTracker.readFromNbt(stack.getTag().getList(NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); 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(disk, 4, stack.getTag());
StackUtils.readItems(filter, 0, stack.getTag()); StackUtils.readItems(filter, 0, stack.getTag());
@@ -368,11 +390,31 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
@Override @Override
public ItemStorageTracker getItemStorageTracker() { 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 @Override
public FluidStorageTracker getFluidStorageTracker() { 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; return fluidStorageTracker;
} }

View File

@@ -76,6 +76,7 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID;
public class PortableGridTile extends BaseTile implements ITickableTileEntity, IGrid, IPortableGrid, IRedstoneConfigurable, IStorageDiskContainerContext { public class PortableGridTile extends BaseTile implements ITickableTileEntity, IGrid, IPortableGrid, IRedstoneConfigurable, IStorageDiskContainerContext {
public static final TileDataParameter<Integer, PortableGridTile> REDSTONE_MODE = RedstoneMode.createParameter(); 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_STORAGE_TRACKER = "StorageTracker"; //TODO: remove next version
private static final String NBT_FLUID_STORAGE_TRACKER = "FluidStorageTracker"; 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_TYPE = "Type";
private static final String NBT_ENERGY = "Energy"; private static final String NBT_ENERGY = "Energy";
private static final String NBT_ENCHANTMENTS = "Enchantments"; // @Volatile: Minecraft specific nbt key, see EnchantmentHelper 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 PortableGridDiskState diskState = PortableGridDiskState.NONE;
private boolean active; private boolean active;
private final ItemStorageTracker storageTracker = new ItemStorageTracker(this::markDirty); private ItemStorageTracker itemStorageTracker;
private final FluidStorageTracker fluidStorageTracker = new FluidStorageTracker(this::markDirty); private UUID itemStorageTrackerId;
private FluidStorageTracker fluidStorageTracker;
private UUID fluidStorageTrackerId;
private ListNBT enchants = null; private ListNBT enchants = null;
@@ -246,13 +251,20 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I
StackUtils.readItems(disk, 4, stack.getTag()); StackUtils.readItems(disk, 4, stack.getTag());
this.redstoneMode = RedstoneMode.read(stack.getTag()); this.redstoneMode = RedstoneMode.read(stack.getTag());
if (stack.getTag().contains(PortableGrid.NBT_ITEM_STORAGE_TRACKER_ID)) {
if (stack.getTag().contains(PortableGrid.NBT_STORAGE_TRACKER)) { itemStorageTrackerId = stack.getTag().getUniqueId(NBT_ITEM_STORAGE_TRACKER_ID);
storageTracker.readFromNbt(stack.getTag().getList(PortableGrid.NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); } 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)) { if (stack.getTag().contains(PortableGrid.NBT_FLUID_STORAGE_TRACKER_ID)) {
fluidStorageTracker.readFromNbt(stack.getTag().getList(PortableGrid.NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); 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)) { 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_SELECTED, tabSelected);
stack.getTag().putInt(GridNetworkNode.NBT_TAB_PAGE, tabPage); stack.getTag().putInt(GridNetworkNode.NBT_TAB_PAGE, tabPage);
stack.getTag().put(PortableGrid.NBT_STORAGE_TRACKER, storageTracker.serializeNbt()); stack.getTag().putUniqueId(PortableGrid.NBT_ITEM_STORAGE_TRACKER_ID, itemStorageTrackerId);
stack.getTag().put(PortableGrid.NBT_FLUID_STORAGE_TRACKER, fluidStorageTracker.serializeNbt()); stack.getTag().putUniqueId(PortableGrid.NBT_FLUID_STORAGE_TRACKER_ID, fluidStorageTrackerId);
if (enchants != null) { if (enchants != null) {
stack.getTag().put(NBT_ENCHANTMENTS, enchants); stack.getTag().put(NBT_ENCHANTMENTS, enchants);
@@ -465,11 +477,27 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I
@Override @Override
public IStorageTracker<ItemStack> getItemStorageTracker() { 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 @Override
public IStorageTracker<FluidStack> getFluidStorageTracker() { 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; return fluidStorageTracker;
} }
@@ -642,8 +670,12 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I
redstoneMode.write(tag); redstoneMode.write(tag);
tag.put(NBT_STORAGE_TRACKER, storageTracker.serializeNbt()); if (itemStorageTrackerId != null) {
tag.put(NBT_FLUID_STORAGE_TRACKER, fluidStorageTracker.serializeNbt()); tag.putUniqueId(NBT_ITEM_STORAGE_TRACKER_ID, itemStorageTrackerId);
}
if (fluidStorageTrackerId != null) {
tag.putUniqueId(NBT_FLUID_STORAGE_TRACKER_ID, fluidStorageTrackerId);
}
if (enchants != null) { if (enchants != null) {
tag.put(NBT_ENCHANTMENTS, enchants); tag.put(NBT_ENCHANTMENTS, enchants);
@@ -689,12 +721,20 @@ public class PortableGridTile extends BaseTile implements ITickableTileEntity, I
redstoneMode = RedstoneMode.read(tag); redstoneMode = RedstoneMode.read(tag);
if (tag.contains(NBT_STORAGE_TRACKER)) { if (tag.contains(NBT_ITEM_STORAGE_TRACKER_ID)) {
storageTracker.readFromNbt(tag.getList(NBT_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); 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)) { if (tag.contains(NBT_FLUID_STORAGE_TRACKER_ID)) {
fluidStorageTracker.readFromNbt(tag.getList(NBT_FLUID_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND)); 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)) { if (tag.contains(NBT_ENCHANTMENTS)) {