diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 76a2c6096..489399b92 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -61,12 +61,16 @@ public class EntityListener implements Listener { public void onEntityShootBow(EntityShootBowEvent event) { ItemStack bow = event.getBow(); - if (bow != null && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { + if (bow != null) { Entity projectile = event.getProjectile(); if (projectile instanceof Arrow) { - projectile.setMetadata(mcMMO.infiniteArrowKey, mcMMO.metadataValue); + if (bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { + projectile.setMetadata(mcMMO.infiniteArrowKey, mcMMO.metadataValue); + } + projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(plugin, Math.min(event.getForce() * AdvancedConfig.getInstance().getForceMultiplier(), 1.0))); + projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, Archery.locationToString(projectile.getLocation()))); } } } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 212fbef89..b7536d981 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -96,6 +96,7 @@ public class mcMMO extends JavaPlugin { public final static String droppedItemKey = "mcMMO: Tracked Item"; public final static String infiniteArrowKey = "mcMMO: Infinite Arrow"; public final static String bowForceKey = "mcMMO: Bow Force"; + public final static String arrowDistanceKey = "mcMMO: Arrow Distance"; public static FixedMetadataValue metadataValue; diff --git a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java index 06c542e2c..b6bf682c7 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java @@ -4,10 +4,12 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.LivingEntity; import org.bukkit.inventory.ItemStack; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.util.Misc; @@ -65,4 +67,14 @@ public class Archery { } } } + + public static Location stringToLocation(String location) { + String[] values = location.split(","); + + return new Location(mcMMO.p.getServer().getWorld(values[0]), Double.parseDouble(values[1]), Double.parseDouble(values[2]), Double.parseDouble(values[3]), Float.parseFloat(values[4]), Float.parseFloat(values[5])); + } + + public static String locationToString(Location location) { + return location.getWorld().getName() + "," + location.getX() + "," + location.getY() + "," + location.getZ() + "," + location.getYaw() + "," + location.getPitch(); + } } 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 eb4af1b18..033da4f44 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java @@ -1,11 +1,13 @@ package com.gmail.nossr50.skills.archery; import org.bukkit.Location; +import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.locale.LocaleLoader; @@ -37,20 +39,15 @@ public class ArcheryManager extends SkillManager { * * @param target The {@link LivingEntity} damaged by the arrow */ - public void distanceXpBonus(LivingEntity target) { - Player player = getPlayer(); - Location shooterLocation = player.getLocation(); + public void distanceXpBonus(LivingEntity target, Entity damager) { + Location firedLocation = Archery.stringToLocation(damager.getMetadata(mcMMO.arrowDistanceKey).get(0).asString()); Location targetLocation = target.getLocation(); - if (shooterLocation.getWorld() != targetLocation.getWorld()) { + if (firedLocation.getWorld() != targetLocation.getWorld()) { return; } - // Cap distance at 100^2 to prevent teleport exploit. - // TODO: Better way to handle this would be great... - double squaredDistance = Math.min(shooterLocation.distanceSquared(targetLocation), 10000); - - applyXpGain((int) (squaredDistance * Archery.DISTANCE_XP_MULTIPLIER)); + applyXpGain((int) (firedLocation.distanceSquared(targetLocation) * Archery.DISTANCE_XP_MULTIPLIER)); } /** 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 4d40c9ffe..4f80a05d8 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -249,10 +249,9 @@ public final class CombatUtils { archeryManager.trackArrows(target); } - archeryManager.distanceXpBonus(target); + archeryManager.distanceXpBonus(target, damager); - double forceMultiplier = damager.hasMetadata(mcMMO.bowForceKey) ? damager.getMetadata(mcMMO.bowForceKey).get(0).asDouble() : 1.0; - startGainXp(mcMMOPlayer, target, SkillType.ARCHERY, forceMultiplier); + startGainXp(mcMMOPlayer, target, SkillType.ARCHERY, damager.getMetadata(mcMMO.bowForceKey).get(0).asDouble()); } break;