diff --git a/src/main/java/li/cil/oc2/Constants.java b/src/main/java/li/cil/oc2/Constants.java
index 6954de27..c217c7d0 100644
--- a/src/main/java/li/cil/oc2/Constants.java
+++ b/src/main/java/li/cil/oc2/Constants.java
@@ -6,13 +6,23 @@ public final class Constants {
public static final int KILOBYTE = 1024;
public static final int MEGABYTE = 1024 * KILOBYTE;
+ ///////////////////////////////////////////////////////////////////
+
public static final String COMPUTER_BLOCK_NAME = "computer";
public static final String BUS_CABLE_BLOCK_NAME = "bus_cable";
public static final String REDSTONE_INTERFACE_BLOCK_NAME = "redstone_interface";
public static final String SCREEN_BLOCK_NAME = "screen";
- public static final String RAM_NAME = "ram";
- public static final String HDD_NAME = "hdd";
+ ///////////////////////////////////////////////////////////////////
+
+ public static final String RAM_ITEM_NAME = "ram";
+ public static final String HDD_ITEM_NAME = "hdd";
+
+ ///////////////////////////////////////////////////////////////////
+
+ public static final String COMMON_ITEM_GROUP_NAME = "common";
+
+ ///////////////////////////////////////////////////////////////////
public static final String HDD_INFO_NBT_TAG_NAME = API.MOD_ID + "hdd";
public static final String HDD_SIZE_NBT_TAG_NAME = "size";
diff --git a/src/main/java/li/cil/oc2/api/API.java b/src/main/java/li/cil/oc2/api/API.java
index b3e8f8a2..5a06d090 100644
--- a/src/main/java/li/cil/oc2/api/API.java
+++ b/src/main/java/li/cil/oc2/api/API.java
@@ -2,7 +2,6 @@ package li.cil.oc2.api;
import com.google.gson.GsonBuilder;
import li.cil.oc2.api.bus.device.object.Callback;
-import li.cil.oc2.api.bus.device.provider.DeviceProvider;
import li.cil.oc2.api.bus.device.rpc.RPCMethod;
import li.cil.oc2.api.imc.RPCMethodParameterTypeAdapter;
@@ -13,16 +12,6 @@ public final class API {
///////////////////////////////////////////////////////////////////
- /**
- * IMC message for registering a {@link DeviceProvider}.
- *
- * Example:
- *
- * InterModComms.sendTo(API.MOD_ID, API.IMC_ADD_DEVICE_PROVIDER, () -> new DeviceProvider() { ... });
- *
- */
- public static final String IMC_ADD_DEVICE_PROVIDER = "addDeviceProvider";
-
/**
* IMC message for registering Gson type adapters for method parameter serialization and
* deserialization.
diff --git a/src/main/java/li/cil/oc2/api/bus/device/provider/DeviceProvider.java b/src/main/java/li/cil/oc2/api/bus/device/provider/DeviceProvider.java
index cc834535..ac37c8a9 100644
--- a/src/main/java/li/cil/oc2/api/bus/device/provider/DeviceProvider.java
+++ b/src/main/java/li/cil/oc2/api/bus/device/provider/DeviceProvider.java
@@ -4,6 +4,7 @@ import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.object.ObjectDevice;
import li.cil.oc2.api.bus.device.rpc.RPCDevice;
import net.minecraftforge.common.util.LazyOptional;
+import net.minecraftforge.registries.IForgeRegistryEntry;
/**
* Allows querying for devices given some context.
@@ -24,15 +25,26 @@ import net.minecraftforge.common.util.LazyOptional;
*
*
*
- * Providers can be registered with the IMC message {@link li.cil.oc2.api.API#IMC_ADD_DEVICE_PROVIDER}.
+ * Providers can be registered via the device provider registry, much like blocks and items
+ * are registered. For example:
+ *
+ * class YourModInitialization {
+ * static DeferredRegister PROVIDERS = DeferredRegister.create(DeviceProvider.class, "your_mod_id");
+ *
+ * static void initialize() {
+ * PROVIDERS.register("your_device_name", YourDeviceProvider::new);
+ *
+ * PROVIDERS.register(FMLJavaModLoadingContext.get().getModEventBus());
+ * }
+ * }
+ *
*
* @see RPCDevice
* @see ObjectDevice
* @see DeviceQuery
* @see BlockDeviceQuery
*/
-@FunctionalInterface
-public interface DeviceProvider {
+public interface DeviceProvider extends IForgeRegistryEntry {
/**
* Get a device for the specified query.
*
diff --git a/src/main/java/li/cil/oc2/common/CommonSetup.java b/src/main/java/li/cil/oc2/common/CommonSetup.java
index 980f45de..cba8288f 100644
--- a/src/main/java/li/cil/oc2/common/CommonSetup.java
+++ b/src/main/java/li/cil/oc2/common/CommonSetup.java
@@ -1,6 +1,5 @@
package li.cil.oc2.common;
-import li.cil.oc2.common.bus.device.provider.Providers;
import li.cil.oc2.common.bus.device.rpc.RPCMethodParameterTypeAdapters;
import li.cil.oc2.common.capabilities.Capabilities;
import li.cil.oc2.common.integration.IMC;
@@ -20,7 +19,6 @@ public final class CommonSetup {
public static void run(final FMLCommonSetupEvent event) {
Capabilities.initialize();
- Providers.initialize();
Network.setup();
FMLJavaModLoadingContext.get().getModEventBus().addListener(IMC::handleIMCMessages);
diff --git a/src/main/java/li/cil/oc2/common/bus/ItemHandlerDeviceBusElement.java b/src/main/java/li/cil/oc2/common/bus/ItemHandlerDeviceBusElement.java
index 6005f2b7..c263c20b 100644
--- a/src/main/java/li/cil/oc2/common/bus/ItemHandlerDeviceBusElement.java
+++ b/src/main/java/li/cil/oc2/common/bus/ItemHandlerDeviceBusElement.java
@@ -1,7 +1,7 @@
package li.cil.oc2.common.bus;
import li.cil.oc2.api.bus.device.Device;
-import li.cil.oc2.common.bus.device.provider.Providers;
+import li.cil.oc2.common.bus.device.Devices;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.ItemStackHandler;
@@ -22,7 +22,7 @@ public class ItemHandlerDeviceBusElement extends AbstractGroupingDeviceBusElemen
final HashSet newDevices = new HashSet<>();
final ItemStack stack = handler.getStackInSlot(slot);
if (!stack.isEmpty()) {
- for (final LazyOptional device : Providers.getDevices(stack)) {
+ for (final LazyOptional device : Devices.getDevices(stack)) {
device.ifPresent(newDevices::add);
device.addListener(unused -> handleSlotChanged(slot));
}
diff --git a/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java b/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java
index 0d30c010..c1e5ccd0 100644
--- a/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java
+++ b/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java
@@ -3,7 +3,7 @@ package li.cil.oc2.common.bus;
import li.cil.oc2.api.bus.DeviceBus;
import li.cil.oc2.api.bus.DeviceBusElement;
import li.cil.oc2.api.bus.device.Device;
-import li.cil.oc2.common.bus.device.provider.Providers;
+import li.cil.oc2.common.bus.device.Devices;
import li.cil.oc2.common.capabilities.Capabilities;
import li.cil.oc2.common.util.ServerScheduler;
import li.cil.oc2.common.util.WorldUtils;
@@ -82,7 +82,7 @@ public class TileEntityDeviceBusElement extends AbstractGroupingDeviceBusElement
final HashSet newDevices = new HashSet<>();
if (canConnectToSide(direction)) {
- for (final LazyOptional device : Providers.getDevices(world, pos, direction)) {
+ for (final LazyOptional device : Devices.getDevices(world, pos, direction)) {
device.ifPresent(newDevices::add);
device.addListener(unused -> handleNeighborChanged(pos));
}
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/Providers.java b/src/main/java/li/cil/oc2/common/bus/device/Devices.java
similarity index 71%
rename from src/main/java/li/cil/oc2/common/bus/device/provider/Providers.java
rename to src/main/java/li/cil/oc2/common/bus/device/Devices.java
index dad84a7f..c196a607 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/Providers.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/Devices.java
@@ -1,44 +1,24 @@
-package li.cil.oc2.common.bus.device.provider;
+package li.cil.oc2.common.bus.device;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.provider.BlockDeviceQuery;
import li.cil.oc2.api.bus.device.provider.DeviceProvider;
import li.cil.oc2.api.bus.device.provider.DeviceQuery;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
-import li.cil.oc2.common.bus.device.provider.util.BlockDeviceProvider;
-import li.cil.oc2.common.bus.device.provider.util.TileEntityDeviceProvider;
+import li.cil.oc2.common.init.Providers;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.util.LazyOptional;
+import net.minecraftforge.registries.IForgeRegistry;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
-public final class Providers {
- private static final ArrayList DEVICE_PROVIDERS = new ArrayList<>();
-
- ///////////////////////////////////////////////////////////////////
-
- public static void initialize() {
- addProvider(new EnergyStorageDeviceProvider());
- addProvider(new FluidHandlerDeviceProvider());
- addProvider(new ItemHandlerDeviceProvider());
- addProvider(new TileEntityDeviceProvider());
- addProvider(new BlockDeviceProvider());
- addProvider(new MemoryItemDeviceProvider());
- addProvider(new HardDriveItemDeviceProvider());
- }
-
- public static void addProvider(final DeviceProvider provider) {
- if (!DEVICE_PROVIDERS.contains(provider)) {
- DEVICE_PROVIDERS.add(provider);
- }
- }
-
+public final class Devices {
public static List> getDevices(final TileEntity tileEntity, final Direction side) {
final World world = tileEntity.getWorld();
final BlockPos pos = tileEntity.getPos();
@@ -57,8 +37,9 @@ public final class Providers {
}
public static List> getDevices(final DeviceQuery query) {
+ final IForgeRegistry providers = Providers.PROVIDERS_REGISTRY.get();
final ArrayList> devices = new ArrayList<>();
- for (final DeviceProvider provider : DEVICE_PROVIDERS) {
+ for (final DeviceProvider provider : providers.getValues()) {
final LazyOptional device = provider.getDevice(query);
if (device.isPresent()) {
devices.add(device);
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/util/BlockDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/BlockDeviceProvider.java
similarity index 87%
rename from src/main/java/li/cil/oc2/common/bus/device/provider/util/BlockDeviceProvider.java
rename to src/main/java/li/cil/oc2/common/bus/device/provider/BlockDeviceProvider.java
index 37549052..6a516963 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/util/BlockDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/BlockDeviceProvider.java
@@ -1,17 +1,17 @@
-package li.cil.oc2.common.bus.device.provider.util;
+package li.cil.oc2.common.bus.device.provider;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.object.Callbacks;
import li.cil.oc2.api.bus.device.object.ObjectDevice;
import li.cil.oc2.api.bus.device.provider.BlockDeviceQuery;
-import li.cil.oc2.api.bus.device.provider.DeviceProvider;
import li.cil.oc2.api.bus.device.provider.DeviceQuery;
+import li.cil.oc2.common.bus.device.provider.util.AbstractDeviceProvider;
import li.cil.oc2.common.util.WorldUtils;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraftforge.common.util.LazyOptional;
-public class BlockDeviceProvider implements DeviceProvider {
+public final class BlockDeviceProvider extends AbstractDeviceProvider {
@Override
public LazyOptional getDevice(final DeviceQuery query) {
if (!(query instanceof BlockDeviceQuery)) {
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/EnergyStorageDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/EnergyStorageDeviceProvider.java
index c03db2ba..bbb1d710 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/EnergyStorageDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/EnergyStorageDeviceProvider.java
@@ -10,7 +10,7 @@ import li.cil.oc2.common.capabilities.Capabilities;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.energy.IEnergyStorage;
-public class EnergyStorageDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider {
+public final class EnergyStorageDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider {
private static final String ENERGY_STORAGE_TYPE_NAME = "energyStorage";
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/FluidHandlerDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/FluidHandlerDeviceProvider.java
index a9782913..7a3d7cc7 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/FluidHandlerDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/FluidHandlerDeviceProvider.java
@@ -11,7 +11,7 @@ import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler;
-public class FluidHandlerDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider {
+public final class FluidHandlerDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider {
private static final String FLUID_HANDLER_TYPE_NAME = "fluidHandler";
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/HardDriveItemDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/HardDriveItemDeviceProvider.java
index f4fe016b..ceb4756b 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/HardDriveItemDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/HardDriveItemDeviceProvider.java
@@ -2,12 +2,12 @@ package li.cil.oc2.common.bus.device.provider;
import li.cil.oc2.Config;
import li.cil.oc2.Constants;
-import li.cil.oc2.OpenComputers;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.common.bus.device.HardDiskDriveDevice;
import li.cil.oc2.common.bus.device.SparseHardDiskDriveDevice;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
+import li.cil.oc2.common.init.Items;
import li.cil.oc2.common.util.NBTTagIds;
import li.cil.sedna.api.device.BlockDevice;
import li.cil.sedna.buildroot.Buildroot;
@@ -21,13 +21,13 @@ import org.apache.logging.log4j.Logger;
import java.io.IOException;
import java.util.Objects;
-public class HardDriveItemDeviceProvider extends AbstractItemDeviceProvider {
+public final class HardDriveItemDeviceProvider extends AbstractItemDeviceProvider {
private static final Logger LOGGER = LogManager.getLogger();
///////////////////////////////////////////////////////////////////
public HardDriveItemDeviceProvider() {
- super(OpenComputers.HDD_ITEM.get());
+ super(Items.HDD_ITEM.get());
}
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/ItemHandlerDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/ItemHandlerDeviceProvider.java
index 5921118a..ac9fabde 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/ItemHandlerDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/ItemHandlerDeviceProvider.java
@@ -11,7 +11,7 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.IItemHandler;
-public class ItemHandlerDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider {
+public final class ItemHandlerDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider {
private static final String ITEM_HANDLER_TYPE_NAME = "itemHandler";
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/MemoryItemDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/MemoryItemDeviceProvider.java
index a235cdf8..d454faf9 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/MemoryItemDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/MemoryItemDeviceProvider.java
@@ -1,12 +1,12 @@
package li.cil.oc2.common.bus.device.provider;
import li.cil.oc2.Constants;
-import li.cil.oc2.OpenComputers;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import li.cil.oc2.api.bus.device.vm.*;
import li.cil.oc2.common.bus.device.provider.util.AbstractItemDeviceProvider;
import li.cil.oc2.common.bus.device.provider.util.AbstractObjectProxy;
+import li.cil.oc2.common.init.Items;
import li.cil.oc2.common.serialization.BlobStorage;
import li.cil.oc2.common.util.NBTTagIds;
import li.cil.sedna.api.device.PhysicalMemory;
@@ -23,7 +23,7 @@ import java.util.UUID;
public final class MemoryItemDeviceProvider extends AbstractItemDeviceProvider {
public MemoryItemDeviceProvider() {
- super(OpenComputers.RAM_8M_ITEM.get());
+ super(Items.RAM_8M_ITEM.get());
}
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/util/TileEntityDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/TileEntityDeviceProvider.java
similarity index 88%
rename from src/main/java/li/cil/oc2/common/bus/device/provider/util/TileEntityDeviceProvider.java
rename to src/main/java/li/cil/oc2/common/bus/device/provider/TileEntityDeviceProvider.java
index 4bf683b7..cea5d476 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/util/TileEntityDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/TileEntityDeviceProvider.java
@@ -1,9 +1,10 @@
-package li.cil.oc2.common.bus.device.provider.util;
+package li.cil.oc2.common.bus.device.provider;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.object.Callbacks;
import li.cil.oc2.api.bus.device.object.ObjectDevice;
import li.cil.oc2.api.bus.device.provider.BlockDeviceQuery;
+import li.cil.oc2.common.bus.device.provider.util.AbstractTileEntityDeviceProvider;
import li.cil.oc2.common.util.WorldUtils;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.LazyOptional;
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractDeviceProvider.java
new file mode 100644
index 00000000..a9f3c7ac
--- /dev/null
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractDeviceProvider.java
@@ -0,0 +1,7 @@
+package li.cil.oc2.common.bus.device.provider.util;
+
+import li.cil.oc2.api.bus.device.provider.DeviceProvider;
+import net.minecraftforge.registries.ForgeRegistryEntry;
+
+public abstract class AbstractDeviceProvider extends ForgeRegistryEntry implements DeviceProvider {
+}
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractItemDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractItemDeviceProvider.java
index a74bb94c..f30f7aab 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractItemDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractItemDeviceProvider.java
@@ -1,14 +1,13 @@
package li.cil.oc2.common.bus.device.provider.util;
import li.cil.oc2.api.bus.device.Device;
-import li.cil.oc2.api.bus.device.provider.DeviceProvider;
import li.cil.oc2.api.bus.device.provider.DeviceQuery;
import li.cil.oc2.api.bus.device.provider.ItemDeviceQuery;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.LazyOptional;
-public abstract class AbstractItemDeviceProvider implements DeviceProvider {
+public abstract class AbstractItemDeviceProvider extends AbstractDeviceProvider {
private final Item item;
protected AbstractItemDeviceProvider(final Item item) {
diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractTileEntityDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractTileEntityDeviceProvider.java
index 0076c927..262d7401 100644
--- a/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractTileEntityDeviceProvider.java
+++ b/src/main/java/li/cil/oc2/common/bus/device/provider/util/AbstractTileEntityDeviceProvider.java
@@ -2,13 +2,12 @@ package li.cil.oc2.common.bus.device.provider.util;
import li.cil.oc2.api.bus.device.Device;
import li.cil.oc2.api.bus.device.provider.BlockDeviceQuery;
-import li.cil.oc2.api.bus.device.provider.DeviceProvider;
import li.cil.oc2.api.bus.device.provider.DeviceQuery;
import li.cil.oc2.common.util.WorldUtils;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.LazyOptional;
-public abstract class AbstractTileEntityDeviceProvider implements DeviceProvider {
+public abstract class AbstractTileEntityDeviceProvider extends AbstractDeviceProvider {
private final Class tileEntityType;
///////////////////////////////////////////////////////////////////
diff --git a/src/main/java/li/cil/oc2/common/init/Providers.java b/src/main/java/li/cil/oc2/common/init/Providers.java
new file mode 100644
index 00000000..79c049f8
--- /dev/null
+++ b/src/main/java/li/cil/oc2/common/init/Providers.java
@@ -0,0 +1,35 @@
+package li.cil.oc2.common.init;
+
+import li.cil.oc2.api.API;
+import li.cil.oc2.api.bus.device.provider.DeviceProvider;
+import li.cil.oc2.common.bus.device.provider.*;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
+import net.minecraftforge.registries.DeferredRegister;
+import net.minecraftforge.registries.IForgeRegistry;
+import net.minecraftforge.registries.RegistryBuilder;
+
+import java.util.function.Supplier;
+
+public final class Providers {
+ private static final DeferredRegister PROVIDERS = DeferredRegister.create(DeviceProvider.class, API.MOD_ID);
+
+ ///////////////////////////////////////////////////////////////////
+
+ public static final Supplier> PROVIDERS_REGISTRY = PROVIDERS.makeRegistry("device_providers", RegistryBuilder::new);
+
+ ///////////////////////////////////////////////////////////////////
+
+ public static void initialize() {
+ PROVIDERS.register("block", BlockDeviceProvider::new);
+ PROVIDERS.register("tile_entity", TileEntityDeviceProvider::new);
+
+ PROVIDERS.register("energy_storage", EnergyStorageDeviceProvider::new);
+ PROVIDERS.register("fluid_handler", FluidHandlerDeviceProvider::new);
+ PROVIDERS.register("item_handler", ItemHandlerDeviceProvider::new);
+
+ PROVIDERS.register("item_memory", MemoryItemDeviceProvider::new);
+ PROVIDERS.register("item_hard_drive", HardDriveItemDeviceProvider::new);
+
+ PROVIDERS.register(FMLJavaModLoadingContext.get().getModEventBus());
+ }
+}
diff --git a/src/main/java/li/cil/oc2/common/integration/IMC.java b/src/main/java/li/cil/oc2/common/integration/IMC.java
index 67c53def..3f6fb139 100644
--- a/src/main/java/li/cil/oc2/common/integration/IMC.java
+++ b/src/main/java/li/cil/oc2/common/integration/IMC.java
@@ -1,9 +1,7 @@
package li.cil.oc2.common.integration;
import li.cil.oc2.api.API;
-import li.cil.oc2.api.bus.device.provider.DeviceProvider;
import li.cil.oc2.api.imc.RPCMethodParameterTypeAdapter;
-import li.cil.oc2.common.bus.device.provider.Providers;
import li.cil.oc2.common.bus.device.rpc.RPCMethodParameterTypeAdapters;
import net.minecraft.util.Util;
import net.minecraftforge.fml.InterModComms;
@@ -21,7 +19,6 @@ public final class IMC {
private static final HashMap> METHODS = Util.make(() -> {
HashMap> map = new HashMap<>();
- map.put(API.IMC_ADD_DEVICE_PROVIDER, IMC::addDeviceProvider);
map.put(API.IMC_ADD_RPC_METHOD_PARAMETER_TYPE_ADAPTER, IMC::addRPCMethodParameterTypeAdapter);
return map;
@@ -38,10 +35,6 @@ public final class IMC {
});
}
- private static void addDeviceProvider(final InterModComms.IMCMessage message) {
- getMessageParameter(message, DeviceProvider.class).ifPresent(Providers::addProvider);
- }
-
private static void addRPCMethodParameterTypeAdapter(final InterModComms.IMCMessage message) {
getMessageParameter(message, RPCMethodParameterTypeAdapter.class).ifPresent(value -> {
try {