--- a/net/minecraft/world/level/block/MushroomBlock.java
+++ b/net/minecraft/world/level/block/MushroomBlock.java
@@ -46,7 +_,7 @@
 
     @Override
     protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
-        if (random.nextInt(25) == 0) {
+        if (random.nextFloat() < (level.spigotConfig.mushroomModifier / (100.0F * 25))) { // Spigot - SPIGOT-7159: Better modifier resolution
             int i = 5;
             int i1 = 4;
 
@@ -59,6 +_,7 @@
             }
 
             BlockPos blockPos1 = pos.offset(random.nextInt(3) - 1, random.nextInt(2) - random.nextInt(2), random.nextInt(3) - 1);
+            final BlockPos sourcePos = pos; // Paper - Use correct source for mushroom block spread event
 
             for (int i2 = 0; i2 < 4; i2++) {
                 if (level.isEmptyBlock(blockPos1) && state.canSurvive(level, blockPos1)) {
@@ -69,7 +_,7 @@
             }
 
             if (level.isEmptyBlock(blockPos1) && state.canSurvive(level, blockPos1)) {
-                level.setBlock(blockPos1, state, 2);
+                org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, sourcePos, blockPos1, state, 2); // CraftBukkit // Paper - Use correct source for mushroom block spread event
             }
         }
     }
@@ -92,6 +_,7 @@
             return false;
         } else {
             level.removeBlock(pos, false);
+            SaplingBlock.treeType = (this == Blocks.BROWN_MUSHROOM) ? org.bukkit.TreeType.BROWN_MUSHROOM : org.bukkit.TreeType.RED_MUSHROOM; // CraftBukkit
             if (optional.get().value().place(level, level.getChunkSource().getGenerator(), random, pos)) {
                 return true;
             } else {
