From 9d44f1ca661bf67845be572da35e2288bf031ae8 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 28 Nov 2021 12:47:08 +0000 Subject: [PATCH] Make capability invalidation callbacks less strict Forge!! *shakes fist*. --- .../dan200/computercraft/shared/Peripherals.java | 4 ++-- .../shared/computer/blocks/TileComputerBase.java | 5 ++--- .../generic/GenericPeripheralProvider.java | 11 +++-------- .../modem/wired/WiredModemLocalPeripheral.java | 3 +-- .../computercraft/shared/util/CapabilityUtil.java | 12 ++++++++++-- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/java/dan200/computercraft/shared/Peripherals.java b/src/main/java/dan200/computercraft/shared/Peripherals.java index 1f809ccb9..86978d3e5 100644 --- a/src/main/java/dan200/computercraft/shared/Peripherals.java +++ b/src/main/java/dan200/computercraft/shared/Peripherals.java @@ -38,13 +38,13 @@ public static synchronized void register( @Nonnull IPeripheralProvider provider } @Nullable - public static IPeripheral getPeripheral( World world, BlockPos pos, Direction side, NonNullConsumer> invalidate ) + public static IPeripheral getPeripheral( World world, BlockPos pos, Direction side, NonNullConsumer invalidate ) { return World.isInWorldBounds( pos ) && !world.isClientSide ? getPeripheralAt( world, pos, side, invalidate ) : null; } @Nullable - private static IPeripheral getPeripheralAt( World world, BlockPos pos, Direction side, NonNullConsumer> invalidate ) + private static IPeripheral getPeripheralAt( World world, BlockPos pos, Direction side, NonNullConsumer invalidate ) { TileEntity block = world.getBlockEntity( pos ); if( block != null ) diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java index e87d78a09..9afcebff5 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputerBase.java @@ -39,7 +39,6 @@ import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; -import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.NonNullConsumer; import javax.annotation.Nonnull; @@ -58,7 +57,7 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT private boolean on = false; boolean startOn = false; private boolean fresh = false; - private final NonNullConsumer>[] invalidate; + private final NonNullConsumer[] invalidate; private final ComputerFamily family; @@ -69,7 +68,7 @@ public TileComputerBase( TileEntityType type, ComputerFam // We cache these so we can guarantee we only ever register one listener for adjacent capabilities. @SuppressWarnings( { "unchecked", "rawtypes" } ) - NonNullConsumer>[] invalidate = this.invalidate = new NonNullConsumer[6]; + NonNullConsumer[] invalidate = this.invalidate = new NonNullConsumer[6]; for( Direction direction : Direction.values() ) { invalidate[direction.ordinal()] = o -> updateInput( direction ); diff --git a/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java b/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java index d6918a1fd..54ab72c2f 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/generic/GenericPeripheralProvider.java @@ -9,6 +9,7 @@ import dan200.computercraft.api.peripheral.PeripheralType; import dan200.computercraft.core.asm.NamedMethod; import dan200.computercraft.core.asm.PeripheralMethod; +import dan200.computercraft.shared.util.CapabilityUtil; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; @@ -34,7 +35,7 @@ public static synchronized void addCapability( Capability capability ) } @Nullable - public static IPeripheral getPeripheral( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side, NonNullConsumer> invalidate ) + public static IPeripheral getPeripheral( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Direction side, NonNullConsumer invalidate ) { TileEntity tile = world.getBlockEntity( pos ); if( tile == null ) return null; @@ -52,7 +53,7 @@ public static IPeripheral getPeripheral( @Nonnull World world, @Nonnull BlockPos if( capabilityMethods.isEmpty() ) return; saturated.addMethods( contents, capabilityMethods ); - wrapper.addListener( cast( invalidate ) ); + CapabilityUtil.addListener( wrapper, invalidate ); } ); } @@ -91,10 +92,4 @@ void addMethods( Object target, List> methods ) } } } - - @SuppressWarnings( { "unchecked", "rawtypes" } ) - private static NonNullConsumer cast( NonNullConsumer consumer ) - { - return (NonNullConsumer) consumer; - } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java index 156bc72a1..80ddbad55 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/WiredModemLocalPeripheral.java @@ -15,7 +15,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; -import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.NonNullConsumer; import javax.annotation.Nonnull; @@ -38,7 +37,7 @@ public final class WiredModemLocalPeripheral private String type; private IPeripheral peripheral; - private final NonNullConsumer> invalidate; + private final NonNullConsumer invalidate; public WiredModemLocalPeripheral( @Nonnull Runnable invalidate ) { diff --git a/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java b/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java index e542294d5..af5bf42e4 100644 --- a/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java +++ b/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java @@ -35,12 +35,20 @@ public static void invalidate( @Nullable LazyOptional[] caps ) } } + public static void addListener( LazyOptional p, NonNullConsumer> invalidate ) + { + // We can make this safe with invalidate::accept, but then we're allocating it's just kind of absurd. + @SuppressWarnings( "unchecked" ) + NonNullConsumer> safeInvalidate = (NonNullConsumer>) invalidate; + p.addListener( safeInvalidate ); + } + @Nullable - public static T unwrap( LazyOptional p, NonNullConsumer> invalidate ) + public static T unwrap( LazyOptional p, NonNullConsumer> invalidate ) { if( !p.isPresent() ) return null; - p.addListener( invalidate ); + addListener( p, invalidate ); return p.orElseThrow( NullPointerException::new ); }