Added custom registry for providers, removed IMC.
This commit is contained in:
@@ -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";
|
||||
|
||||
@@ -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}.
|
||||
* <p>
|
||||
* Example:
|
||||
* <pre>
|
||||
* InterModComms.sendTo(API.MOD_ID, API.IMC_ADD_DEVICE_PROVIDER, () -> new DeviceProvider() { ... });
|
||||
* </pre>
|
||||
*/
|
||||
public static final String IMC_ADD_DEVICE_PROVIDER = "addDeviceProvider";
|
||||
|
||||
/**
|
||||
* IMC message for registering Gson type adapters for method parameter serialization and
|
||||
* deserialization.
|
||||
|
||||
@@ -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;
|
||||
* </li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* 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:
|
||||
* <pre>
|
||||
* class YourModInitialization {
|
||||
* static DeferredRegister<DeviceProvider> PROVIDERS = DeferredRegister.create(DeviceProvider.class, "your_mod_id");
|
||||
*
|
||||
* static void initialize() {
|
||||
* PROVIDERS.register("your_device_name", YourDeviceProvider::new);
|
||||
*
|
||||
* PROVIDERS.register(FMLJavaModLoadingContext.get().getModEventBus());
|
||||
* }
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @see RPCDevice
|
||||
* @see ObjectDevice
|
||||
* @see DeviceQuery
|
||||
* @see BlockDeviceQuery
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface DeviceProvider {
|
||||
public interface DeviceProvider extends IForgeRegistryEntry<DeviceProvider> {
|
||||
/**
|
||||
* Get a device for the specified query.
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<Device> newDevices = new HashSet<>();
|
||||
final ItemStack stack = handler.getStackInSlot(slot);
|
||||
if (!stack.isEmpty()) {
|
||||
for (final LazyOptional<Device> device : Providers.getDevices(stack)) {
|
||||
for (final LazyOptional<Device> device : Devices.getDevices(stack)) {
|
||||
device.ifPresent(newDevices::add);
|
||||
device.addListener(unused -> handleSlotChanged(slot));
|
||||
}
|
||||
|
||||
@@ -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<Device> newDevices = new HashSet<>();
|
||||
if (canConnectToSide(direction)) {
|
||||
for (final LazyOptional<Device> device : Providers.getDevices(world, pos, direction)) {
|
||||
for (final LazyOptional<Device> device : Devices.getDevices(world, pos, direction)) {
|
||||
device.ifPresent(newDevices::add);
|
||||
device.addListener(unused -> handleNeighborChanged(pos));
|
||||
}
|
||||
|
||||
@@ -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<DeviceProvider> 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<LazyOptional<Device>> 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<LazyOptional<Device>> getDevices(final DeviceQuery query) {
|
||||
final IForgeRegistry<DeviceProvider> providers = Providers.PROVIDERS_REGISTRY.get();
|
||||
final ArrayList<LazyOptional<Device>> devices = new ArrayList<>();
|
||||
for (final DeviceProvider provider : DEVICE_PROVIDERS) {
|
||||
for (final DeviceProvider provider : providers.getValues()) {
|
||||
final LazyOptional<Device> device = provider.getDevice(query);
|
||||
if (device.isPresent()) {
|
||||
devices.add(device);
|
||||
@@ -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<Device> getDevice(final DeviceQuery query) {
|
||||
if (!(query instanceof BlockDeviceQuery)) {
|
||||
@@ -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<IEnergyStorage> {
|
||||
public final class EnergyStorageDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider<IEnergyStorage> {
|
||||
private static final String ENERGY_STORAGE_TYPE_NAME = "energyStorage";
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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<IFluidHandler> {
|
||||
public final class FluidHandlerDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider<IFluidHandler> {
|
||||
private static final String FLUID_HANDLER_TYPE_NAME = "fluidHandler";
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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<IItemHandler> {
|
||||
public final class ItemHandlerDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider<IItemHandler> {
|
||||
private static final String ITEM_HANDLER_TYPE_NAME = "itemHandler";
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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;
|
||||
@@ -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<DeviceProvider> implements DeviceProvider {
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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<T extends TileEntity> implements DeviceProvider {
|
||||
public abstract class AbstractTileEntityDeviceProvider<T extends TileEntity> extends AbstractDeviceProvider {
|
||||
private final Class<T> tileEntityType;
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
35
src/main/java/li/cil/oc2/common/init/Providers.java
Normal file
35
src/main/java/li/cil/oc2/common/init/Providers.java
Normal file
@@ -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<DeviceProvider> PROVIDERS = DeferredRegister.create(DeviceProvider.class, API.MOD_ID);
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
public static final Supplier<IForgeRegistry<DeviceProvider>> 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());
|
||||
}
|
||||
}
|
||||
@@ -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<String, Consumer<InterModComms.IMCMessage>> METHODS = Util.make(() -> {
|
||||
HashMap<String, Consumer<InterModComms.IMCMessage>> 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 {
|
||||
|
||||
Reference in New Issue
Block a user