--- a/net/minecraft/world/level/block/BeehiveBlock.java
+++ b/net/minecraft/world/level/block/BeehiveBlock.java
@@ -87,8 +_,8 @@
     }
 
     @Override
-    public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity te, ItemStack stack) {
-        super.playerDestroy(level, player, pos, state, te, stack);
+    public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity te, ItemStack stack, boolean includeDrops, boolean dropExp) { // Paper - fix drops not preventing stats/food exhaustion
+        super.playerDestroy(level, player, pos, state, te, stack, includeDrops, dropExp); // Paper - fix drops not preventing stats/food exhaustion
         if (!level.isClientSide() && te instanceof BeehiveBlockEntity beehiveBlockEntity) {
             if (!EnchantmentHelper.hasTag(stack, EnchantmentTags.PREVENTS_BEE_SPAWNS_WHEN_MINING)) {
                 beehiveBlockEntity.emptyAllLivingFromHive(player, state, BeehiveBlockEntity.BeeReleaseStatus.EMERGENCY);
@@ -96,7 +_,7 @@
                 this.angerNearbyBees(level, pos);
             }
 
-            CriteriaTriggers.BEE_NEST_DESTROYED.trigger((ServerPlayer)player, state, stack, beehiveBlockEntity.getOccupantCount());
+            // CriteriaTriggers.BEE_NEST_DESTROYED.trigger((ServerPlayer)player, state, stack, beehiveBlockEntity.getOccupantCount()); // Paper - Trigger bee_nest_destroyed trigger in the correct place; moved until after items are dropped
         }
     }
 
@@ -118,7 +_,7 @@
             for (Bee bee : entitiesOfClass) {
                 if (bee.getTarget() == null) {
                     Player player = Util.getRandom(entitiesOfClass1, level.random);
-                    bee.setTarget(player);
+                    bee.setTarget(player, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER); // CraftBukkit
                 }
             }
         }
@@ -128,7 +_,7 @@
         ServerLevel level, ItemStack stack, BlockState state, @Nullable BlockEntity blockEntity, @Nullable Entity entity, BlockPos pos
     ) {
         dropFromBlockInteractLootTable(
-            level, BuiltInLootTables.HARVEST_BEEHIVE, state, blockEntity, stack, entity, (serverLevel, itemStack) -> popResource(serverLevel, pos, itemStack)
+            level, BuiltInLootTables.HARVEST_BEEHIVE, state, blockEntity, stack, entity, (serverLevel, itemStack) -> popResource(serverLevel, pos, itemStack) // Paper - diff on change - copied below
         );
     }
 
@@ -141,7 +_,19 @@
         if (honeyLevelValue >= 5) {
             Item item = stack.getItem();
             if (level instanceof ServerLevel serverLevel && stack.is(Items.SHEARS)) {
-                dropHoneycomb(serverLevel, stack, state, level.getBlockEntity(pos), player, pos);
+                // Paper start - Add PlayerShearBlockEvent
+                List<org.bukkit.inventory.ItemStack> drops = new java.util.ArrayList<>();
+                dropFromBlockInteractLootTable(
+                    serverLevel, BuiltInLootTables.HARVEST_BEEHIVE, state, level.getBlockEntity(pos), stack, player, (serverLevel1, itemStack) -> drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack))
+                );
+                io.papermc.paper.event.block.PlayerShearBlockEvent event = new io.papermc.paper.event.block.PlayerShearBlockEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(stack), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand), drops);
+                if (!event.callEvent()) {
+                    return InteractionResult.PASS;
+                }
+                for (org.bukkit.inventory.ItemStack itemStack : event.getDrops()) {
+                    popResource(serverLevel, pos, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(itemStack));
+                }
+                // Paper end - Add PlayerShearBlockEvent
                 level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.BEEHIVE_SHEAR, SoundSource.BLOCKS, 1.0F, 1.0F);
                 stack.hurtAndBreak(1, player, hand.asEquipmentSlot());
                 flag = true;
