--- a/net/minecraft/world/level/block/BushBlock.java
+++ b/net/minecraft/world/level/block/BushBlock.java
@@ -12,6 +12,7 @@
 import net.minecraft.world.level.pathfinder.PathComputationType;
 
 public abstract class BushBlock extends Block {
+
     protected BushBlock(BlockBehaviour.Properties settings) {
         super(settings);
     }
@@ -25,13 +26,21 @@
 
     @Override
     protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) {
-        return !state.canSurvive(world, pos) ? Blocks.AIR.defaultBlockState() : super.updateShape(state, direction, neighborState, world, pos, neighborPos);
+        // CraftBukkit start
+        if (!state.canSurvive(world, pos)) {
+            if (!(world instanceof net.minecraft.server.level.ServerLevel && ((net.minecraft.server.level.ServerLevel) world).hasPhysicsEvent) || !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPhysicsEvent(world, pos).isCancelled()) { // Paper
+                return Blocks.AIR.defaultBlockState();
+            }
+        }
+        return super.updateShape(state, direction, neighborState, world, pos, neighborPos);
+        // CraftBukkit end
     }
 
     @Override
     protected boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) {
-        BlockPos blockPos = pos.below();
-        return this.mayPlaceOn(world.getBlockState(blockPos), world, blockPos);
+        BlockPos blockposition1 = pos.below();
+
+        return this.mayPlaceOn(world.getBlockState(blockposition1), world, blockposition1);
     }
 
     @Override
@@ -41,6 +50,6 @@
 
     @Override
     protected boolean isPathfindable(BlockState state, PathComputationType type) {
-        return type == PathComputationType.AIR && !this.hasCollision || super.isPathfindable(state, type);
+        return type == PathComputationType.AIR && !this.hasCollision ? true : super.isPathfindable(state, type);
     }
 }
