--- a/net/minecraft/world/level/block/IceBlock.java
+++ b/net/minecraft/world/level/block/IceBlock.java
@@ -16,11 +16,12 @@
 import net.minecraft.world.level.block.state.BlockState;
 
 public class IceBlock extends HalfTransparentBlock {
+
     public static final MapCodec<IceBlock> CODEC = simpleCodec(IceBlock::new);
 
     @Override
     public MapCodec<? extends IceBlock> codec() {
-        return CODEC;
+        return IceBlock.CODEC;
     }
 
     public IceBlock(BlockBehaviour.Properties settings) {
@@ -32,19 +33,26 @@
     }
 
     @Override
-    public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) {
-        super.playerDestroy(world, player, pos, state, blockEntity, tool);
+    public void playerDestroy(Level world, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool, boolean includeDrops, boolean dropExp) { // Paper - fix drops not preventing stats/food exhaustion
+        super.playerDestroy(world, player, pos, state, blockEntity, tool, includeDrops, dropExp); // Paper - fix drops not preventing stats/food exhaustion
+        // Paper start - Improve Block#breakNaturally API
+        this.afterDestroy(world, pos, tool);
+    }
+    public void afterDestroy(Level world, BlockPos pos, ItemStack tool) {
+        // Paper end - Improve Block#breakNaturally API
         if (!EnchantmentHelper.hasTag(tool, EnchantmentTags.PREVENTS_ICE_MELTING)) {
             if (world.dimensionType().ultraWarm()) {
                 world.removeBlock(pos, false);
                 return;
             }
 
-            BlockState blockState = world.getBlockState(pos.below());
-            if (blockState.blocksMotion() || blockState.liquid()) {
-                world.setBlockAndUpdate(pos, meltsInto());
+            BlockState iblockdata1 = world.getBlockState(pos.below());
+
+            if (iblockdata1.blocksMotion() || iblockdata1.liquid()) {
+                world.setBlockAndUpdate(pos, IceBlock.meltsInto());
             }
         }
+
     }
 
     @Override
@@ -52,14 +60,20 @@
         if (world.getBrightness(LightLayer.BLOCK, pos) > 11 - state.getLightBlock(world, pos)) {
             this.melt(state, world, pos);
         }
+
     }
 
     protected void melt(BlockState state, Level world, BlockPos pos) {
+        // CraftBukkit start
+        if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world, pos, world.dimensionType().ultraWarm() ? Blocks.AIR.defaultBlockState() : Blocks.WATER.defaultBlockState()).isCancelled()) {
+            return;
+        }
+        // CraftBukkit end
         if (world.dimensionType().ultraWarm()) {
             world.removeBlock(pos, false);
         } else {
-            world.setBlockAndUpdate(pos, meltsInto());
-            world.neighborChanged(pos, meltsInto().getBlock(), pos);
+            world.setBlockAndUpdate(pos, IceBlock.meltsInto());
+            world.neighborChanged(pos, IceBlock.meltsInto().getBlock(), pos);
         }
     }
 }
