From a2615ce98c342a8618229c37ff2b050ac3e8789d Mon Sep 17 00:00:00 2001 From: Aikar 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 52bc68e6a6..f8dbc3c400 100644 --- a/src/main/java/net/minecraft/server/ItemBow.java +++ b/src/main/java/net/minecraft/server/ItemBow.java @@ -1,5 +1,7 @@ package net.minecraft.server; +import org.bukkit.craftbukkit.inventory.CraftItemStack; + public class ItemBow extends Item { public ItemBow(Item.Info item_info) { @@ -16,16 +18,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; } } @@ -34,15 +36,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()) { @@ -141,7 +151,7 @@ public class ItemBow extends Item { public InteractionResultWrapper 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.20.1