From 692956632486d864aeec43dcdf217743e6c714e7 Mon Sep 17 00:00:00 2001
From: Patrick Decoster
Date: Mon, 25 Jun 2018 11:46:30 +0200
Subject: [PATCH] Implemented getStorage command for OC integration (#1828)
* Added first iteration of getStorage command for OC integration
* Attempted to add an option to fetch the UUID of a Storage Disk.
Ended up having to return a randomly generated UUID for now.
* Add logic for traversing the fluid storage cache
* Removed unused import
---
.../api/storage/disk/IStorageDiskManager.java | 9 +++
.../storage/disk/StorageDiskManager.java | 6 ++
.../integration/oc/EnvironmentNetwork.java | 77 ++++++++++++++++++-
3 files changed, 89 insertions(+), 3 deletions(-)
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java
index a7d1143f8..c658dabbc 100644
--- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java
@@ -19,6 +19,15 @@ public interface IStorageDiskManager {
@Nullable
IStorageDisk get(UUID id);
+ /**
+ * Gets the UUID of the given Storage Disk
+ *
+ * @param disk the storage disk
+ * @return the storage disk's UUID, or null if no UUID is found
+ */
+ @Nullable
+ UUID getUuid(IStorageDisk disk);
+
/**
* Gets a storage disk by disk stack (a {@link IStorageDiskProvider}).
*
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java
index e58a9daf6..cb6ca6803 100644
--- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java
@@ -40,6 +40,12 @@ public class StorageDiskManager extends WorldSavedData implements IStorageDiskMa
return disks.get(id);
}
+ @Nullable
+ public UUID getUuid(IStorageDisk disk) {
+ // Return random UUID for now
+ return UUID.randomUUID();
+ }
+
@Nullable
@Override
public IStorageDisk getByStack(ItemStack disk) {
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/integration/oc/EnvironmentNetwork.java b/src/main/java/com/raoulvdberge/refinedstorage/integration/oc/EnvironmentNetwork.java
index 665567a86..65b893783 100644
--- a/src/main/java/com/raoulvdberge/refinedstorage/integration/oc/EnvironmentNetwork.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/integration/oc/EnvironmentNetwork.java
@@ -4,8 +4,14 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTaskError;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
+import com.raoulvdberge.refinedstorage.api.storage.IStorage;
+import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk;
+import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskManager;
+import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskRegistry;
import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.API;
+import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.StorageDiskItemDriveWrapper;
+import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.StorageDiskManager;
import li.cil.oc.api.Network;
import li.cil.oc.api.machine.Arguments;
import li.cil.oc.api.machine.Callback;
@@ -13,6 +19,7 @@ import li.cil.oc.api.machine.Context;
import li.cil.oc.api.network.Visibility;
import li.cil.oc.api.prefab.AbstractManagedEnvironment;
import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.fluids.FluidRegistry;
@@ -23,9 +30,7 @@ import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import static com.raoulvdberge.refinedstorage.api.util.IComparer.COMPARE_DAMAGE;
import static com.raoulvdberge.refinedstorage.api.util.IComparer.COMPARE_NBT;
@@ -328,4 +333,70 @@ public class EnvironmentNetwork extends AbstractManagedEnvironment {
return new Object[]{node.getNetwork().getItemStorageCache().getList().getStacks()};
}
+
+ @Callback(doc = "function():table -- Gets a list of all connected Storage Disks / Blocks in this network.")
+ public Object[] getStorage(final Context context, final Arguments args) {
+ int totalItemStored = 0;
+ int totalItemCapacity = 0;
+ int totalFluidStored = 0;
+ int totalFluidCapacity = 0;
+
+ HashMap> devices = new HashMap>();
+
+ IStorageDiskManager sdm = API.instance().getStorageDiskManager(node.getWorld());
+
+ for (IStorage s : node.getNetwork().getItemStorageCache().getStorages()) {
+ if (s instanceof IStorageDisk) {
+ IStorageDisk sd = (IStorageDisk) s;
+ String id = sd.getId();
+ HashMap data = new HashMap();
+
+ data.put("type", "item");
+ data.put("usage", sd.getStored());
+ data.put("capacity", sd.getCapacity());
+
+ totalItemStored += sd.getStored();
+ totalItemCapacity += sd.getCapacity();
+
+ UUID uuid = sdm.getUuid(sd);
+ devices.put(uuid.toString(), data);
+ }
+ }
+
+ for (IStorage s : node.getNetwork().getFluidStorageCache().getStorages()) {
+ if (s instanceof IStorageDisk) {
+ IStorageDisk sd = (IStorageDisk) s;
+ String id = sd.getId();
+ HashMap data = new HashMap();
+
+ data.put("type", "fluid");
+ data.put("usage", sd.getStored());
+ data.put("capacity", sd.getCapacity());
+
+ totalFluidStored += sd.getStored();
+ totalFluidCapacity += sd.getCapacity();
+
+ UUID uuid = sdm.getUuid(sd);
+ devices.put(uuid.toString(), data);
+ }
+ }
+
+ HashMap itemTotals = new HashMap<>();
+ itemTotals.put("usage", totalItemStored);
+ itemTotals.put("capacity", totalItemCapacity);
+
+ HashMap fluidTotals = new HashMap<>();
+ fluidTotals.put("usage", totalFluidStored);
+ fluidTotals.put("capacity", totalFluidCapacity);
+
+ HashMap totals = new HashMap<>();
+ totals.put("item", itemTotals);
+ totals.put("fluid", fluidTotals);
+
+ HashMap response = new HashMap<>();
+ response.put("total", totals);
+ response.put("devices", devices);
+
+ return new Object[]{response};
+ }
}