--- a/net/minecraft/world/entity/monster/Bogged.java
+++ b/net/minecraft/world/entity/monster/Bogged.java
@@ -72,7 +_,19 @@
         ItemStack itemInHand = player.getItemInHand(hand);
         if (itemInHand.is(Items.SHEARS) && this.readyForShearing()) {
             if (this.level() instanceof ServerLevel serverLevel) {
-                this.shear(serverLevel, SoundSource.PLAYERS, itemInHand);
+                // CraftBukkit start
+                // Paper start - custom shear drops
+                java.util.List<ItemStack> drops = this.generateDefaultDrops(serverLevel, itemInHand);
+                org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemInHand, hand, drops);
+                if (event != null) {
+                    if (event.isCancelled()) {
+                        return InteractionResult.PASS;
+                    }
+                    drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops());
+                    // Paper end - custom shear drops
+                }
+                // CraftBukkit end
+                this.shear(serverLevel, SoundSource.PLAYERS, itemInHand, drops); // Paper - custom shear drops
                 this.gameEvent(GameEvent.SHEAR, player);
                 itemInHand.hurtAndBreak(1, player, getSlotForHand(hand));
             }
@@ -125,15 +_,33 @@
 
     @Override
     public void shear(ServerLevel level, SoundSource soundSource, ItemStack shears) {
+    // Paper start - custom shear drops
+        this.shear(level, soundSource, shears, this.generateDefaultDrops(level, shears));
+    }
+
+    @Override
+    public java.util.List<ItemStack> generateDefaultDrops(final ServerLevel serverLevel, final ItemStack shears) {
+        final java.util.List<ItemStack> drops = new it.unimi.dsi.fastutil.objects.ObjectArrayList<>();
+        this.dropFromShearingLootTable(serverLevel, BuiltInLootTables.BOGGED_SHEAR, shears, (ignored, stack) -> {
+            drops.add(stack);
+        });
+        return drops;
+    }
+
+    @Override
+    public void shear(ServerLevel level, SoundSource soundSource, ItemStack shears, java.util.List<ItemStack> drops) {
+    // Paper end - custom shear drops
         level.playSound(null, this, SoundEvents.BOGGED_SHEAR, soundSource, 1.0F, 1.0F);
-        this.spawnShearedMushrooms(level, shears);
+        this.spawnShearedMushrooms(level, shears, drops); // Paper - custom shear drops
         this.setSheared(true);
     }
 
-    private void spawnShearedMushrooms(ServerLevel level, ItemStack stack) {
-        this.dropFromShearingLootTable(
-            level, BuiltInLootTables.BOGGED_SHEAR, stack, (serverLevel, itemStack) -> this.spawnAtLocation(serverLevel, itemStack, this.getBbHeight())
-        );
+    // Paper start - custom shear drops
+    private void spawnShearedMushrooms(ServerLevel level, ItemStack stack, java.util.List<ItemStack> drops) {
+        this.forceDrops = true; // Paper - Add missing forceDrop toggles
+        drops.forEach(drop -> this.spawnAtLocation(level, drop, this.getBbHeight()));
+        this.forceDrops = false; // Paper - Add missing forceDrop toggles
+        // Paper end - custom shear drops
     }
 
     @Override
