This only impacted people who used our useSnapshots new API in a plugin, which obviously was no one as the data result was completely broken. Merged the NPE check patch into mine since it has to handle it too.
80 lines
3.6 KiB
Diff
80 lines
3.6 KiB
Diff
From c5616376719b637a47b3c51bb5642068fadacef3 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 327d31e19..44e7be58e 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 {
|
|
@@ -14,16 +15,16 @@ public class ItemBow extends Item {
|
|
});
|
|
}
|
|
|
|
- private ItemStack a(EntityHuman entityhuman) {
|
|
- if (this.d(entityhuman.b(EnumHand.OFF_HAND))) {
|
|
+ private ItemStack a(EntityHuman entityhuman, ItemStack bow) { // Paper
|
|
+ if (this.d(entityhuman, bow, entityhuman.b(EnumHand.OFF_HAND))) { // Paper
|
|
return entityhuman.b(EnumHand.OFF_HAND);
|
|
- } else if (this.d(entityhuman.b(EnumHand.MAIN_HAND))) {
|
|
+ } else if (this.d(entityhuman, bow, entityhuman.b(EnumHand.MAIN_HAND))) { // Paper
|
|
return entityhuman.b(EnumHand.MAIN_HAND);
|
|
} else {
|
|
for (int i = 0; i < entityhuman.inventory.getSize(); ++i) {
|
|
ItemStack itemstack = entityhuman.inventory.getItem(i);
|
|
|
|
- if (this.d(itemstack)) {
|
|
+ if (this.d(entityhuman, bow, itemstack)) { // Paper
|
|
return itemstack;
|
|
}
|
|
}
|
|
@@ -32,15 +33,23 @@ public class ItemBow extends Item {
|
|
}
|
|
}
|
|
|
|
- protected boolean d(ItemStack itemstack) {
|
|
- return itemstack.getItem() instanceof ItemArrow;
|
|
+ // Paper start
|
|
+ protected boolean d(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()) {
|
|
@@ -144,7 +153,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
|
|
|