diff --git a/src/main/java/dan200/computercraft/shared/util/DropConsumer.java b/src/main/java/dan200/computercraft/shared/util/DropConsumer.java index 47a6915e9..23e40a9d6 100644 --- a/src/main/java/dan200/computercraft/shared/util/DropConsumer.java +++ b/src/main/java/dan200/computercraft/shared/util/DropConsumer.java @@ -13,11 +13,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.event.entity.EntityJoinWorldEvent; +import net.minecraftforge.event.entity.living.LivingDropsEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import java.util.function.Function; @@ -31,16 +31,16 @@ private DropConsumer() private static Function dropConsumer; private static List remainingDrops; - private static WeakReference dropWorld; + private static World dropWorld; private static AxisAlignedBB dropBounds; - private static WeakReference dropEntity; + private static Entity dropEntity; public static void set( Entity entity, Function consumer ) { dropConsumer = consumer; remainingDrops = new ArrayList<>(); - dropEntity = new WeakReference<>( entity ); - dropWorld = new WeakReference<>( entity.world ); + dropEntity = entity; + dropWorld = entity.world; dropBounds = new AxisAlignedBB( entity.getPosition() ).grow( 2, 2, 2 ); entity.captureDrops = true; @@ -51,26 +51,12 @@ public static void set( World world, BlockPos pos, Function( 2 ); dropEntity = null; - dropWorld = new WeakReference<>( world ); + dropWorld = world; dropBounds = new AxisAlignedBB( pos ).grow( 2, 2, 2 ); } public static List clear() { - if( dropEntity != null ) - { - Entity entity = dropEntity.get(); - if( entity != null ) - { - entity.captureDrops = false; - if( entity.capturedDrops != null ) - { - for( EntityItem entityItem : entity.capturedDrops ) handleDrops( entityItem.getItem() ); - entity.capturedDrops.clear(); - } - } - } - List remainingStacks = remainingDrops; dropConsumer = null; @@ -92,11 +78,20 @@ private static void handleDrops( ItemStack stack ) public static void onEntitySpawn( EntityJoinWorldEvent event ) { // Capture any nearby item spawns - if( dropWorld != null && dropWorld.get() == event.getWorld() && event.getEntity() instanceof EntityItem + if( dropWorld == event.getWorld() && event.getEntity() instanceof EntityItem && dropBounds.contains( event.getEntity().getPositionVector() ) ) { handleDrops( ((EntityItem) event.getEntity()).getItem() ); event.setCanceled( true ); } } + + @SubscribeEvent + public static void onLivingDrops( LivingDropsEvent drops ) + { + if( dropEntity == null || drops.getEntity() != dropEntity ) return; + + for( EntityItem drop : drops.getDrops() ) handleDrops( drop.getItem() ); + drops.setCanceled( true ); + } }