--- a/net/minecraft/world/level/block/SculkSpreader.java
+++ b/net/minecraft/world/level/block/SculkSpreader.java
@@ -46,6 +_,7 @@
     private final int chargeDecayRate;
     private final int additionalDecayRate;
     private List<SculkSpreader.ChargeCursor> cursors = new ArrayList<>();
+    public net.minecraft.world.level.Level level; // CraftBukkit
 
     public SculkSpreader(
         boolean isWorldGeneration, TagKey<Block> replaceableBlocks, int growthSpawnCoat, int noGrowthRadius, int chargeDecayRate, int additionalDecayRate
@@ -101,7 +_,7 @@
 
     public void load(ValueInput input) {
         this.cursors.clear();
-        input.read("cursors", SculkSpreader.ChargeCursor.CODEC.sizeLimitedListOf(32)).orElse(List.of()).forEach(this::addCursor);
+        input.read("cursors", SculkSpreader.ChargeCursor.CODEC.sizeLimitedListOf(32)).orElse(List.of()).forEach((cursor) -> this.addCursor(cursor, false));  // Paper - don't fire event for block entity loading
     }
 
     public void save(ValueOutput output) {
@@ -111,13 +_,24 @@
     public void addCursors(BlockPos pos, int charge) {
         while (charge > 0) {
             int min = Math.min(charge, 1000);
-            this.addCursor(new SculkSpreader.ChargeCursor(pos, min));
+            this.addCursor(new SculkSpreader.ChargeCursor(pos, min), true); // Paper - allow firing event for other causes
             charge -= min;
         }
     }
 
-    private void addCursor(SculkSpreader.ChargeCursor cursor) {
+    private void addCursor(SculkSpreader.ChargeCursor cursor, boolean fireEvent) { // Paper - add boolean to conditionally fire SculkBloomEvent
         if (this.cursors.size() < 32) {
+            // CraftBukkit start
+            if (!this.isWorldGeneration() && fireEvent) { // CraftBukkit - SPIGOT-7475: Don't call event during world generation // Paper - add boolean to conditionally fire SculkBloomEvent
+                org.bukkit.craftbukkit.block.CraftBlock bukkitBlock = org.bukkit.craftbukkit.block.CraftBlock.at(this.level, cursor.pos);
+                org.bukkit.event.block.SculkBloomEvent event = new org.bukkit.event.block.SculkBloomEvent(bukkitBlock, cursor.getCharge());
+                if (!event.callEvent()) {
+                    return;
+                }
+
+                cursor.charge = event.getCharge();
+            }
+            // CraftBukkit end
             this.cursors.add(cursor);
         }
     }
