From d132eca165bf4e1f99c63ca1b3a57cce739b6a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 22 Jan 2022 19:44:11 +0100 Subject: [PATCH] Allow providing Devices as Capabilities on BlockEntities. --- .../li/cil/oc2/api/bus/device/Device.java | 3 +++ .../common/bus/device/provider/Providers.java | 1 + .../BlockEntityCapabilityDeviceProvider.java | 19 +++++++++++++++++++ .../oc2/common/capabilities/Capabilities.java | 3 +++ 4 files changed, 26 insertions(+) create mode 100644 src/main/java/li/cil/oc2/common/bus/device/provider/block/BlockEntityCapabilityDeviceProvider.java diff --git a/src/main/java/li/cil/oc2/api/bus/device/Device.java b/src/main/java/li/cil/oc2/api/bus/device/Device.java index 62435476..0117383c 100644 --- a/src/main/java/li/cil/oc2/api/bus/device/Device.java +++ b/src/main/java/li/cil/oc2/api/bus/device/Device.java @@ -3,6 +3,7 @@ package li.cil.oc2.api.bus.device; import li.cil.oc2.api.bus.DeviceBus; import li.cil.oc2.api.bus.DeviceBusController; import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.util.INBTSerializable; /** @@ -11,6 +12,8 @@ import net.minecraftforge.common.util.INBTSerializable; * Which types are handled/supported by a bus depends on context of the {@link DeviceBusController} * managing the bus. *

+ * May be provided as a capability on {@link BlockEntity}s. + *

* Note that it is strongly encouraged for implementations to provide an overloaded * {@link Object#equals(Object)} and {@link Object#hashCode()} so that identical devices can be * detected. 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/provider/Providers.java index 69111f39..76cad8e8 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/provider/Providers.java +++ b/src/main/java/li/cil/oc2/common/bus/device/provider/Providers.java @@ -25,6 +25,7 @@ public final class Providers { public static void initialize() { BLOCK_DEVICE_PROVIDERS.register("block", BlockStateDeviceProvider::new); BLOCK_DEVICE_PROVIDERS.register("block_entity", BlockEntityDeviceProvider::new); + BLOCK_DEVICE_PROVIDERS.register("block_entity/capability", BlockEntityCapabilityDeviceProvider::new); BLOCK_DEVICE_PROVIDERS.register("energy_storage", EnergyStorageBlockDeviceProvider::new); BLOCK_DEVICE_PROVIDERS.register("fluid_handler", FluidHandlerBlockDeviceProvider::new); diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/block/BlockEntityCapabilityDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/block/BlockEntityCapabilityDeviceProvider.java new file mode 100644 index 00000000..aa653222 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/bus/device/provider/block/BlockEntityCapabilityDeviceProvider.java @@ -0,0 +1,19 @@ +package li.cil.oc2.common.bus.device.provider.block; + +import li.cil.oc2.api.bus.device.Device; +import li.cil.oc2.api.bus.device.provider.BlockDeviceQuery; +import li.cil.oc2.api.util.Invalidatable; +import li.cil.oc2.common.bus.device.provider.util.AbstractBlockEntityCapabilityDeviceProvider; +import li.cil.oc2.common.capabilities.Capabilities; +import net.minecraft.world.level.block.entity.BlockEntity; + +public final class BlockEntityCapabilityDeviceProvider extends AbstractBlockEntityCapabilityDeviceProvider { + public BlockEntityCapabilityDeviceProvider() { + super(() -> Capabilities.DEVICE); + } + + @Override + protected Invalidatable getBlockDevice(final BlockDeviceQuery query, final Device device) { + return Invalidatable.of(device); + } +} diff --git a/src/main/java/li/cil/oc2/common/capabilities/Capabilities.java b/src/main/java/li/cil/oc2/common/capabilities/Capabilities.java index e84b1a98..4e2fc684 100644 --- a/src/main/java/li/cil/oc2/common/capabilities/Capabilities.java +++ b/src/main/java/li/cil/oc2/common/capabilities/Capabilities.java @@ -1,6 +1,7 @@ package li.cil.oc2.common.capabilities; import li.cil.oc2.api.bus.DeviceBusElement; +import li.cil.oc2.api.bus.device.Device; import li.cil.oc2.api.capabilities.NetworkInterface; import li.cil.oc2.api.capabilities.RedstoneEmitter; import li.cil.oc2.api.capabilities.Robot; @@ -20,6 +21,7 @@ public final class Capabilities { public static final Capability ITEM_HANDLER = CapabilityManager.get(new CapabilityToken<>() { }); public static final Capability DEVICE_BUS_ELEMENT = CapabilityManager.get(new CapabilityToken<>() { }); + public static final Capability DEVICE = CapabilityManager.get(new CapabilityToken<>() { }); public static final Capability REDSTONE_EMITTER = CapabilityManager.get(new CapabilityToken<>() { }); public static final Capability NETWORK_INTERFACE = CapabilityManager.get(new CapabilityToken<>() { }); public static final Capability TERMINAL_USER_PROVIDER = CapabilityManager.get(new CapabilityToken<>() { }); @@ -30,6 +32,7 @@ public final class Capabilities { @SubscribeEvent public static void initialize(final RegisterCapabilitiesEvent event) { event.register(DeviceBusElement.class); + event.register(Device.class); event.register(RedstoneEmitter.class); event.register(NetworkInterface.class); event.register(TerminalUserProvider.class);