--- a/net/minecraft/world/level/block/SnifferEggBlock.java
+++ b/net/minecraft/world/level/block/SnifferEggBlock.java
@@ -54,12 +54,31 @@
         return this.getHatchLevel(state) == 2;
     }
 
+    // Paper start
+    private void rescheduleTick(ServerLevel world, BlockPos pos) {
+        int baseDelay = hatchBoost(world, pos) ? world.paperConfig().entities.sniffer.boostedHatchTime.or(BOOSTED_HATCH_TIME_TICKS) : world.paperConfig().entities.sniffer.hatchTime.or(REGULAR_HATCH_TIME_TICKS);
+        world.scheduleTick(pos, this, (baseDelay / 3) + world.random.nextInt(RANDOM_HATCH_OFFSET_TICKS));
+        // reschedule to avoid being stuck here and behave like the other calls (see #onPlace)
+    }
+    // Paper end
+
     @Override
     public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) {
         if (!this.isReadyToHatch(state)) {
+            // Paper start
+            if (!org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory.handleBlockGrowEvent(world, pos, state.setValue(HATCH, Integer.valueOf(this.getHatchLevel(state) + 1)), 2)) {
+                rescheduleTick(world, pos);
+                return;
+            }
+            // Paper end
             world.playSound((Player)null, pos, SoundEvents.SNIFFER_EGG_CRACK, SoundSource.BLOCKS, 0.7F, 0.9F + random.nextFloat() * 0.2F);
-            world.setBlock(pos, state.setValue(HATCH, Integer.valueOf(this.getHatchLevel(state) + 1)), 2);
         } else {
+            // Paper start - Call BlockFadeEvent
+            if (org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory.callBlockFadeEvent(world, pos, state.getFluidState().createLegacyBlock()).isCancelled()) {
+                rescheduleTick(world, pos);
+                return;
+            }
+            // Paper end
             world.playSound((Player)null, pos, SoundEvents.SNIFFER_EGG_HATCH, SoundSource.BLOCKS, 0.7F, 0.9F + random.nextFloat() * 0.2F);
             world.destroyBlock(pos, false);
             Sniffer sniffer = EntityType.SNIFFER.create(world);
@@ -67,7 +86,7 @@
                 Vec3 vec3 = pos.getCenter();
                 sniffer.setBaby(true);
                 sniffer.moveTo(vec3.x(), vec3.y(), vec3.z(), Mth.wrapDegrees(world.random.nextFloat() * 360.0F), 0.0F);
-                world.addFreshEntity(sniffer);
+                world.addFreshEntity(sniffer, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG); // Paper
             }
 
         }
@@ -80,7 +99,7 @@
             world.levelEvent(3009, pos, 0);
         }
 
-        int i = bl ? 12000 : 24000;
+        int i = bl ? world.paperConfig().entities.sniffer.boostedHatchTime.or(BOOSTED_HATCH_TIME_TICKS) : world.paperConfig().entities.sniffer.hatchTime.or(REGULAR_HATCH_TIME_TICKS); // Paper
         int j = i / 3;
         world.gameEvent(GameEvent.BLOCK_PLACE, pos, GameEvent.Context.of(state));
         world.scheduleTick(pos, this, j + world.random.nextInt(300));
