From ff617f73cdc334b77b6ba72c60bce1a89c483cee Mon Sep 17 00:00:00 2001
From: md_5 <git@md-5.net>
Date: Sat, 19 Mar 2016 11:13:15 +1100
Subject: [PATCH] SPIGOT-1956: Don't deplete projectile item when event
 cancelled

---
 nms-patches/ItemBow.patch      |  9 +++++++--
 nms-patches/ItemSnowball.patch | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 2 deletions(-)
 create mode 100644 nms-patches/ItemSnowball.patch

diff --git a/nms-patches/ItemBow.patch b/nms-patches/ItemBow.patch
index 64e6fd716b..728c2c3959 100644
--- a/nms-patches/ItemBow.patch
+++ b/nms-patches/ItemBow.patch
@@ -30,13 +30,18 @@
                          }
  
                          itemstack.damage(1, entityhuman);
-@@ -81,7 +96,10 @@
+@@ -81,7 +96,15 @@
                              entityarrow.fromPlayer = EntityArrow.PickupStatus.CREATIVE_ONLY;
                          }
  
 -                        world.addEntity(entityarrow);
 +                        if (event.getProjectile() == entityarrow.getBukkitEntity()) {
-+                            world.addEntity(entityarrow);
++                            if (!world.addEntity(entityarrow)) {
++                                if (entityhuman instanceof EntityPlayer) {
++                                    ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory();
++                                }
++                                return;
++                            }
 +                        }
 +                        // CraftBukkit end
                      }
diff --git a/nms-patches/ItemSnowball.patch b/nms-patches/ItemSnowball.patch
new file mode 100644
index 0000000000..62b259f5a9
--- /dev/null
+++ b/nms-patches/ItemSnowball.patch
@@ -0,0 +1,33 @@
+--- a/net/minecraft/server/ItemSnowball.java
++++ b/net/minecraft/server/ItemSnowball.java
+@@ -8,17 +8,27 @@
+     }
+ 
+     public InteractionResultWrapper<ItemStack> a(ItemStack itemstack, World world, EntityHuman entityhuman, EnumHand enumhand) {
+-        if (!entityhuman.abilities.canInstantlyBuild) {
++        // CraftBukkit start - moved down
++        /*if (!entityhuman.abilities.canInstantlyBuild) {
+             --itemstack.count;
+         }
+ 
+-        world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.fG, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemSnowball.i.nextFloat() * 0.4F + 0.8F));
++        world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.fG, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemSnowball.i.nextFloat() * 0.4F + 0.8F));*/
+         if (!world.isClientSide) {
+             EntitySnowball entitysnowball = new EntitySnowball(world, entityhuman);
+ 
+             entitysnowball.a(entityhuman, entityhuman.pitch, entityhuman.yaw, 0.0F, 1.5F, 1.0F);
+-            world.addEntity(entitysnowball);
++            if (world.addEntity(entitysnowball)) {
++                if (!entityhuman.abilities.canInstantlyBuild) {
++                    --itemstack.count;
++                }
++
++                world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.fG, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemSnowball.i.nextFloat() * 0.4F + 0.8F));
++            } else if (entityhuman instanceof EntityPlayer) {
++                ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory();
++            }
+         }
++        // CraftBukkit end
+ 
+         entityhuman.b(StatisticList.b((Item) this));
+         return new InteractionResultWrapper(EnumInteractionResult.SUCCESS, itemstack);