--- a/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java
+++ b/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java
@@ -21,11 +21,14 @@
 import net.minecraft.world.phys.Vec3;
 
 public class SculkCatalystBlockEntity extends BlockEntity implements GameEventListener {
-    private final BlockPositionSource blockPosSource = new BlockPositionSource(this.worldPosition);
-    private final SculkSpreader sculkSpreader = SculkSpreader.createLevelSpreader();
+
+    private final BlockPositionSource blockPosSource;
+    private final SculkSpreader sculkSpreader;
 
     public SculkCatalystBlockEntity(BlockPos pos, BlockState state) {
         super(BlockEntityType.SCULK_CATALYST, pos, state);
+        this.blockPosSource = new BlockPositionSource(this.worldPosition);
+        this.sculkSpreader = SculkSpreader.createLevelSpreader();
     }
 
     @Override
@@ -46,17 +49,20 @@
     @Override
     public boolean handleGameEvent(ServerLevel world, GameEvent event, GameEvent.Context emitter, Vec3 emitterPos) {
         if (event == GameEvent.ENTITY_DIE) {
-            Entity i = emitter.sourceEntity();
-            if (i instanceof LivingEntity) {
-                LivingEntity livingEntity = (LivingEntity)i;
-                if (!livingEntity.wasExperienceConsumed()) {
-                    int i = livingEntity.getExperienceReward();
-                    if (livingEntity.shouldDropExperience() && i > 0) {
+            Entity entity = emitter.sourceEntity();
+
+            if (entity instanceof LivingEntity) {
+                LivingEntity entityliving = (LivingEntity) entity;
+
+                if (!entityliving.wasExperienceConsumed()) {
+                    int i = entityliving.getExperienceReward();
+
+                    if (entityliving.shouldDropExperience() && i > 0) {
                         this.sculkSpreader.addCursors(new BlockPos(emitterPos.relative(Direction.UP, 0.5D)), i);
-                        this.tryAwardItSpreadsAdvancement(livingEntity);
+                        this.tryAwardItSpreadsAdvancement(entityliving);
                     }
 
-                    livingEntity.skipDropExperience();
+                    entityliving.skipDropExperience();
                     SculkCatalystBlock.bloom(world, this.worldPosition, this.getBlockState(), world.getRandom());
                 }
 
@@ -68,16 +74,21 @@
     }
 
     private void tryAwardItSpreadsAdvancement(LivingEntity deadEntity) {
-        LivingEntity livingEntity = deadEntity.getLastHurtByMob();
-        if (livingEntity instanceof ServerPlayer serverPlayer) {
-            DamageSource damageSource = deadEntity.getLastDamageSource() == null ? DamageSource.playerAttack(serverPlayer) : deadEntity.getLastDamageSource();
-            CriteriaTriggers.KILL_MOB_NEAR_SCULK_CATALYST.trigger(serverPlayer, deadEntity, damageSource);
+        LivingEntity entityliving1 = deadEntity.getLastHurtByMob();
+
+        if (entityliving1 instanceof ServerPlayer) {
+            ServerPlayer entityplayer = (ServerPlayer) entityliving1;
+            DamageSource damagesource = deadEntity.getLastDamageSource() == null ? DamageSource.playerAttack(entityplayer) : deadEntity.getLastDamageSource();
+
+            CriteriaTriggers.KILL_MOB_NEAR_SCULK_CATALYST.trigger(entityplayer, deadEntity, damagesource);
         }
 
     }
 
     public static void serverTick(Level world, BlockPos pos, BlockState state, SculkCatalystBlockEntity blockEntity) {
+        org.bukkit.craftbukkit.v1_19_R2.event.CraftEventFactory.sourceBlockOverride = blockEntity.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.
         blockEntity.sculkSpreader.updateCursors(world, pos, world.getRandom(), true);
+        org.bukkit.craftbukkit.v1_19_R2.event.CraftEventFactory.sourceBlockOverride = null; // CraftBukkit
     }
 
     @Override
