Merge pull request #2969 from Darkere/trackermanager
move storage tracker to its own file to avoid nbt size problems
This commit is contained in:
@@ -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.
|
||||||
*
|
*
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
}
|
@@ -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);
|
||||||
|
@@ -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_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;
|
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;
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
|
|
||||||
|
@@ -36,6 +36,7 @@ public class ItemStorageTracker implements IStorageTracker<ItemStack> {
|
|||||||
return changes.get(new ItemStackKey(stack));
|
return changes.get(new ItemStackKey(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();
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
@@ -60,8 +60,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;
|
||||||
@@ -83,8 +85,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<>();
|
||||||
@@ -151,14 +155,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());
|
||||||
@@ -369,11 +391,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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,12 @@ 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());
|
if (itemStorageTrackerId != null) {
|
||||||
stack.getTag().put(PortableGrid.NBT_FLUID_STORAGE_TRACKER, fluidStorageTracker.serializeNbt());
|
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) {
|
if (enchants != null) {
|
||||||
stack.getTag().put(NBT_ENCHANTMENTS, enchants);
|
stack.getTag().put(NBT_ENCHANTMENTS, enchants);
|
||||||
@@ -465,11 +481,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 +674,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 +725,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)) {
|
||||||
|
Reference in New Issue
Block a user