Improve provider base class reusability.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user