--- a/net/minecraft/world/level/block/SculkSpreader.java
+++ b/net/minecraft/world/level/block/SculkSpreader.java
@@ -41,6 +41,14 @@
 import net.minecraft.world.level.block.state.IBlockData;
 import org.slf4j.Logger;
 
+// CraftBukkit start
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.world.level.World;
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.block.CraftBlock;
+import org.bukkit.event.block.SculkBloomEvent;
+// CraftBukkit end
+
 public class SculkSpreader {
 
     public static final int MAX_GROWTH_RATE_RADIUS = 24;
@@ -57,6 +65,7 @@
     private final int additionalDecayRate;
     private List<SculkSpreader.a> cursors = new ArrayList();
     private static final Logger LOGGER = LogUtils.getLogger();
+    public World level; // CraftBukkit
 
     public SculkSpreader(boolean flag, TagKey<Block> tagkey, int i, int j, int k, int l) {
         this.isWorldGeneration = flag;
@@ -111,7 +120,7 @@
     public void load(NBTTagCompound nbttagcompound) {
         if (nbttagcompound.contains("cursors", 9)) {
             this.cursors.clear();
-            DataResult dataresult = SculkSpreader.a.CODEC.listOf().parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getList("cursors", 10)));
+            DataResult<List<SculkSpreader.a>> dataresult = SculkSpreader.a.CODEC.listOf().parse(new Dynamic<>(DynamicOpsNBT.INSTANCE, nbttagcompound.getList("cursors", 10))); // CraftBukkit - decompile error
             Logger logger = SculkSpreader.LOGGER;
 
             Objects.requireNonNull(logger);
@@ -126,7 +135,7 @@
     }
 
     public void save(NBTTagCompound nbttagcompound) {
-        DataResult dataresult = SculkSpreader.a.CODEC.listOf().encodeStart(DynamicOpsNBT.INSTANCE, this.cursors);
+        DataResult<NBTBase> dataresult = SculkSpreader.a.CODEC.listOf().encodeStart(DynamicOpsNBT.INSTANCE, this.cursors); // CraftBukkit - decompile error
         Logger logger = SculkSpreader.LOGGER;
 
         Objects.requireNonNull(logger);
@@ -147,6 +156,19 @@
 
     private void addCursor(SculkSpreader.a sculkspreader_a) {
         if (this.cursors.size() < 32) {
+            // CraftBukkit start
+            if (!isWorldGeneration()) { // CraftBukkit - SPIGOT-7475: Don't call event during world generation
+                CraftBlock bukkitBlock = CraftBlock.at(level, sculkspreader_a.pos);
+                SculkBloomEvent event = new SculkBloomEvent(bukkitBlock, sculkspreader_a.getCharge());
+                Bukkit.getPluginManager().callEvent(event);
+                if (event.isCancelled()) {
+                    return;
+                }
+
+                sculkspreader_a.charge = event.getCharge();
+            }
+            // CraftBukkit end
+
             this.cursors.add(sculkspreader_a);
         }
     }
@@ -244,7 +266,7 @@
             this.charge = i;
             this.decayDelay = j;
             this.updateDelay = k;
-            this.facings = (Set) optional.orElse((Object) null);
+            this.facings = (Set) optional.orElse(null); // CraftBukkit - decompile error
         }
 
         public a(BlockPosition blockposition, int i) {
