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}; + } }