From 2e79c8d77036a217c9b5b9bb0eb0247d3a026c2d Mon Sep 17 00:00:00 2001 From: GJ Date: Tue, 14 May 2013 22:43:13 -0400 Subject: [PATCH] Properly track infinite arrows. --- .../com/gmail/nossr50/listeners/EntityListener.java | 12 ++++++++++++ src/main/java/com/gmail/nossr50/mcMMO.java | 1 + .../gmail/nossr50/skills/archery/ArcheryManager.java | 5 +---- .../com/gmail/nossr50/util/skills/CombatUtils.java | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 869e4ec54..291a82fdf 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -2,6 +2,7 @@ package com.gmail.nossr50.listeners; import org.bukkit.OfflinePlayer; import org.bukkit.block.Block; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.AnimalTamer; import org.bukkit.entity.Entity; import org.bukkit.entity.FallingBlock; @@ -21,10 +22,12 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.entity.EntityShootBowEvent; 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.inventory.ItemStack; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -51,6 +54,15 @@ public class EntityListener implements Listener { this.plugin = plugin; } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onEntityShootBow(EntityShootBowEvent event) { + ItemStack bow = event.getBow(); + + if (bow != null && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { + event.getProjectile().setMetadata(mcMMO.infiniteArrowKey, mcMMO.metadataValue); + } + } + /** * Monitor EntityChangeBlock events. * diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 03e53a772..9f9b28016 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -94,6 +94,7 @@ public class mcMMO extends JavaPlugin { public final static String customNameKey = "mcMMO: Custom Name"; public final static String customVisibleKey = "mcMMO: Name Visibility"; public final static String droppedItemKey = "mcMMO: Tracked Item"; + public final static String infiniteArrowKey = "mcMMO: Infinite Arrow"; public static FixedMetadataValue metadataValue; diff --git a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java index ab512d769..eb4af1b18 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.skills.archery; import org.bukkit.Location; -import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; @@ -30,9 +29,7 @@ public class ArcheryManager extends SkillManager { } public boolean canTrackArrows() { - Player player = getPlayer(); - - return !(player.getItemInHand().containsEnchantment(Enchantment.ARROW_INFINITE)) && Permissions.arrowRetrieval(player); + return Permissions.arrowRetrieval(getPlayer()); } /** diff --git a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index 48dda2249..552a50450 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -245,7 +245,7 @@ public final class CombatUtils { event.setDamage(archeryManager.dazeCheck((Player) target, event.getDamage())); } - if (archeryManager.canTrackArrows()) { + if (!damager.hasMetadata(mcMMO.infiniteArrowKey) && archeryManager.canTrackArrows()) { archeryManager.trackArrows(target); }