--- a/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java
+++ b/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java
@@ -35,10 +35,13 @@
     public SculkCatalystBlockEntity(BlockPosition blockposition, IBlockData iblockdata) {
         super(TileEntityTypes.SCULK_CATALYST, blockposition, iblockdata);
         this.catalystListener = new SculkCatalystBlockEntity.CatalystListener(iblockdata, new BlockPositionSource(blockposition));
+        catalystListener.level = level; // CraftBukkit
     }
 
     public static void serverTick(World world, BlockPosition blockposition, IBlockData iblockdata, SculkCatalystBlockEntity sculkcatalystblockentity) {
+        org.bukkit.craftbukkit.event.CraftEventFactory.sourceBlockOverride = sculkcatalystblockentity.getBlockPos(); // CraftBukkit - SPIGOT-7068: Add source block override, not the most elegant way but better than passing down a BlockPosition up to five methods deep.
         sculkcatalystblockentity.catalystListener.getSculkSpreader().updateCursors(world, blockposition, world.getRandom(), true);
+        org.bukkit.craftbukkit.event.CraftEventFactory.sourceBlockOverride = null; // CraftBukkit
     }
 
     @Override
@@ -64,11 +67,13 @@
         final SculkSpreader sculkSpreader;
         private final IBlockData blockState;
         private final PositionSource positionSource;
+        private World level; // CraftBukkit
 
         public CatalystListener(IBlockData iblockdata, PositionSource positionsource) {
             this.blockState = iblockdata;
             this.positionSource = positionsource;
             this.sculkSpreader = SculkSpreader.createLevelSpreader();
+            this.sculkSpreader.level = level; // CraftBukkit
         }
 
         @Override
