2019-03-20 02:46:00 +01:00
From 17c90fda2396b574e67a8073b8e7c962e09f4cd6 Mon Sep 17 00:00:00 2001
2018-06-18 07:13:16 +02:00
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
2019-03-20 02:46:00 +01:00
index 52bc68e6a..f8dbc3c40 100644
2018-06-18 07:13:16 +02:00
--- a/src/main/java/net/minecraft/server/ItemBow.java
+++ b/src/main/java/net/minecraft/server/ItemBow.java
2019-01-15 22:12:19 +01:00
@@ -1,5 +1,7 @@
2018-06-18 07:13:16 +02:00
package net.minecraft.server;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
2019-01-15 22:12:19 +01:00
+
2018-06-18 07:13:16 +02:00
public class ItemBow extends Item {
2019-01-15 22:12:19 +01:00
public ItemBow(Item.Info item_info) {
@@ -16,16 +18,16 @@ public class ItemBow extends Item {
2018-07-19 01:16:19 +02:00
// CraftBukkit end
2018-06-18 07:13:16 +02:00
}
- private ItemStack a(EntityHuman entityhuman) {
2018-07-19 01:16:19 +02:00
- if (this.e_(entityhuman.b(EnumHand.OFF_HAND))) {
2018-06-18 07:13:16 +02:00
+ private ItemStack a(EntityHuman entityhuman, ItemStack bow) { // Paper
2018-07-19 01:16:19 +02:00
+ if (this.e_(entityhuman, bow, entityhuman.b(EnumHand.OFF_HAND))) { // Paper
2018-06-18 07:13:16 +02:00
return entityhuman.b(EnumHand.OFF_HAND);
2018-07-19 01:16:19 +02:00
- } else if (this.e_(entityhuman.b(EnumHand.MAIN_HAND))) {
+ } else if (this.e_(entityhuman, bow, entityhuman.b(EnumHand.MAIN_HAND))) {
2018-06-18 07:13:16 +02:00
return entityhuman.b(EnumHand.MAIN_HAND);
} else {
for (int i = 0; i < entityhuman.inventory.getSize(); ++i) {
ItemStack itemstack = entityhuman.inventory.getItem(i);
2018-07-19 01:16:19 +02:00
- if (this.e_(itemstack)) {
+ if (this.e_(entityhuman, bow, itemstack)) {
2018-06-18 07:13:16 +02:00
return itemstack;
}
}
2019-01-15 22:12:19 +01:00
@@ -34,15 +36,23 @@ public class ItemBow extends Item {
2018-06-18 07:13:16 +02:00
}
}
2018-07-19 01:16:19 +02:00
- protected boolean e_(ItemStack itemstack) {
2018-06-18 07:13:16 +02:00
- return itemstack.getItem() instanceof ItemArrow;
+ // Paper start
2018-07-19 01:16:19 +02:00
+ protected boolean e_(EntityHuman player, ItemStack bow, ItemStack itemstack) {
2018-06-18 07:13:16 +02:00
+ 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()) {
2019-01-15 22:12:19 +01:00
@@ -141,7 +151,7 @@ public class ItemBow extends Item {
2018-06-18 07:13:16 +02:00
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) {
2019-01-01 04:15:55 +01:00
return flag ? new InteractionResultWrapper<>(EnumInteractionResult.PASS, itemstack) : new InteractionResultWrapper<>(EnumInteractionResult.FAIL, itemstack);
2018-06-18 07:13:16 +02:00
--
2019-03-20 02:46:00 +01:00
2.21.0
2018-06-18 07:13:16 +02:00