From 0ea07d4bc76e5ed3b2bfcdce6b4d0fa4ba922fc8 Mon Sep 17 00:00:00 2001 From: GJ Date: Thu, 6 Jun 2013 19:18:27 -0400 Subject: [PATCH] Fixed bug where spawned arrows could throw ArrayIndexOutOfBoundsException. Fixes #1171 --- Changelog.txt | 1 + .../nossr50/listeners/EntityListener.java | 23 +++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index a43dd3c16..9da24ce04 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -29,6 +29,7 @@ Version 1.4.06-dev + Added information about /party itemshare and /party expshare to the party help page + Added option to use scoreboards for power level display instead of Spout. + Added permission node to prevent inspecting hidden players + = Fixed bug where spawned arrows could throw ArrayIndexOutOfBoundsException = Fixed bug where custom Spout titles were overwritten by mcMMO. = Fixed bug where Nether Quartz wasn't included in Smelting or item sharing = Fixed bug where players were able to join the same party multiple times diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 42402b368..fa44a1857 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -28,6 +28,7 @@ import org.bukkit.event.entity.EntityTameEvent; import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; @@ -59,19 +60,15 @@ public class EntityListener implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onEntityShootBow(EntityShootBowEvent event) { - ItemStack bow = event.getBow(); - - if (bow == null) { - return; - } - Entity projectile = event.getProjectile(); if (!(projectile instanceof Arrow)) { return; } - if (bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { + ItemStack bow = event.getBow(); + + if (bow != null && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { projectile.setMetadata(mcMMO.infiniteArrowKey, mcMMO.metadataValue); } @@ -79,6 +76,18 @@ public class EntityListener implements Listener { projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, Archery.locationToString(projectile.getLocation()))); } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onProjectileLaunch(ProjectileLaunchEvent event) { + Projectile projectile = event.getEntity(); + + if (!(projectile instanceof Arrow) || projectile.hasMetadata(mcMMO.bowForceKey)) { + return; + } + + projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(plugin, 1.0)); + projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, Archery.locationToString(projectile.getLocation()))); + } + /** * Monitor EntityChangeBlock events. *