--- a/net/minecraft/world/entity/monster/AbstractSkeleton.java
+++ b/net/minecraft/world/entity/monster/AbstractSkeleton.java
@@ -64,6 +_,7 @@
             AbstractSkeleton.this.setAggressive(true);
         }
     };
+    private boolean shouldBurnInDay = true; // Paper - shouldBurnInDay API
 
     protected AbstractSkeleton(EntityType<? extends AbstractSkeleton> entityType, Level level) {
         super(entityType, level);
@@ -88,6 +_,16 @@
         return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, 0.25);
     }
 
+    // Paper start - shouldBurnInDay API
+    public boolean shouldBurnInDay() {
+        return this.shouldBurnInDay;
+    }
+
+    public void setShouldBurnInDay(boolean shouldBurnInDay) {
+        this.shouldBurnInDay = shouldBurnInDay;
+    }
+    // Paper end - shouldBurnInDay API
+
     @Override
     protected void playStepSound(BlockPos pos, BlockState block) {
         this.playSound(this.getStepSound(), 0.15F, 1.0F);
@@ -97,7 +_,7 @@
 
     @Override
     public void aiStep() {
-        boolean isSunBurnTick = this.isSunBurnTick();
+        boolean isSunBurnTick = this.shouldBurnInDay && this.isSunBurnTick(); // Paper - shouldBurnInDay API
         if (isSunBurnTick) {
             ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.HEAD);
             if (!itemBySlot.isEmpty()) {
@@ -145,7 +_,7 @@
         this.populateDefaultEquipmentSlots(random, difficulty);
         this.populateDefaultEquipmentEnchantments(level, random, difficulty);
         this.reassessWeaponGoal();
-        this.setCanPickUpLoot(random.nextFloat() < 0.55F * difficulty.getSpecialMultiplier());
+        this.setCanPickUpLoot(this.level().paperConfig().entities.behavior.mobsCanAlwaysPickUpLoot.skeletons || random.nextFloat() < 0.55F * difficulty.getSpecialMultiplier()); // Paper - Add world settings for mobs picking up loot
         if (this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) {
             LocalDate localDate = LocalDate.now();
             int i = localDate.get(ChronoField.DAY_OF_MONTH);
@@ -196,9 +_,19 @@
         double d2 = target.getZ() - this.getZ();
         double squareRoot = Math.sqrt(d * d + d2 * d2);
         if (this.level() instanceof ServerLevel serverLevel) {
+            // CraftBukkit start
+            org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getMainHandItem(), arrow.getPickupItem(), arrow, net.minecraft.world.InteractionHand.MAIN_HAND, 0.8F, true); // Paper - improve entity shhot bow event - add arrow stack to event
+            if (event.isCancelled()) {
+                event.getProjectile().remove();
+                return;
+            }
+
+            if (event.getProjectile() == arrow.getBukkitEntity()) {
+            // CraftBukkit end
             Projectile.spawnProjectileUsingShoot(
                 arrow, serverLevel, projectile, d, d1 + squareRoot * 0.2F, d2, 1.6F, 14 - serverLevel.getDifficulty().getId() * 4
             );
+            } // CraftBukkit
         }
 
         this.playSound(SoundEvents.SKELETON_SHOOT, 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F));
@@ -222,11 +_,23 @@
     public void readAdditionalSaveData(CompoundTag compound) {
         super.readAdditionalSaveData(compound);
         this.reassessWeaponGoal();
-    }
+        // Paper start - shouldBurnInDay API
+        if (compound.contains("Paper.ShouldBurnInDay")) {
+            this.shouldBurnInDay = compound.getBoolean("Paper.ShouldBurnInDay");
+        }
+        // Paper end - shouldBurnInDay API
+    }
+    // Paper start - shouldBurnInDay API
+    @Override
+    public void addAdditionalSaveData(final net.minecraft.nbt.CompoundTag nbt) {
+        super.addAdditionalSaveData(nbt);
+        nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay);
+    }
+    // Paper end - shouldBurnInDay API
 
     @Override
-    public void setItemSlot(EquipmentSlot slot, ItemStack stack) {
-        super.setItemSlot(slot, stack);
+    public void setItemSlot(EquipmentSlot slot, ItemStack stack, boolean silent) { // Paper - Fix silent equipment change
+        super.setItemSlot(slot, stack, silent); // Paper - Fix silent equipment change
         if (!this.level().isClientSide) {
             this.reassessWeaponGoal();
         }
