18c3716c49
This enables us a fast reference to the entities current chunk instead of having to look it up by hashmap lookups. We also store counts by type to further enable other performance optimizations in later patches.
79 lines
3.6 KiB
Diff
79 lines
3.6 KiB
Diff
From dd4eb3f1e29bd1c58e58a7cc75e02bd284c11938 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
|
|
|