From 14d13eb4c74dd157d38da894ce0566135ad5c737 Mon Sep 17 00:00:00 2001 From: GJ Date: Wed, 13 Jun 2012 08:53:18 -0400 Subject: [PATCH] Archery rework. --- .../gmail/nossr50/skills/archery/Archery.java | 20 ++++----- .../skills/archery/ArcheryManager.java | 42 ++++++++----------- .../archery/BonusDamageEventHandler.java | 32 ++++++++++++++ .../java/com/gmail/nossr50/util/Combat.java | 36 ++++------------ 4 files changed, 65 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/skills/archery/BonusDamageEventHandler.java 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 401d28237..217dee71d 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java @@ -1,9 +1,7 @@ package com.gmail.nossr50.skills.archery; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; -import java.util.Map.Entry; import java.util.Random; import org.bukkit.Material; import org.bukkit.entity.Entity; @@ -18,13 +16,13 @@ public class Archery { public static final int ARROW_TRACKING_MAX_BONUS_LEVEL = 1000; + public static final int BONUS_DAMAGE_INCREASE_LEVEL = 50; + public static final double BONUS_DAMAGE_INCREASE_PERCENT = 0.1D; + public static final double BONUS_DAMAGE_MAX_BONUS_PERCENTAGE = 2.0D; + public static final int DAZE_MAX_BONUS_LEVEL = 1000; public static final int DAZE_MODIFIER = 4; -// protected static Set> getEntitySet() { -// return arrowTracker.entrySet(); -// } - protected static boolean arrowTrackerContains(LivingEntity livingEntity) { return arrowTracker.containsKey(livingEntity); } @@ -43,14 +41,10 @@ public class Archery { * @param entity The entity hit by the arrows */ public static void arrowRetrievalCheck(Entity entity) { - for (Iterator> it = arrowTracker.entrySet().iterator() ; it.hasNext() ; ) { //This is a wee bit confusing... - Entry entry = it.next(); + Integer quantity = arrowTracker.remove(entity); - if (entry.getKey() == entity) { //Shouldn't we be using .equals() here? - Misc.dropItems(entity.getLocation(), new ItemStack(Material.ARROW), entry.getValue()); - it.remove(); - return; - } + if (quantity != null) { + Misc.dropItems(entity.getLocation(), new ItemStack(Material.ARROW), quantity); } } 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 91c022aa9..adbe444fd 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java @@ -1,19 +1,10 @@ package com.gmail.nossr50.skills.archery; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -import org.bukkit.Material; -import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.inventory.ItemStack; - import com.gmail.nossr50.datatypes.PlayerProfile; import com.gmail.nossr50.datatypes.SkillType; -import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Users; @@ -67,22 +58,23 @@ public class ArcheryManager { } } -// public void retrieveArrows() { -// if (!permissionsInstance.trackArrows(player)) { -// return; -// } -// -// if () -// for (Iterator> it = arrowTracker.entrySet().iterator() ; it.hasNext() ; ) { //This is a wee bit confusing... -// Entry entry = it.next(); -// -// if (entry.getKey() == entity) { //Shouldn't we be using .equals() here? -// Misc.dropItems(entity.getLocation(), new ItemStack(Material.ARROW), entry.getValue()); -// it.remove(); -// return; -// } -// } -// } + /** + * Handle archery bonus damage. + * + * @param event The event to modify. + */ + public void bonusDamage(EntityDamageEvent event) { + if (!permissionsInstance.archeryBonus(player)) { + return; + } + + if (skillLevel >= Archery.BONUS_DAMAGE_INCREASE_LEVEL) { + BonusDamageEventHandler eventHandler = new BonusDamageEventHandler(this, event); + + eventHandler.calculateDamageBonus(); + eventHandler.modifyEventDamage(); + } + } protected int getSkillLevel() { return skillLevel; diff --git a/src/main/java/com/gmail/nossr50/skills/archery/BonusDamageEventHandler.java b/src/main/java/com/gmail/nossr50/skills/archery/BonusDamageEventHandler.java new file mode 100644 index 000000000..788e35947 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/skills/archery/BonusDamageEventHandler.java @@ -0,0 +1,32 @@ +package com.gmail.nossr50.skills.archery; + +import org.bukkit.event.entity.EntityDamageEvent; + +public class BonusDamageEventHandler { + private ArcheryManager manager; + private EntityDamageEvent event; + + protected double damageBonusPercent; + + protected BonusDamageEventHandler(ArcheryManager manager, EntityDamageEvent event) { + this.manager = manager; + this.event = event; + } + + protected void calculateDamageBonus() { + double damageBonus = ((manager.getSkillLevel() / Archery.BONUS_DAMAGE_INCREASE_LEVEL) * Archery.BONUS_DAMAGE_INCREASE_PERCENT); + + if (damageBonus > Archery.BONUS_DAMAGE_MAX_BONUS_PERCENTAGE) { + damageBonus = Archery.BONUS_DAMAGE_MAX_BONUS_PERCENTAGE; + } + + this.damageBonusPercent = damageBonus; + } + + protected void modifyEventDamage() { + int damage = event.getDamage(); + int archeryBonus = (int) (damage * damageBonusPercent); + + event.setDamage(damage + archeryBonus); + } +} diff --git a/src/main/java/com/gmail/nossr50/util/Combat.java b/src/main/java/com/gmail/nossr50/util/Combat.java index 95fa2ccd1..72a810b45 100644 --- a/src/main/java/com/gmail/nossr50/util/Combat.java +++ b/src/main/java/com/gmail/nossr50/util/Combat.java @@ -255,37 +255,19 @@ public class Combat { } } - if (permInstance.archery(shooter)) { - if (permInstance.archeryBonus(shooter)) { - /*Archery needs a damage bonus to be viable in PVP*/ - int skillLvl = Users.getProfile(shooter).getSkillLevel(SkillType.ARCHERY); - double dmgBonusPercent = ((skillLvl / 50) * 0.1D); + ArcheryManager archeryManager = new ArcheryManager(shooter); - /* Cap maximum bonus at 200% */ - if (dmgBonusPercent > 2) { - dmgBonusPercent = 2; - } + archeryManager.bonusDamage(event); - /* Every 50 skill levels Archery gains 10% damage bonus, set that here */ - //TODO: Work in progress for balancing out Archery, will work on it more later... - int damage = event.getDamage(); - int archeryBonus = (int) (damage * dmgBonusPercent); + if (target instanceof Player) { + archeryManager.dazeCheck((Player) target, event); + } - event.setDamage(damage + archeryBonus); - } + archeryManager.trackArrows(target); - ArcheryManager archeryManager = new ArcheryManager(shooter); - - if (target instanceof Player) { - archeryManager.dazeCheck((Player) target, event); - } - - archeryManager.trackArrows(target); - - if (target != shooter) { - PlayerProfile PP = Users.getProfile(shooter); - startGainXp(shooter, PP, target, SkillType.ARCHERY); - } + if (target != shooter) { + PlayerProfile PP = Users.getProfile(shooter); + startGainXp(shooter, PP, target, SkillType.ARCHERY); } }