Improve provider base class reusability.

This commit is contained in:
Florian Nücke
2020-12-01 02:41:14 +01:00
parent b2cb09b4ee
commit 888933456d
7 changed files with 96 additions and 47 deletions

View File

@@ -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<TCapability> extends AbstractCapabilityTileEntityDeviceProvider<TCapability, TileEntity> {
public AbstractCapabilityAnyTileEntityDeviceProvider(final Supplier<Capability<TCapability>> capabilitySupplier) {
super(TileEntity.class, capabilitySupplier);
}
}

View File

@@ -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<T> implements DeviceProvider {
private final Supplier<Capability<T>> capabilitySupplier;
protected AbstractCapabilityBlockDeviceProvider(final Supplier<Capability<T>> capabilitySupplier) {
this.capabilitySupplier = capabilitySupplier;
}
@Override
public LazyOptional<Device> 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<T> capability = capabilitySupplier.get();
if (capability == null) throw new IllegalStateException();
final LazyOptional<T> optional = tileEntity.getCapability(capability, blockQuery.getQuerySide());
if (optional.isPresent()) {
return optional.map(this::getDevice);
}
}
}
return LazyOptional.empty();
}
protected abstract Device getDevice(final T value);
}

View File

@@ -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<TCapability, TTileEntity extends TileEntity> extends AbstractTileEntityDeviceProvider<TTileEntity> {
private final Supplier<Capability<TCapability>> capabilitySupplier;
protected AbstractCapabilityTileEntityDeviceProvider(final Class<TTileEntity> tileEntityType, final Supplier<Capability<TCapability>> capabilitySupplier) {
super(tileEntityType);
this.capabilitySupplier = capabilitySupplier;
}
@Override
protected final LazyOptional<Device> getDevice(final BlockDeviceQuery blockQuery, final TileEntity tileEntity) {
final Capability<TCapability> capability = capabilitySupplier.get();
if (capability == null) throw new IllegalStateException();
final LazyOptional<TCapability> optional = tileEntity.getCapability(capability, blockQuery.getQuerySide());
if (!optional.isPresent()) {
return LazyOptional.empty();
}
final TCapability value = optional.orElseThrow(AssertionError::new);
final LazyOptional<Device> device = getDevice(blockQuery, value);
optional.addListener(ignored -> device.invalidate());
return device;
}
protected abstract LazyOptional<Device> getDevice(final BlockDeviceQuery query, final TCapability value);
}

View File

@@ -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<T extends TileEntity> implements DeviceProvider {
private final Class<T> tileEntityType;
protected AbstractTileEntityDeviceProvider(final Class<T> tileEntityType) {
this.tileEntityType = tileEntityType;
}
@SuppressWarnings("unchecked")
@Override
public LazyOptional<Device> 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<Device> getDevice(final BlockDeviceQuery query, final T tileEntity);
}

View File

@@ -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<IEnergyStorage> {
public class EnergyStorageDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider<IEnergyStorage> {
public EnergyStorageDeviceProvider() {
super(() -> Capabilities.ENERGY_STORAGE_CAPABILITY);
}
@Override
protected Device getDevice(final IEnergyStorage value) {
return new EnergyStorageDevice(value);
protected LazyOptional<Device> getDevice(final BlockDeviceQuery query, final IEnergyStorage value) {
return LazyOptional.of(() -> new EnergyStorageDevice(value));
}
public static final class EnergyStorageDevice extends ObjectDevice {

View File

@@ -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<IFluidHandler> {
public class FluidHandlerDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider<IFluidHandler> {
public FluidHandlerDeviceProvider() {
super(() -> Capabilities.FLUID_HANDLER_CAPABILITY);
}
@Override
protected Device getDevice(final IFluidHandler value) {
return new FluidHandlerDevice(value);
protected LazyOptional<Device> getDevice(final BlockDeviceQuery query, final IFluidHandler value) {
return LazyOptional.of(() -> new FluidHandlerDevice(value));
}
public static final class FluidHandlerDevice extends ObjectDevice {

View File

@@ -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<IItemHandler> {
public class ItemHandlerDeviceProvider extends AbstractCapabilityAnyTileEntityDeviceProvider<IItemHandler> {
public ItemHandlerDeviceProvider() {
super(() -> Capabilities.ITEM_HANDLER_CAPABILITY);
}
@Override
protected Device getDevice(final IItemHandler value) {
return new ItemHandlerDevice(value);
protected LazyOptional<Device> getDevice(final BlockDeviceQuery query, final IItemHandler value) {
return LazyOptional.of(() -> new ItemHandlerDevice(value));
}
public static final class ItemHandlerDevice extends ObjectDevice {