From 888933456d7c3897e83ce592ab54cda5f608db48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Tue, 1 Dec 2020 02:41:14 +0100 Subject: [PATCH] Improve provider base class reusability. --- ...CapabilityAnyTileEntityDeviceProvider.java | 12 ++++++ ...AbstractCapabilityBlockDeviceProvider.java | 38 ------------------- ...actCapabilityTileEntityDeviceProvider.java | 35 +++++++++++++++++ .../AbstractTileEntityDeviceProvider.java | 34 +++++++++++++++++ .../provider/EnergyStorageDeviceProvider.java | 8 ++-- .../provider/FluidHandlerDeviceProvider.java | 8 ++-- .../provider/ItemHandlerDeviceProvider.java | 8 ++-- 7 files changed, 96 insertions(+), 47 deletions(-) create mode 100644 src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityAnyTileEntityDeviceProvider.java delete mode 100644 src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityBlockDeviceProvider.java create mode 100644 src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityTileEntityDeviceProvider.java create mode 100644 src/main/java/li/cil/oc2/common/device/provider/AbstractTileEntityDeviceProvider.java diff --git a/src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityAnyTileEntityDeviceProvider.java b/src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityAnyTileEntityDeviceProvider.java new file mode 100644 index 00000000..f8ca6daa --- /dev/null +++ b/src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityAnyTileEntityDeviceProvider.java @@ -0,0 +1,12 @@ +package li.cil.oc2.common.device.provider; + +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.capabilities.Capability; + +import java.util.function.Supplier; + +public abstract class AbstractCapabilityAnyTileEntityDeviceProvider extends AbstractCapabilityTileEntityDeviceProvider { + public AbstractCapabilityAnyTileEntityDeviceProvider(final Supplier> capabilitySupplier) { + super(TileEntity.class, capabilitySupplier); + } +} diff --git a/src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityBlockDeviceProvider.java b/src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityBlockDeviceProvider.java deleted file mode 100644 index d7522fd2..00000000 --- a/src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityBlockDeviceProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -package li.cil.oc2.common.device.provider; - -import li.cil.oc2.api.device.Device; -import li.cil.oc2.api.device.provider.BlockDeviceQuery; -import li.cil.oc2.api.device.provider.DeviceProvider; -import li.cil.oc2.api.device.provider.DeviceQuery; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.util.LazyOptional; - -import java.util.function.Supplier; - -public abstract class AbstractCapabilityBlockDeviceProvider implements DeviceProvider { - private final Supplier> capabilitySupplier; - - protected AbstractCapabilityBlockDeviceProvider(final Supplier> capabilitySupplier) { - this.capabilitySupplier = capabilitySupplier; - } - - @Override - public LazyOptional getDevice(final DeviceQuery query) { - if (query instanceof BlockDeviceQuery) { - final BlockDeviceQuery blockQuery = (BlockDeviceQuery) query; - final TileEntity tileEntity = blockQuery.getWorld().getTileEntity(blockQuery.getQueryPosition()); - if (tileEntity != null) { - final Capability capability = capabilitySupplier.get(); - if (capability == null) throw new IllegalStateException(); - final LazyOptional optional = tileEntity.getCapability(capability, blockQuery.getQuerySide()); - if (optional.isPresent()) { - return optional.map(this::getDevice); - } - } - } - return LazyOptional.empty(); - } - - protected abstract Device getDevice(final T value); -} diff --git a/src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityTileEntityDeviceProvider.java b/src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityTileEntityDeviceProvider.java new file mode 100644 index 00000000..f37b2fa8 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/device/provider/AbstractCapabilityTileEntityDeviceProvider.java @@ -0,0 +1,35 @@ +package li.cil.oc2.common.device.provider; + +import li.cil.oc2.api.device.Device; +import li.cil.oc2.api.device.provider.BlockDeviceQuery; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; + +import java.util.function.Supplier; + +public abstract class AbstractCapabilityTileEntityDeviceProvider extends AbstractTileEntityDeviceProvider { + private final Supplier> capabilitySupplier; + + protected AbstractCapabilityTileEntityDeviceProvider(final Class tileEntityType, final Supplier> capabilitySupplier) { + super(tileEntityType); + this.capabilitySupplier = capabilitySupplier; + } + + @Override + protected final LazyOptional getDevice(final BlockDeviceQuery blockQuery, final TileEntity tileEntity) { + final Capability capability = capabilitySupplier.get(); + if (capability == null) throw new IllegalStateException(); + final LazyOptional optional = tileEntity.getCapability(capability, blockQuery.getQuerySide()); + if (!optional.isPresent()) { + return LazyOptional.empty(); + } + + final TCapability value = optional.orElseThrow(AssertionError::new); + final LazyOptional device = getDevice(blockQuery, value); + optional.addListener(ignored -> device.invalidate()); + return device; + } + + protected abstract LazyOptional getDevice(final BlockDeviceQuery query, final TCapability value); +} diff --git a/src/main/java/li/cil/oc2/common/device/provider/AbstractTileEntityDeviceProvider.java b/src/main/java/li/cil/oc2/common/device/provider/AbstractTileEntityDeviceProvider.java new file mode 100644 index 00000000..dda21918 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/device/provider/AbstractTileEntityDeviceProvider.java @@ -0,0 +1,34 @@ +package li.cil.oc2.common.device.provider; + +import li.cil.oc2.api.device.Device; +import li.cil.oc2.api.device.provider.BlockDeviceQuery; +import li.cil.oc2.api.device.provider.DeviceProvider; +import li.cil.oc2.api.device.provider.DeviceQuery; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.LazyOptional; + +public abstract class AbstractTileEntityDeviceProvider implements DeviceProvider { + private final Class tileEntityType; + + protected AbstractTileEntityDeviceProvider(final Class tileEntityType) { + this.tileEntityType = tileEntityType; + } + + @SuppressWarnings("unchecked") + @Override + public LazyOptional getDevice(final DeviceQuery query) { + if (!(query instanceof BlockDeviceQuery)) { + return LazyOptional.empty(); + } + + final BlockDeviceQuery blockQuery = (BlockDeviceQuery) query; + final TileEntity tileEntity = blockQuery.getWorld().getTileEntity(blockQuery.getQueryPosition()); + if (!tileEntityType.isInstance(tileEntity)) { + return LazyOptional.empty(); + } + + return getDevice(blockQuery, (T) tileEntity); + } + + protected abstract LazyOptional getDevice(final BlockDeviceQuery query, final T tileEntity); +} diff --git a/src/main/java/li/cil/oc2/common/device/provider/EnergyStorageDeviceProvider.java b/src/main/java/li/cil/oc2/common/device/provider/EnergyStorageDeviceProvider.java index a799c9cf..bb565f29 100644 --- a/src/main/java/li/cil/oc2/common/device/provider/EnergyStorageDeviceProvider.java +++ b/src/main/java/li/cil/oc2/common/device/provider/EnergyStorageDeviceProvider.java @@ -3,17 +3,19 @@ package li.cil.oc2.common.device.provider; import li.cil.oc2.api.device.Device; import li.cil.oc2.api.device.object.Callback; import li.cil.oc2.api.device.object.ObjectDevice; +import li.cil.oc2.api.device.provider.BlockDeviceQuery; import li.cil.oc2.common.capabilities.Capabilities; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.energy.IEnergyStorage; -public class EnergyStorageDeviceProvider extends AbstractCapabilityBlockDeviceProvider { +public class EnergyStorageDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider { public EnergyStorageDeviceProvider() { super(() -> Capabilities.ENERGY_STORAGE_CAPABILITY); } @Override - protected Device getDevice(final IEnergyStorage value) { - return new EnergyStorageDevice(value); + protected LazyOptional getDevice(final BlockDeviceQuery query, final IEnergyStorage value) { + return LazyOptional.of(() -> new EnergyStorageDevice(value)); } public static final class EnergyStorageDevice extends ObjectDevice { diff --git a/src/main/java/li/cil/oc2/common/device/provider/FluidHandlerDeviceProvider.java b/src/main/java/li/cil/oc2/common/device/provider/FluidHandlerDeviceProvider.java index 6e1374b8..ace8f6d9 100644 --- a/src/main/java/li/cil/oc2/common/device/provider/FluidHandlerDeviceProvider.java +++ b/src/main/java/li/cil/oc2/common/device/provider/FluidHandlerDeviceProvider.java @@ -3,18 +3,20 @@ package li.cil.oc2.common.device.provider; import li.cil.oc2.api.device.Device; import li.cil.oc2.api.device.object.Callback; import li.cil.oc2.api.device.object.ObjectDevice; +import li.cil.oc2.api.device.provider.BlockDeviceQuery; import li.cil.oc2.common.capabilities.Capabilities; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; -public class FluidHandlerDeviceProvider extends AbstractCapabilityBlockDeviceProvider { +public class FluidHandlerDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider { public FluidHandlerDeviceProvider() { super(() -> Capabilities.FLUID_HANDLER_CAPABILITY); } @Override - protected Device getDevice(final IFluidHandler value) { - return new FluidHandlerDevice(value); + protected LazyOptional getDevice(final BlockDeviceQuery query, final IFluidHandler value) { + return LazyOptional.of(() -> new FluidHandlerDevice(value)); } public static final class FluidHandlerDevice extends ObjectDevice { diff --git a/src/main/java/li/cil/oc2/common/device/provider/ItemHandlerDeviceProvider.java b/src/main/java/li/cil/oc2/common/device/provider/ItemHandlerDeviceProvider.java index 2a5c1d3b..b59f3ff7 100644 --- a/src/main/java/li/cil/oc2/common/device/provider/ItemHandlerDeviceProvider.java +++ b/src/main/java/li/cil/oc2/common/device/provider/ItemHandlerDeviceProvider.java @@ -3,18 +3,20 @@ package li.cil.oc2.common.device.provider; import li.cil.oc2.api.device.Device; import li.cil.oc2.api.device.object.Callback; import li.cil.oc2.api.device.object.ObjectDevice; +import li.cil.oc2.api.device.provider.BlockDeviceQuery; import li.cil.oc2.common.capabilities.Capabilities; import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; -public class ItemHandlerDeviceProvider extends AbstractCapabilityBlockDeviceProvider { +public class ItemHandlerDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider { public ItemHandlerDeviceProvider() { super(() -> Capabilities.ITEM_HANDLER_CAPABILITY); } @Override - protected Device getDevice(final IItemHandler value) { - return new ItemHandlerDevice(value); + protected LazyOptional getDevice(final BlockDeviceQuery query, final IItemHandler value) { + return LazyOptional.of(() -> new ItemHandlerDevice(value)); } public static final class ItemHandlerDevice extends ObjectDevice {