From c49c00d50f048309923a635b82d67ab84c7a4723 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Mon, 18 Jun 2018 01:12:53 -0400
Subject: [PATCH] PlayerReadyArrowEvent

Called when a player is firing a bow and the server is choosing an arrow to use.
Plugins can skip selection of certain arrows and control which is used.

diff --git a/src/main/java/net/minecraft/server/ItemBow.java b/src/main/java/net/minecraft/server/ItemBow.java
index 152b179ce1..797e9ecf11 100644
--- a/src/main/java/net/minecraft/server/ItemBow.java
+++ b/src/main/java/net/minecraft/server/ItemBow.java
@@ -1,5 +1,6 @@
 package net.minecraft.server;
 
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
 import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit
 
 public class ItemBow extends Item {
@@ -18,16 +19,16 @@ public class ItemBow extends Item {
         // CraftBukkit end
     }
 
-    private ItemStack a(EntityHuman entityhuman) {
-        if (this.e_(entityhuman.b(EnumHand.OFF_HAND))) {
+    private ItemStack a(EntityHuman entityhuman, ItemStack bow) { // Paper
+        if (this.e_(entityhuman, bow, entityhuman.b(EnumHand.OFF_HAND))) { // Paper
             return entityhuman.b(EnumHand.OFF_HAND);
-        } else if (this.e_(entityhuman.b(EnumHand.MAIN_HAND))) {
+        } else if (this.e_(entityhuman, bow, entityhuman.b(EnumHand.MAIN_HAND))) {
             return entityhuman.b(EnumHand.MAIN_HAND);
         } else {
             for (int i = 0; i < entityhuman.inventory.getSize(); ++i) {
                 ItemStack itemstack = entityhuman.inventory.getItem(i);
 
-                if (this.e_(itemstack)) {
+                if (this.e_(entityhuman, bow, itemstack)) {
                     return itemstack;
                 }
             }
@@ -36,15 +37,23 @@ public class ItemBow extends Item {
         }
     }
 
-    protected boolean e_(ItemStack itemstack) {
-        return itemstack.getItem() instanceof ItemArrow;
+    // Paper start
+    protected boolean e_(EntityHuman player, ItemStack bow, ItemStack itemstack) {
+        return itemstack.getItem() instanceof ItemArrow && (
+                !(player instanceof EntityPlayer) ||
+                new com.destroystokyo.paper.event.player.PlayerReadyArrowEvent(
+                        ((EntityPlayer) player).getBukkitEntity(),
+                        CraftItemStack.asCraftMirror(bow),
+                        CraftItemStack.asCraftMirror(itemstack)
+                    ).callEvent());
+        // Paper end
     }
 
     public void a(ItemStack itemstack, World world, EntityLiving entityliving, int i) {
         if (entityliving instanceof EntityHuman) {
             EntityHuman entityhuman = (EntityHuman) entityliving;
             boolean flag = entityhuman.abilities.canInstantlyBuild || EnchantmentManager.getEnchantmentLevel(Enchantments.ARROW_INFINITE, itemstack) > 0;
-            ItemStack itemstack1 = this.a(entityhuman);
+            ItemStack itemstack1 = this.a(entityhuman, itemstack); // Paper
 
             if (!itemstack1.isEmpty() || flag) {
                 if (itemstack1.isEmpty()) {
@@ -148,7 +157,7 @@ public class ItemBow extends Item {
 
     public InteractionResultWrapper<ItemStack> a(World world, EntityHuman entityhuman, EnumHand enumhand) {
         ItemStack itemstack = entityhuman.b(enumhand);
-        boolean flag = !this.a(entityhuman).isEmpty();
+        boolean flag = !this.a(entityhuman, itemstack).isEmpty(); // Paper
 
         if (!entityhuman.abilities.canInstantlyBuild && !flag) {
             return flag ? new InteractionResultWrapper(EnumInteractionResult.PASS, itemstack) : new InteractionResultWrapper(EnumInteractionResult.FAIL, itemstack);
-- 
2.19.0