From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: BillyGalbreath <Blake.Galbreath@GMail.com>
Date: Sat, 21 Jul 2018 03:11:03 -0500
Subject: [PATCH] PlayerLaunchProjectileEvent


diff --git a/src/main/java/net/minecraft/world/item/EggItem.java b/src/main/java/net/minecraft/world/item/EggItem.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/item/EggItem.java
+++ b/src/main/java/net/minecraft/world/item/EggItem.java
@@ -0,0 +0,0 @@ public class EggItem extends Item {
 
             entityegg.setItem(itemstack);
             entityegg.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F);
-            // CraftBukkit start
-            if (!world.addFreshEntity(entityegg)) {
+            // Paper start
+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityegg.getBukkitEntity());
+            if (event.callEvent() && world.addFreshEntity(entityegg)) {
+                if (event.shouldConsume() && !user.getAbilities().instabuild) {
+                    itemstack.shrink(1);
+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
+                }
+
+                world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), net.minecraft.sounds.SoundEvents.EGG_THROW, net.minecraft.sounds.SoundSource.PLAYERS, 0.5F, 0.4F / (net.minecraft.world.entity.Entity.SHARED_RANDOM.nextFloat() * 0.4F + 0.8F));
+                user.awardStat(Stats.ITEM_USED.get(this));
+            } else {
                 if (user instanceof net.minecraft.server.level.ServerPlayer) {
                     ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
                 }
                 return InteractionResultHolder.fail(itemstack);
             }
-            // CraftBukkit end
+            // Paper end
         }
         world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.EGG_THROW, SoundSource.PLAYERS, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
 
+        /* // Paper start - moved up
         user.awardStat(Stats.ITEM_USED.get(this));
         if (!user.getAbilities().instabuild) {
             itemstack.shrink(1);
         }
+        */ // Paper end
 
         return InteractionResultHolder.sidedSuccess(itemstack, world.isClientSide());
     }
diff --git a/src/main/java/net/minecraft/world/item/EnderpearlItem.java b/src/main/java/net/minecraft/world/item/EnderpearlItem.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/item/EnderpearlItem.java
+++ b/src/main/java/net/minecraft/world/item/EnderpearlItem.java
@@ -0,0 +0,0 @@ public class EnderpearlItem extends Item {
 
             entityenderpearl.setItem(itemstack);
             entityenderpearl.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F);
-            if (!world.addFreshEntity(entityenderpearl)) {
+            // Paper start
+                com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityenderpearl.getBukkitEntity());
+            if (event.callEvent() && world.addFreshEntity(entityenderpearl)) {
+                if (event.shouldConsume() && !user.getAbilities().instabuild) {
+                    itemstack.shrink(1);
+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
+                }
+
+                world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (net.minecraft.world.entity.Entity.SHARED_RANDOM.nextFloat() * 0.4F + 0.8F));
+                user.awardStat(Stats.ITEM_USED.get(this));
+                user.getCooldowns().addCooldown(this, 20);
+            } else {
+                // Paper end
                 if (user instanceof net.minecraft.server.level.ServerPlayer) {
                     ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
                 }
@@ -0,0 +0,0 @@ public class EnderpearlItem extends Item {
             }
         }
 
+        /* // Paper start - moved up
         world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
         user.getCooldowns().addCooldown(this, 20);
         // CraftBukkit end
@@ -0,0 +0,0 @@ public class EnderpearlItem extends Item {
         if (!user.getAbilities().instabuild) {
             itemstack.shrink(1);
         }
+        */ // Paper end - moved up
 
         return InteractionResultHolder.sidedSuccess(itemstack, world.isClientSide());
     }
