--- a/net/minecraft/world/level/block/StemBlock.java
+++ b/net/minecraft/world/level/block/StemBlock.java
@@ -80,11 +_,11 @@
     protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
         if (level.getRawBrightness(pos, 0) >= 9) {
             float growthSpeed = CropBlock.getGrowthSpeed(this, level, pos);
-            if (random.nextInt((int)(25.0F / growthSpeed) + 1) == 0) {
+            if (random.nextFloat() < ((this == Blocks.PUMPKIN_STEM ? level.spigotConfig.pumpkinModifier : level.spigotConfig.melonModifier) / (100.0f * (Math.floor((25.0F / growthSpeed) + 1))))) { // Spigot - SPIGOT-7159: Better modifier resolution
                 int ageValue = state.getValue(AGE);
                 if (ageValue < 7) {
                     state = state.setValue(AGE, Integer.valueOf(ageValue + 1));
-                    level.setBlock(pos, state, 2);
+                    org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state, 2); // CraftBukkit
                 } else {
                     Direction randomDirection = Direction.Plane.HORIZONTAL.getRandomDirection(random);
                     BlockPos blockPos = pos.relative(randomDirection);
@@ -94,7 +_,11 @@
                         Optional<Block> optional = registry.getOptional(this.fruit);
                         Optional<Block> optional1 = registry.getOptional(this.attachedStem);
                         if (optional.isPresent() && optional1.isPresent()) {
-                            level.setBlockAndUpdate(blockPos, optional.get().defaultBlockState());
+                            // CraftBukkit start
+                            if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, blockPos, optional.get().defaultBlockState())) {
+                                return;
+                            }
+                            // CraftBukkit end
                             level.setBlockAndUpdate(pos, optional1.get().defaultBlockState().setValue(HorizontalDirectionalBlock.FACING, randomDirection));
                         }
                     }
@@ -122,7 +_,7 @@
     public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) {
         int min = Math.min(7, state.getValue(AGE) + Mth.nextInt(level.random, 2, 5));
         BlockState blockState = state.setValue(AGE, Integer.valueOf(min));
-        level.setBlock(pos, blockState, 2);
+        org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, blockState, 2); // CraftBukkit
         if (min == 7) {
             blockState.randomTick(level, pos, level.random);
         }
