Added custom registry for providers, removed IMC.

This commit is contained in:
Florian Nücke
2020-12-19 12:10:12 +01:00
parent 907f4fea9a
commit 6379bf9f62
19 changed files with 94 additions and 70 deletions

View File

@@ -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";

View File

@@ -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, () -&gt; 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.

View File

@@ -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.
*

View File

@@ -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);

View File

@@ -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));
}

View File

@@ -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));
}

View File

@@ -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);

View File

@@ -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)) {

View File

@@ -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";
///////////////////////////////////////////////////////////////////

View File

@@ -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";
///////////////////////////////////////////////////////////////////

View File

@@ -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());
}
///////////////////////////////////////////////////////////////////

View File

@@ -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";
///////////////////////////////////////////////////////////////////

View File

@@ -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());
}
///////////////////////////////////////////////////////////////////

View File

@@ -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;

View File

@@ -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 {
}

View File

@@ -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) {

View File

@@ -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;
///////////////////////////////////////////////////////////////////

View 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());
}
}

View File

@@ -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 {