Calculate bonus XP based on initial arrow location, rather than final

shooter location.
This commit is contained in:
GJ 2013-05-15 08:35:12 -04:00
parent 8d5696507a
commit d8ddd27d71
5 changed files with 27 additions and 14 deletions

View File

@ -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())));
}
}
}

View File

@ -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;

View File

@ -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();
}
}

View File

@ -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));
}
/**

View File

@ -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;