Paper/Spigot-Server-Patches/0274-PlayerReadyArrowEvent.patch
Aikar b62dfa0bf9
Updated Upstream (Bukkit/CraftBukkit)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Bukkit Changes:
39ce5d3a SPIGOT-4399: ItemMeta.equals broken with AttributeModifiers

CraftBukkit Changes:
1cf8b5dc SPIGOT-4400: Populators running on existing chunks
116cb9a1 SPIGOT-4399: Add attribute modifier equality test
5ee1c18a SPIGOT-4398: Set ASM7_EXPERIMENTAL flag
2018-09-28 19:31:59 -04:00

80 lines
3.6 KiB
Diff

From e19c8c0bd3024b5c1abd42fe1ffb4468be4a8f6e Mon Sep 17 00:00:00 2001
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
index 152b179ce1..797e9ecf11 100644
--- a/src/main/java/net/minecraft/server/ItemBow.java
+++ b/src/main/java/net/minecraft/server/ItemBow.java
@@ -1,5 +1,6 @@
package net.minecraft.server;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit
public class ItemBow extends Item {
@@ -18,16 +19,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;
}
}
@@ -36,15 +37,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()) {
@@ -148,7 +157,7 @@ public class ItemBow extends Item {
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) {
return flag ? new InteractionResultWrapper(EnumInteractionResult.PASS, itemstack) : new InteractionResultWrapper(EnumInteractionResult.FAIL, itemstack);
--
2.19.0