Paper/Spigot-Server-Patches/0277-PlayerReadyArrowEvent.patch
Aikar 05466e3b47
[Auto] Update Upstream
Upstream has released updates that appear to apply compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing.

Bukkit Changes:
d2834556 SPIGOT-4219: Event for PigZombies angering.

CraftBukkit Changes:
a9c796f1 SPIGOT-4184: Fix furnaces not matching Vanilla smelt or animations
195f071e SPIGOT-4219: Event for PigZombies angering.
5e3082c7 SPIGOT-4230: Improve legacy block types
2018-08-05 19:46:43 -04:00

80 lines
3.6 KiB
Diff

From 73d7eb479aefb2c9551ac611ddacd39482407cec 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 379a7f84a5..c0caeda362 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.18.0