Allow providing Devices as Capabilities on BlockEntities.

This commit is contained in:
Florian Nücke
2022-01-22 19:44:11 +01:00
parent fd423d92e7
commit d132eca165
4 changed files with 26 additions and 0 deletions

View File

@@ -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.
* <p>
* May be provided as a capability on {@link BlockEntity}s.
* <p>
* 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.

View File

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

View File

@@ -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<Device, BlockEntity> {
public BlockEntityCapabilityDeviceProvider() {
super(() -> Capabilities.DEVICE);
}
@Override
protected Invalidatable<Device> getBlockDevice(final BlockDeviceQuery query, final Device device) {
return Invalidatable.of(device);
}
}

View File

@@ -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<IItemHandler> ITEM_HANDLER = CapabilityManager.get(new CapabilityToken<>() { });
public static final Capability<DeviceBusElement> DEVICE_BUS_ELEMENT = CapabilityManager.get(new CapabilityToken<>() { });
public static final Capability<Device> DEVICE = CapabilityManager.get(new CapabilityToken<>() { });
public static final Capability<RedstoneEmitter> REDSTONE_EMITTER = CapabilityManager.get(new CapabilityToken<>() { });
public static final Capability<NetworkInterface> NETWORK_INTERFACE = CapabilityManager.get(new CapabilityToken<>() { });
public static final Capability<TerminalUserProvider> 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);