diff --git a/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java b/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java
+++ b/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java
@@ -0,0 +0,0 @@ public class ExperienceBottleItem extends Item {
     @Override
     public InteractionResultHolder<ItemStack> use(Level world, Player user, InteractionHand hand) {
         ItemStack itemStack = user.getItemInHand(hand);
-        world.playSound((Player)null, user.getX(), user.getY(), user.getZ(), SoundEvents.EXPERIENCE_BOTTLE_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
+        // world.playSound((Player)null, user.getX(), user.getY(), user.getZ(), SoundEvents.EXPERIENCE_BOTTLE_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); // Paper - moved down
         if (!world.isClientSide) {
             ThrownExperienceBottle thrownExperienceBottle = new ThrownExperienceBottle(world, user);
             thrownExperienceBottle.setItem(itemStack);
             thrownExperienceBottle.shootFromRotation(user, user.getXRot(), user.getYRot(), -20.0F, 0.7F, 1.0F);
-            world.addFreshEntity(thrownExperienceBottle);
+            // Paper start
+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownExperienceBottle.getBukkitEntity());
+            if (event.callEvent() && world.addFreshEntity(thrownExperienceBottle)) {
+                if (event.shouldConsume() && !user.getAbilities().instabuild) {
+                    itemStack.shrink(1);
+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
+                }
+
+                world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.EXPERIENCE_BOTTLE_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (net.minecraft.world.entity.Entity.SHARED_RANDOM.nextFloat() * 0.4F + 0.8F));
+                user.awardStat(Stats.ITEM_USED.get(this));
+            } else {
+                if (user instanceof net.minecraft.server.level.ServerPlayer) {
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
+                }
+                return InteractionResultHolder.fail(itemStack);
+            }
+            // Paper end
         }
 
+        /* // Paper start - moved up
         user.awardStat(Stats.ITEM_USED.get(this));
         if (!user.getAbilities().instabuild) {
             itemStack.shrink(1);
         }
+        */ // Paper end
 
         return InteractionResultHolder.sidedSuccess(itemStack, world.isClientSide());
     }
diff --git a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
+++ b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
@@ -0,0 +0,0 @@ import net.minecraft.network.chat.Component;
 import net.minecraft.network.chat.TextComponent;
 import net.minecraft.network.chat.TranslatableComponent;
 import net.minecraft.stats.Stats;
+import net.minecraft.server.level.ServerPlayer;
 import net.minecraft.world.InteractionHand;
 import net.minecraft.world.InteractionResult;
 import net.minecraft.world.InteractionResultHolder;
@@ -0,0 +0,0 @@ public class FireworkRocketItem extends Item {
             Direction direction = context.getClickedFace();
             FireworkRocketEntity fireworkRocketEntity = new FireworkRocketEntity(level, context.getPlayer(), vec3.x + (double)direction.getStepX() * 0.15D, vec3.y + (double)direction.getStepY() * 0.15D, vec3.z + (double)direction.getStepZ() * 0.15D, itemStack);
             fireworkRocketEntity.spawningEntity = context.getPlayer() == null ? null : context.getPlayer().getUUID(); // Paper
-            level.addFreshEntity(fireworkRocketEntity);
-            itemStack.shrink(1);
+            // Paper start - PlayerLaunchProjectileEvent
+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) context.getPlayer().getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Firework) fireworkRocketEntity.getBukkitEntity());
+            if (!event.callEvent() || !level.addFreshEntity(fireworkRocketEntity)) return InteractionResult.PASS;
+            if (event.shouldConsume() && !context.getPlayer().getAbilities().instabuild) itemStack.shrink(1);
+            else if (context.getPlayer() instanceof ServerPlayer) ((ServerPlayer) context.getPlayer()).getBukkitEntity().updateInventory();
+            // Paper end
         }
 
         return InteractionResult.sidedSuccess(level.isClientSide);
