--- a/net/minecraft/world/entity/animal/Panda.java
+++ b/net/minecraft/world/entity/animal/Panda.java
@@ -127,6 +_,7 @@
     }
 
     public void sit(boolean sitting) {
+        if (!new io.papermc.paper.event.entity.EntityToggleSitEvent(this.getBukkitEntity(), sitting).callEvent()) return; // Paper - Add EntityToggleSitEvent
         this.setFlag(8, sitting);
     }
 
@@ -146,11 +_,11 @@
         this.entityData.set(EAT_COUNTER, eating ? 1 : 0);
     }
 
-    private int getEatCounter() {
+    public int getEatCounter() {
         return this.entityData.get(EAT_COUNTER);
     }
 
-    private void setEatCounter(int eatCounter) {
+    public void setEatCounter(int eatCounter) {
         this.entityData.set(EAT_COUNTER, eatCounter);
     }
 
@@ -516,24 +_,28 @@
 
         for (Panda panda : level.getEntitiesOfClass(Panda.class, this.getBoundingBox().inflate(10.0))) {
             if (!panda.isBaby() && panda.onGround() && !panda.isInWater() && panda.canPerformAction()) {
+                if (new com.destroystokyo.paper.event.entity.EntityJumpEvent(getBukkitLivingEntity()).callEvent()) { // Paper - Entity Jump API
                 panda.jumpFromGround();
+                } else { this.setJumping(false); } // Paper - Entity Jump API; setJumping(false) stops a potential loop
             }
         }
 
         if (this.level() instanceof ServerLevel serverLevel && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
+            this.forceDrops = true; // Paper - Add missing forceDrop toggles
             this.dropFromGiftLootTable(serverLevel, BuiltInLootTables.PANDA_SNEEZE, this::spawnAtLocation);
+            this.forceDrops = false; // Paper - Add missing forceDrop toggles
         }
     }
 
     @Override
     protected void pickUpItem(ServerLevel level, ItemEntity entity) {
-        if (this.getItemBySlot(EquipmentSlot.MAINHAND).isEmpty() && canPickUpAndEat(entity)) {
+        if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityPickupItemEvent(this, entity, 0, !(this.getItemBySlot(EquipmentSlot.MAINHAND).isEmpty() && Panda.canPickUpAndEat(entity))).isCancelled()) { // CraftBukkit
             this.onItemPickup(entity);
             ItemStack item = entity.getItem();
             this.setItemSlot(EquipmentSlot.MAINHAND, item);
             this.setGuaranteedDrop(EquipmentSlot.MAINHAND);
             this.take(entity, item.getCount());
-            entity.discard();
+            entity.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.PICKUP); // CraftBukkit - add Bukkit remove cause
         }
     }
 
@@ -624,8 +_,9 @@
                 this.usePlayerItem(player, hand, itemInHand);
                 this.ageUp((int)(-this.getAge() / 20 * 0.1F), true);
             } else if (!this.level().isClientSide && this.getAge() == 0 && this.canFallInLove()) {
+                final ItemStack breedCopy = itemInHand.copy(); // Paper - Fix EntityBreedEvent copying
                 this.usePlayerItem(player, hand, itemInHand);
-                this.setInLove(player);
+                this.setInLove(player, breedCopy); // Paper - Fix EntityBreedEvent copying
             } else {
                 if (!(this.level() instanceof ServerLevel serverLevel) || this.isSitting() || this.isInWater()) {
                     return InteractionResult.PASS;
@@ -635,7 +_,9 @@
                 this.eat(true);
                 ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.MAINHAND);
                 if (!itemBySlot.isEmpty() && !player.hasInfiniteMaterials()) {
+                    this.forceDrops = true; // Paper - Add missing forceDrop toggles
                     this.spawnAtLocation(serverLevel, itemBySlot);
+                    this.forceDrops = false; // Paper - Add missing forceDrop toggles
                 }
 
                 this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(itemInHand.getItem(), 1));
@@ -670,7 +_,7 @@
 
     @Nullable
     @Override
-    protected SoundEvent getDeathSound() {
+    public SoundEvent getDeathSound() {
         return SoundEvents.PANDA_DEATH;
     }
 
@@ -861,7 +_,7 @@
         @Override
         protected void alertOther(Mob mob, LivingEntity target) {
             if (mob instanceof Panda && mob.isAggressive()) {
-                mob.setTarget(target);
+                mob.setTarget(target, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit
             }
         }
     }
@@ -1090,7 +_,9 @@
         public void stop() {
             ItemStack itemBySlot = Panda.this.getItemBySlot(EquipmentSlot.MAINHAND);
             if (!itemBySlot.isEmpty()) {
+                Panda.this.forceDrops = true; // Paper - Add missing forceDrop toggles
                 Panda.this.spawnAtLocation(getServerLevel(Panda.this.level()), itemBySlot);
+                Panda.this.forceDrops = false; // Paper - Add missing forceDrop toggles
                 Panda.this.setItemSlot(EquipmentSlot.MAINHAND, ItemStack.EMPTY);
                 int i = Panda.this.isLazy() ? Panda.this.random.nextInt(50) + 10 : Panda.this.random.nextInt(150) + 10;
                 this.cooldown = Panda.this.tickCount + i * 20;
