From 76d60b167f70b24b3959aa7c6beefced2e024b8e Mon Sep 17 00:00:00 2001 From: Aikar Date: Mon, 18 Jun 2018 00:39:04 -0400 Subject: [PATCH] EntityShootBowEvent consumeArrow and getArrowItem API Adds ability to get what arrow was shot, and control if it should be consumed. --- ...ent-consumeArrow-and-getArrowItem-AP.patch | 43 ++++++++++ ...ent-consumeArrow-and-getArrowItem-AP.patch | 84 +++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 Spigot-API-Patches/0114-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch create mode 100644 Spigot-Server-Patches/0311-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch diff --git a/Spigot-API-Patches/0114-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch b/Spigot-API-Patches/0114-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch new file mode 100644 index 000000000..a60114348 --- /dev/null +++ b/Spigot-API-Patches/0114-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch @@ -0,0 +1,43 @@ +From 22e607d260ece86555749a52e0538f14c5089aef Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sat, 15 Jun 2013 19:52:04 -0400 +Subject: [PATCH] EntityShootBowEvent consumeArrow and getArrowItem API + +Adds ability to get what arrow was shot, and control if it should be consumed. + +diff --git a/src/main/java/org/bukkit/event/entity/EntityShootBowEvent.java b/src/main/java/org/bukkit/event/entity/EntityShootBowEvent.java +index f8c91a13..c9eb75aa 100644 +--- a/src/main/java/org/bukkit/event/entity/EntityShootBowEvent.java ++++ b/src/main/java/org/bukkit/event/entity/EntityShootBowEvent.java +@@ -16,9 +16,28 @@ public class EntityShootBowEvent extends EntityEvent implements Cancellable { + private Entity projectile; + private final float force; + private boolean cancelled; ++ // Paper start ++ private boolean consumeArrow = true; ++ private final ItemStack arrowItem; ++ public boolean getConsumeArrow() { ++ return consumeArrow; ++ } ++ public void setConsumeArrow(boolean consumeArrow) { ++ this.consumeArrow = consumeArrow; ++ } + ++ public ItemStack getArrowItem() { ++ return arrowItem; ++ } ++ ++ @Deprecated + public EntityShootBowEvent(final LivingEntity shooter, final ItemStack bow, final Projectile projectile, final float force) { ++ this(shooter, bow, new ItemStack(org.bukkit.Material.AIR), projectile, force); ++ } ++ public EntityShootBowEvent(final LivingEntity shooter, final ItemStack bow, ItemStack arrowItem, final Projectile projectile, final float force) { + super(shooter); ++ this.arrowItem = arrowItem; ++ // Paper end + this.bow = bow; + this.projectile = projectile; + this.force = force; +-- +2.17.1 + diff --git a/Spigot-Server-Patches/0311-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch b/Spigot-Server-Patches/0311-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch new file mode 100644 index 000000000..4539d9411 --- /dev/null +++ b/Spigot-Server-Patches/0311-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch @@ -0,0 +1,84 @@ +From bad67ea53856fcc2b7519be08d4986c26218358d Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sat, 15 Jun 2013 19:51:17 -0400 +Subject: [PATCH] EntityShootBowEvent consumeArrow and getArrowItem API + +Adds ability to get what arrow was shot, and control if it should be consumed. + +diff --git a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java +index b92cf8e62..8f4b63c8d 100644 +--- a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java ++++ b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java +@@ -161,7 +161,7 @@ public abstract class EntitySkeletonAbstract extends EntityMonster implements IR + + entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.world.getDifficulty().a() * 4)); + // CraftBukkit start +- org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getItemInMainHand(), entityarrow, 0.8F); ++ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getItemInMainHand(), this.getItemInOffHand(), entityarrow, 0.8F); // Paper + if (event.isCancelled()) { + event.getProjectile().remove(); + return; +diff --git a/src/main/java/net/minecraft/server/ItemBow.java b/src/main/java/net/minecraft/server/ItemBow.java +index e943f8054..327d31e19 100644 +--- a/src/main/java/net/minecraft/server/ItemBow.java ++++ b/src/main/java/net/minecraft/server/ItemBow.java +@@ -53,6 +53,7 @@ public class ItemBow extends Item { + if ((double) f >= 0.1D) { + boolean flag1 = flag && itemstack1.getItem() == Items.ARROW; + ++ boolean consumeArrow = true; // Paper + if (!world.isClientSide) { + ItemArrow itemarrow = (ItemArrow) ((ItemArrow) (itemstack1.getItem() instanceof ItemArrow ? itemstack1.getItem() : Items.ARROW)); + EntityArrow entityarrow = itemarrow.a(world, itemstack1, (EntityLiving) entityhuman); +@@ -85,14 +86,15 @@ public class ItemBow extends Item { + // CraftBukkit end + } + // CraftBukkit start +- org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, itemstack, entityarrow, f); ++ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, itemstack, itemstack1, entityarrow, f); // Paper + if (event.isCancelled()) { + event.getProjectile().remove(); + return; + } + + itemstack.damage(1, entityhuman); +- if (flag1 || entityhuman.abilities.canInstantlyBuild && (itemstack1.getItem() == Items.SPECTRAL_ARROW || itemstack1.getItem() == Items.TIPPED_ARROW)) { ++ consumeArrow = event.getConsumeArrow(); // Paper ++ if (!consumeArrow || flag1 || (entityhuman.abilities.canInstantlyBuild && ((itemstack1.getItem() == Items.SPECTRAL_ARROW) || (itemstack1.getItem() == Items.TIPPED_ARROW)))) { // Paper - add !consumeArrow + entityarrow.fromPlayer = EntityArrow.PickupStatus.CREATIVE_ONLY; + } + +@@ -108,7 +110,7 @@ public class ItemBow extends Item { + } + + world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.w, SoundCategory.PLAYERS, 1.0F, 1.0F / (ItemBow.j.nextFloat() * 0.4F + 1.2F) + f * 0.5F); +- if (!flag1 && !entityhuman.abilities.canInstantlyBuild) { ++ if (!flag1 && !entityhuman.abilities.canInstantlyBuild && consumeArrow) { // Paper + itemstack1.subtract(1); + if (itemstack1.isEmpty()) { + entityhuman.inventory.f(itemstack1); +diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +index 5f816e44f..9b19c055d 100644 +--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java ++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +@@ -241,7 +241,7 @@ public class CraftEventFactory { + /** + * EntityShootBowEvent + */ +- public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, ItemStack itemstack, EntityArrow entityArrow, float force) { ++ public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, /*bow*/ItemStack itemstack, /*arrow*/ ItemStack arrowItem, EntityArrow entityArrow, float force) { // Paper + LivingEntity shooter = (LivingEntity) who.getBukkitEntity(); + CraftItemStack itemInHand = CraftItemStack.asCraftMirror(itemstack); + Arrow arrow = (Arrow) entityArrow.getBukkitEntity(); +@@ -250,7 +250,7 @@ public class CraftEventFactory { + itemInHand = null; + } + +- EntityShootBowEvent event = new EntityShootBowEvent(shooter, itemInHand, arrow, force); ++ EntityShootBowEvent event = new EntityShootBowEvent(shooter, itemInHand, CraftItemStack.asCraftMirror(arrowItem), arrow, force); // Paper + Bukkit.getPluginManager().callEvent(event); + + return event; +-- +2.17.1 +