diff --git a/src/main/java/net/minecraft/world/item/LingeringPotionItem.java b/src/main/java/net/minecraft/world/item/LingeringPotionItem.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/item/LingeringPotionItem.java
+++ b/src/main/java/net/minecraft/world/item/LingeringPotionItem.java
@@ -0,0 +0,0 @@ public class LingeringPotionItem extends ThrowablePotionItem {
 
     @Override
     public InteractionResultHolder<ItemStack> use(Level world, Player user, InteractionHand hand) {
+        // Paper start
+        InteractionResultHolder<ItemStack> wrapper = super.use(world, user, hand);
+        if (wrapper.getResult() != net.minecraft.world.InteractionResult.FAIL) {
         world.playSound((Player)null, user.getX(), user.getY(), user.getZ(), SoundEvents.LINGERING_POTION_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
-        return super.use(world, user, hand);
+        }
+        return wrapper;
+        // Paper end
     }
 }
diff --git a/src/main/java/net/minecraft/world/item/SnowballItem.java b/src/main/java/net/minecraft/world/item/SnowballItem.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/item/SnowballItem.java
+++ b/src/main/java/net/minecraft/world/item/SnowballItem.java
@@ -0,0 +0,0 @@ public class SnowballItem extends Item {
 
             entitysnowball.setItem(itemstack);
             entitysnowball.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F);
-            if (world.addFreshEntity(entitysnowball)) {
-                if (!user.getAbilities().instabuild) {
+            // Paper start
+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entitysnowball.getBukkitEntity());
+            if (event.callEvent() && world.addFreshEntity(entitysnowball)) {
+                user.awardStat(Stats.ITEM_USED.get(this));
+                if (event.shouldConsume() && !user.getAbilities().instabuild) {
+                    // Paper end
                     itemstack.shrink(1);
+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {  // Paper
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();  // Paper
                 }
 
                 world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.SNOWBALL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
-            } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
-                ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
+            } else { // Paper
+                if (user instanceof net.minecraft.server.level.ServerPlayer) ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory(); // Paper
+                return InteractionResultHolder.fail(itemstack); // Paper
             }
         }
         // CraftBukkit end
 
+        /* // Paper tart - moved up
         user.awardStat(Stats.ITEM_USED.get(this));
         // CraftBukkit start - moved up
         /*
@@ -0,0 +0,0 @@ public class SnowballItem extends Item {
             itemstack.shrink(1);
         }
         */
+        // Paper end
 
         return InteractionResultHolder.sidedSuccess(itemstack, world.isClientSide());
     }
diff --git a/src/main/java/net/minecraft/world/item/SplashPotionItem.java b/src/main/java/net/minecraft/world/item/SplashPotionItem.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/item/SplashPotionItem.java
+++ b/src/main/java/net/minecraft/world/item/SplashPotionItem.java
@@ -0,0 +0,0 @@ public class SplashPotionItem extends ThrowablePotionItem {
 
     @Override
     public InteractionResultHolder<ItemStack> use(Level world, Player user, InteractionHand hand) {
+        // Paper start
+        InteractionResultHolder<ItemStack> wrapper = super.use(world, user, hand);
+        if (wrapper.getResult() != net.minecraft.world.InteractionResult.FAIL) {
         world.playSound((Player)null, user.getX(), user.getY(), user.getZ(), SoundEvents.SPLASH_POTION_THROW, SoundSource.PLAYERS, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
-        return super.use(world, user, hand);
+        }
+        return wrapper;
+        // Paper end
     }
 }
diff --git a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java b/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java
+++ b/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java
@@ -0,0 +0,0 @@ public class ThrowablePotionItem extends PotionItem {
             ThrownPotion thrownPotion = new ThrownPotion(world, user);
             thrownPotion.setItem(itemStack);
             thrownPotion.shootFromRotation(user, user.getXRot(), user.getYRot(), -20.0F, 0.5F, 1.0F);
-            world.addFreshEntity(thrownPotion);
+            // Paper start
+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownPotion.getBukkitEntity());
+            if (event.callEvent() && world.addFreshEntity(thrownPotion)) {
+                if (event.shouldConsume() && !user.getAbilities().instabuild) {
+                    itemStack.shrink(1);
+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
+                }
+
+                user.awardStat(Stats.ITEM_USED.get(this));
+            } else {
+                if (user instanceof net.minecraft.server.level.ServerPlayer) {
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
+                }
+                return InteractionResultHolder.fail(itemStack);
+            }
+            // Paper end
         }
 
+        /* // Paper start - moved up
         user.awardStat(Stats.ITEM_USED.get(this));
         if (!user.getAbilities().instabuild) {
             itemStack.shrink(1);
         }
+        */ // Paper end
 
         return InteractionResultHolder.sidedSuccess(itemStack, world.isClientSide());
     }