--- a/net/minecraft/world/level/block/BlockChorusFlower.java
+++ b/net/minecraft/world/level/block/BlockChorusFlower.java
@@ -22,6 +22,8 @@
 import net.minecraft.world.phys.MovingObjectPositionBlock;
 import net.minecraft.world.phys.shapes.VoxelShape;
 
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
+
 public class BlockChorusFlower extends Block {
 
     public static final MapCodec<BlockChorusFlower> CODEC = RecordCodecBuilder.mapCodec((instance) -> {
@@ -102,8 +104,12 @@
                 }
 
                 if (flag && allNeighborsEmpty(worldserver, blockposition1, (EnumDirection) null) && worldserver.isEmptyBlock(blockposition.above(2))) {
-                    worldserver.setBlock(blockposition, BlockChorusFruit.getStateWithConnections(worldserver, blockposition, this.plant.defaultBlockState()), 2);
-                    this.placeGrownFlower(worldserver, blockposition1, i);
+                    // CraftBukkit start - add event
+                    if (CraftEventFactory.handleBlockSpreadEvent(worldserver, blockposition, blockposition1, this.defaultBlockState().setValue(BlockChorusFlower.AGE, Integer.valueOf(i)), 2)) {
+                        worldserver.setBlock(blockposition, BlockChorusFruit.getStateWithConnections(worldserver, blockposition, this.plant.defaultBlockState()), 2);
+                        this.placeGrownFlower(worldserver, blockposition1, i);
+                    }
+                    // CraftBukkit end
                 } else if (i < 4) {
                     j = randomsource.nextInt(4);
                     if (flag1) {
@@ -117,18 +123,30 @@
                         BlockPosition blockposition2 = blockposition.relative(enumdirection);
 
                         if (worldserver.isEmptyBlock(blockposition2) && worldserver.isEmptyBlock(blockposition2.below()) && allNeighborsEmpty(worldserver, blockposition2, enumdirection.getOpposite())) {
-                            this.placeGrownFlower(worldserver, blockposition2, i + 1);
-                            flag2 = true;
+                            // CraftBukkit start - add event
+                            if (CraftEventFactory.handleBlockSpreadEvent(worldserver, blockposition, blockposition2, this.defaultBlockState().setValue(BlockChorusFlower.AGE, Integer.valueOf(i + 1)), 2)) {
+                                this.placeGrownFlower(worldserver, blockposition2, i + 1);
+                                flag2 = true;
+                            }
+                            // CraftBukkit end
                         }
                     }
 
                     if (flag2) {
                         worldserver.setBlock(blockposition, BlockChorusFruit.getStateWithConnections(worldserver, blockposition, this.plant.defaultBlockState()), 2);
                     } else {
-                        this.placeDeadFlower(worldserver, blockposition);
+                        // CraftBukkit start - add event
+                        if (CraftEventFactory.handleBlockGrowEvent(worldserver, blockposition, this.defaultBlockState().setValue(BlockChorusFlower.AGE, Integer.valueOf(5)), 2)) {
+                            this.placeDeadFlower(worldserver, blockposition);
+                        }
+                        // CraftBukkit end
                     }
                 } else {
-                    this.placeDeadFlower(worldserver, blockposition);
+                    // CraftBukkit start - add event
+                    if (CraftEventFactory.handleBlockGrowEvent(worldserver, blockposition, this.defaultBlockState().setValue(BlockChorusFlower.AGE, Integer.valueOf(5)), 2)) {
+                        this.placeDeadFlower(worldserver, blockposition);
+                    }
+                    // CraftBukkit end
                 }
 
             }
@@ -265,6 +283,11 @@
         BlockPosition blockposition = movingobjectpositionblock.getBlockPos();
 
         if (!world.isClientSide && iprojectile.mayInteract(world, blockposition) && iprojectile.mayBreak(world)) {
+            // CraftBukkit
+            if (!CraftEventFactory.callEntityChangeBlockEvent(iprojectile, blockposition, Blocks.AIR.defaultBlockState())) {
+                return;
+            }
+            // CraftBukkit end
             world.destroyBlock(blockposition, true, iprojectile);
         }
 
