--- a/net/minecraft/world/level/block/ChorusFlowerBlock.java
+++ b/net/minecraft/world/level/block/ChorusFlowerBlock.java
@@ -96,8 +_,10 @@
                 }
 
                 if (flag && allNeighborsEmpty(level, blockPos, null) && level.isEmptyBlock(pos.above(2))) {
+                    if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos, this.defaultBlockState().setValue(AGE, ageValue), 2)) { // CraftBukkit - add event
                     level.setBlock(pos, ChorusPlantBlock.getStateWithConnections(level, pos, this.plant.defaultBlockState()), 2);
                     this.placeGrownFlower(level, blockPos, ageValue);
+                    } // CraftBukkit
                 } else if (ageValue < 4) {
                     int i = random.nextInt(4);
                     if (flag1) {
@@ -112,30 +_,40 @@
                         if (level.isEmptyBlock(blockPos1)
                             && level.isEmptyBlock(blockPos1.below())
                             && allNeighborsEmpty(level, blockPos1, randomDirection.getOpposite())) {
+                            if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos1, this.defaultBlockState().setValue(AGE, ageValue + 1), 2)) { // CraftBukkit - add event
                             this.placeGrownFlower(level, blockPos1, ageValue + 1);
                             flag2 = true;
+                            } // CraftBukkit
                         }
                     }
 
                     if (flag2) {
                         level.setBlock(pos, ChorusPlantBlock.getStateWithConnections(level, pos, this.plant.defaultBlockState()), 2);
                     } else {
+                        // CraftBukkit start - add event
+                        if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, this.defaultBlockState().setValue(AGE, 5), 2)) {
                         this.placeDeadFlower(level, pos);
+                        }
+                        // CraftBukkit end
                     }
                 } else {
+                    // CraftBukkit start - add event
+                    if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, this.defaultBlockState().setValue(AGE, 5), 2)) {
                     this.placeDeadFlower(level, pos);
+                    }
+                    // CraftBukkit end
                 }
             }
         }
     }
 
     private void placeGrownFlower(Level level, BlockPos pos, int age) {
-        level.setBlock(pos, this.defaultBlockState().setValue(AGE, age), 2);
+        // level.setBlock(pos, this.defaultBlockState().setValue(AGE, age), 2); // Paper - already done above in the event call
         level.levelEvent(1033, pos, 0);
     }
 
     private void placeDeadFlower(Level level, BlockPos pos) {
-        level.setBlock(pos, this.defaultBlockState().setValue(AGE, 5), 2);
+        // level.setBlock(pos, this.defaultBlockState().setValue(AGE, 5), 2); // Paper - already done above in the event call
         level.levelEvent(1034, pos, 0);
     }
 
@@ -261,6 +_,11 @@
     protected void onProjectileHit(Level level, BlockState state, BlockHitResult hit, Projectile projectile) {
         BlockPos blockPos = hit.getBlockPos();
         if (level instanceof ServerLevel serverLevel && projectile.mayInteract(serverLevel, blockPos) && projectile.mayBreak(serverLevel)) {
+            // CraftBukkit start
+            if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(projectile, blockPos, state.getFluidState().createLegacyBlock())) { // Paper - fix wrong block state
+                return;
+            }
+            // CraftBukkit end
             level.destroyBlock(blockPos, true, projectile);
         }
     }
