From 9fc9d3f4863cd7eeba84681fcb2fdb5e2458ee5e Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Mon, 18 Jun 2018 00:39:04 -0400
Subject: [PATCH] EntityShootBowEvent consumeArrow and getArrowItem API

Adds ability to get what arrow was shot, and control if it should be consumed.
---
 ...ent-consumeArrow-and-getArrowItem-AP.patch | 41 ++++++++++
 ...ent-consumeArrow-and-getArrowItem-AP.patch | 82 +++++++++++++++++++
 2 files changed, 123 insertions(+)
 create mode 100644 Spigot-API-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch
 create mode 100644 Spigot-Server-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch

diff --git a/Spigot-API-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch b/Spigot-API-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch
new file mode 100644
index 0000000000..51fe0a8034
--- /dev/null
+++ b/Spigot-API-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch
@@ -0,0 +1,41 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <aikar@aikar.co>
+Date: Sat, 15 Jun 2013 19:52:04 -0400
+Subject: [PATCH] EntityShootBowEvent consumeArrow and getArrowItem API
+
+Adds ability to get what arrow was shot, and control if it should be consumed.
+
+diff --git a/src/main/java/org/bukkit/event/entity/EntityShootBowEvent.java b/src/main/java/org/bukkit/event/entity/EntityShootBowEvent.java
+index f8c91a13..c9eb75aa 100644
+--- a/src/main/java/org/bukkit/event/entity/EntityShootBowEvent.java
++++ b/src/main/java/org/bukkit/event/entity/EntityShootBowEvent.java
+@@ -0,0 +0,0 @@ public class EntityShootBowEvent extends EntityEvent implements Cancellable {
+     private Entity projectile;
+     private final float force;
+     private boolean cancelled;
++    // Paper start
++    private boolean consumeArrow = true;
++    private final ItemStack arrowItem;
++    public boolean getConsumeArrow() {
++        return consumeArrow;
++    }
++    public void setConsumeArrow(boolean consumeArrow) {
++        this.consumeArrow = consumeArrow;
++    }
+ 
++    public ItemStack getArrowItem() {
++        return arrowItem;
++    }
++
++    @Deprecated
+     public EntityShootBowEvent(final LivingEntity shooter, final ItemStack bow, final Projectile projectile, final float force) {
++        this(shooter, bow, new ItemStack(org.bukkit.Material.AIR), projectile, force);
++    }
++    public EntityShootBowEvent(final LivingEntity shooter, final ItemStack bow, ItemStack arrowItem, final Projectile projectile, final float force) {
+         super(shooter);
++        this.arrowItem = arrowItem;
++        // Paper end
+         this.bow = bow;
+         this.projectile = projectile;
+         this.force = force;
+--
\ No newline at end of file
diff --git a/Spigot-Server-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch b/Spigot-Server-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch
new file mode 100644
index 0000000000..52d266b0b6
--- /dev/null
+++ b/Spigot-Server-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch
@@ -0,0 +1,82 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <aikar@aikar.co>
+Date: Sat, 15 Jun 2013 19:51:17 -0400
+Subject: [PATCH] EntityShootBowEvent consumeArrow and getArrowItem API
+
+Adds ability to get what arrow was shot, and control if it should be consumed.
+
+diff --git a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java
+index b92cf8e62..8f4b63c8d 100644
+--- a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java
++++ b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java
+@@ -0,0 +0,0 @@ public abstract class EntitySkeletonAbstract extends EntityMonster implements IR
+ 
+         entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.world.getDifficulty().a() * 4));
+         // CraftBukkit start
+-        org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getItemInMainHand(), entityarrow, 0.8F);
++        org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getItemInMainHand(), this.getItemInOffHand(), entityarrow, 0.8F); // Paper
+         if (event.isCancelled()) {
+             event.getProjectile().remove();
+             return;
+diff --git a/src/main/java/net/minecraft/server/ItemBow.java b/src/main/java/net/minecraft/server/ItemBow.java
+index e943f8054..327d31e19 100644
+--- a/src/main/java/net/minecraft/server/ItemBow.java
++++ b/src/main/java/net/minecraft/server/ItemBow.java
+@@ -0,0 +0,0 @@ public class ItemBow extends Item {
+                 if ((double) f >= 0.1D) {
+                     boolean flag1 = flag && itemstack1.getItem() == Items.ARROW;
+ 
++                    boolean consumeArrow = true; // Paper
+                     if (!world.isClientSide) {
+                         ItemArrow itemarrow = (ItemArrow) ((ItemArrow) (itemstack1.getItem() instanceof ItemArrow ? itemstack1.getItem() : Items.ARROW));
+                         EntityArrow entityarrow = itemarrow.a(world, itemstack1, (EntityLiving) entityhuman);
+@@ -0,0 +0,0 @@ public class ItemBow extends Item {
+                         // CraftBukkit end
+                         }
+                         // CraftBukkit start
+-                        org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, itemstack, entityarrow, f);
++                        org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, itemstack, itemstack1, entityarrow, f); // Paper
+                         if (event.isCancelled()) {
+                             event.getProjectile().remove();
+                             return;
+                         }
+ 
+                         itemstack.damage(1, entityhuman);
+-                        if (flag1 || entityhuman.abilities.canInstantlyBuild && (itemstack1.getItem() == Items.SPECTRAL_ARROW || itemstack1.getItem() == Items.TIPPED_ARROW)) {
++                        consumeArrow = event.getConsumeArrow(); // Paper
++                        if (!consumeArrow || flag1 || (entityhuman.abilities.canInstantlyBuild && ((itemstack1.getItem() == Items.SPECTRAL_ARROW) || (itemstack1.getItem() == Items.TIPPED_ARROW)))) { // Paper - add !consumeArrow
+                             entityarrow.fromPlayer = EntityArrow.PickupStatus.CREATIVE_ONLY;
+                         }
+ 
+@@ -0,0 +0,0 @@ public class ItemBow extends Item {
+                     }
+ 
+                     world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.w, SoundCategory.PLAYERS, 1.0F, 1.0F / (ItemBow.j.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
+-                    if (!flag1 && !entityhuman.abilities.canInstantlyBuild) {
++                    if (!flag1 && !entityhuman.abilities.canInstantlyBuild && consumeArrow) { // Paper
+                         itemstack1.subtract(1);
+                         if (itemstack1.isEmpty()) {
+                             entityhuman.inventory.f(itemstack1);
+diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+index 5f816e44f..9b19c055d 100644
+--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+@@ -0,0 +0,0 @@ public class CraftEventFactory {
+     /**
+      * EntityShootBowEvent
+      */
+-    public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, ItemStack itemstack, EntityArrow entityArrow, float force) {
++    public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, /*bow*/ItemStack itemstack, /*arrow*/ ItemStack arrowItem, EntityArrow entityArrow, float force) { // Paper
+         LivingEntity shooter = (LivingEntity) who.getBukkitEntity();
+         CraftItemStack itemInHand = CraftItemStack.asCraftMirror(itemstack);
+         Arrow arrow = (Arrow) entityArrow.getBukkitEntity();
+@@ -0,0 +0,0 @@ public class CraftEventFactory {
+             itemInHand = null;
+         }
+ 
+-        EntityShootBowEvent event = new EntityShootBowEvent(shooter, itemInHand, arrow, force);
++        EntityShootBowEvent event = new EntityShootBowEvent(shooter, itemInHand, CraftItemStack.asCraftMirror(arrowItem), arrow, force); // Paper
+         Bukkit.getPluginManager().callEvent(event);
+ 
+         return event;
+--
\ No newline at end of file