--- a/net/minecraft/world/level/block/PowderSnowBlock.java
+++ b/net/minecraft/world/level/block/PowderSnowBlock.java
@@ -60,6 +_,14 @@
 
     @Override
     protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+        // Paper start - Add EntityInsideBlockEvent
+        if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) {
+            if (entity instanceof net.minecraft.server.level.ServerPlayer player) {
+                player.resendPossiblyDesyncedDataValues(java.util.List.of(net.minecraft.world.entity.Entity.DATA_TICKS_FROZEN), player); // prevent desync on cancelled event
+            }
+            return;
+        }
+        // Paper end - Add EntityInsideBlockEvent
         if (!(entity instanceof LivingEntity) || entity.getInBlockState().is(this)) {
             entity.makeStuckInBlock(state, new Vec3(0.9F, 1.5, 0.9F));
             if (level.isClientSide()) {
@@ -85,8 +_,13 @@
             entity1 -> {
                 if (level instanceof ServerLevel serverLevel
                     && entity1.isOnFire()
-                    && (serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity1 instanceof Player)
+                        // CraftBukkit - move down
                     && entity1.mayInteract(serverLevel, blockPos)) {
+                    // CraftBukkit start
+                    if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity1, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity1 instanceof Player))) {
+                        return;
+                    }
+                    // CraftBukkit end
                     level.destroyBlock(blockPos, false);
                 }
             }
