From 4750aba76333ef58553929e710c2c0c12a30b4da Mon Sep 17 00:00:00 2001 From: GJ Date: Mon, 30 Apr 2012 07:46:08 -0400 Subject: [PATCH] Added permissions node for Greater Impact, cleanup of Axes command --- Changelog.txt | 4 +- .../nossr50/commands/skills/AxesCommand.java | 96 ++++++++++++++----- .../java/com/gmail/nossr50/skills/Axes.java | 13 ++- .../com/gmail/nossr50/util/Permissions.java | 4 + src/main/resources/plugin.yml | 5 +- 5 files changed, 92 insertions(+), 30 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 84ba44c5f..04298af1d 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -9,6 +9,8 @@ Key: Version 1.3.07 + Added a permission node for Archery bonus damage + + Added a permission node for Greater Impact ability + = Fixed bug where the permission node for Impact didn't work ! Changed MySQL to save player information 50ms apart from each other to reduce the load on the MySQL server - Removed some unused permission nodes @@ -36,7 +38,7 @@ Version 1.3.06 ! Changed Bleeding to now stack to a finite number on Monsters and will wear off eventually ! Changed how we handled the config file to prevent any bugs when returning values ! Changed locale files to use a new naming scheme. This breaks ALL old locale files. If you want to assist with re-translating anything, go to getlocalization.com/mcMMO - ! Changed mcremove to check for users in the MySQL DB before sending queries to remove them + ! Changed /mcremove to check for users in the MySQL DB before sending queries to remove them ! Changed how the tree feller threshold worked for the better ! Changed /mcremove to no longer kick players when they are removed from database ! Changed /mcremove to work on offline users for FlatFile diff --git a/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java index e2a7b0879..7ff68e009 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java @@ -1,5 +1,7 @@ package com.gmail.nossr50.commands.skills; +import java.text.DecimalFormat; + import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -9,6 +11,7 @@ import com.gmail.nossr50.commands.CommandHelper; import com.gmail.nossr50.datatypes.PlayerProfile; import com.gmail.nossr50.datatypes.SkillType; import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Users; public class AxesCommand implements CommandExecutor { @@ -19,6 +22,12 @@ public class AxesCommand implements CommandExecutor { private String greaterImpactDamage; private String skullSplitterLength; + private boolean canSkullSplitter; + private boolean canCritical; + private boolean canBonusDamage; + private boolean canImpact; + private boolean canGreaterImpact; + @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (CommandHelper.noConsoleUsage(sender)) { @@ -34,51 +43,90 @@ public class AxesCommand implements CommandExecutor { skillValue = (float) PP.getSkillLevel(SkillType.AXES); dataCalculations(skillValue); + permissionsCheck(player); player.sendMessage(LocaleLoader.getString("Skills.Header", new Object[] { LocaleLoader.getString("Axes.SkillName") })); player.sendMessage(LocaleLoader.getString("Commands.XPGain", new Object[] { LocaleLoader.getString("Commands.XPGain.Axes") })); player.sendMessage(LocaleLoader.getString("Effects.Level", new Object[] { PP.getSkillLevel(SkillType.AXES), PP.getSkillXpLevel(SkillType.AXES), PP.getXpToLevel(SkillType.AXES) })); - player.sendMessage(LocaleLoader.getString("Skills.Header", new Object[] { LocaleLoader.getString("Effects.Effects") })); - player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.0"), LocaleLoader.getString("Axes.Effect.1") })); - player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.2"), LocaleLoader.getString("Axes.Effect.3") })); - player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.4"), LocaleLoader.getString("Axes.Effect.5") })); - player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.6"), LocaleLoader.getString("Axes.Effect.7") })); - player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.8"), LocaleLoader.getString("Axes.Effect.9") })); + if (canSkullSplitter || canCritical || canBonusDamage || canImpact || canGreaterImpact) { + player.sendMessage(LocaleLoader.getString("Skills.Header", new Object[] { LocaleLoader.getString("Effects.Effects") })); + } - player.sendMessage(LocaleLoader.getString("Skills.Header", new Object[] { LocaleLoader.getString("Commands.Stats.Self") })); - player.sendMessage(LocaleLoader.getString("Axes.Combat.CritChance", new Object[] { critChance })); - player.sendMessage(LocaleLoader.getString("Ability.Generic.Template", new Object[] { LocaleLoader.getString("Axes.Ability.Bonus.0"), LocaleLoader.getString("Axes.Ability.Bonus.1", new Object[] {bonusDamage}) })); - player.sendMessage(LocaleLoader.getString("Ability.Generic.Template", new Object[] { LocaleLoader.getString("Axes.Ability.Bonus.2"), LocaleLoader.getString("Axes.Ability.Bonus.3", new Object[] {impactDamage}) })); - player.sendMessage(LocaleLoader.getString("Ability.Generic.Template", new Object[] { LocaleLoader.getString("Axes.Ability.Bonus.4"), LocaleLoader.getString("Axes.Ability.Bonus.5", new Object[] {greaterImpactDamage}) })); - player.sendMessage(LocaleLoader.getString("Axes.Combat.SS.Length", new Object[] { skullSplitterLength })); + if (canSkullSplitter) { + player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.0"), LocaleLoader.getString("Axes.Effect.1") })); + } + + if (canCritical) { + player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.2"), LocaleLoader.getString("Axes.Effect.3") })); + } + + if (canBonusDamage) { + player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.4"), LocaleLoader.getString("Axes.Effect.5") })); + } + + if (canImpact) { + player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.6"), LocaleLoader.getString("Axes.Effect.7") })); + } + + if (canGreaterImpact) { + player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.8"), LocaleLoader.getString("Axes.Effect.9") })); + } + + if (canSkullSplitter || canCritical || canBonusDamage || canImpact || canGreaterImpact) { + player.sendMessage(LocaleLoader.getString("Skills.Header", new Object[] { LocaleLoader.getString("Commands.Stats.Self") })); + } + + if (canBonusDamage) { + player.sendMessage(LocaleLoader.getString("Ability.Generic.Template", new Object[] { LocaleLoader.getString("Axes.Ability.Bonus.0"), LocaleLoader.getString("Axes.Ability.Bonus.1", new Object[] {bonusDamage}) })); + } + + if (canImpact) { + player.sendMessage(LocaleLoader.getString("Ability.Generic.Template", new Object[] { LocaleLoader.getString("Axes.Ability.Bonus.2"), LocaleLoader.getString("Axes.Ability.Bonus.3", new Object[] {impactDamage}) })); + } + + if (canGreaterImpact) { + player.sendMessage(LocaleLoader.getString("Ability.Generic.Template", new Object[] { LocaleLoader.getString("Axes.Ability.Bonus.4"), LocaleLoader.getString("Axes.Ability.Bonus.5", new Object[] {greaterImpactDamage}) })); + } + + if (canCritical) { + player.sendMessage(LocaleLoader.getString("Axes.Combat.CritChance", new Object[] { critChance })); + } + + if (canSkullSplitter) { + player.sendMessage(LocaleLoader.getString("Axes.Combat.SS.Length", new Object[] { skullSplitterLength })); + } return true; } private void dataCalculations(float skillValue) { + DecimalFormat percent = new DecimalFormat("##0.00%"); + impactDamage = String.valueOf(5 + ((int) skillValue / 30)); skullSplitterLength = String.valueOf(2 + ((int) skillValue / 50)); + greaterImpactDamage = "2"; - if (skillValue >= 1000) { - critChance = "37.5"; + if (skillValue >= 750) { + critChance = "37.50"; bonusDamage = "4"; - greaterImpactDamage = "2"; - } - else if (skillValue >= 750) { - critChance = "37.5"; - bonusDamage = "4"; - greaterImpactDamage = "2"; } else if (skillValue >= 200) { - critChance = String.valueOf(skillValue / 20); + critChance = percent.format(skillValue / 2000); bonusDamage = "4"; - greaterImpactDamage = "2"; } else { - critChance = String.valueOf(skillValue / 20); + critChance = percent.format(skillValue / 2000); bonusDamage = String.valueOf((int) skillValue / 50); - greaterImpactDamage = "2"; } } + + private void permissionsCheck(Player player) { + Permissions permInstance = Permissions.getInstance(); + canSkullSplitter = permInstance.skullSplitter(player); + canCritical = permInstance.criticalHit(player); + canBonusDamage = permInstance.axeBonus(player); + canImpact = permInstance.impact(player); + canGreaterImpact = permInstance.greaterImpact(player); + } } diff --git a/src/main/java/com/gmail/nossr50/skills/Axes.java b/src/main/java/com/gmail/nossr50/skills/Axes.java index 86ed7d976..62a1cb057 100644 --- a/src/main/java/com/gmail/nossr50/skills/Axes.java +++ b/src/main/java/com/gmail/nossr50/skills/Axes.java @@ -16,6 +16,7 @@ import com.gmail.nossr50.datatypes.SkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.party.Party; import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Users; public class Axes { @@ -110,7 +111,7 @@ public class Axes { durabilityDamage += Users.getProfile(attacker).getSkillLevel(SkillType.AXES)/30; if (!hasArmor(targetPlayer)) { - applyImpact(attacker, target, event); + applyGreaterImpact(attacker, target, event); } else { for (ItemStack armor : targetPlayer.getInventory().getArmorContents()) { @@ -120,21 +121,25 @@ public class Axes { } } else { - applyImpact(attacker, target, event); //Since mobs are technically unarmored, this will always trigger + applyGreaterImpact(attacker, target, event); //Since mobs are technically unarmored, this will always trigger } } /** - * Apply impact ability. + * Apply Greater Impact ability. * * @param attacker The attacking player * @param target The defending entity * @param event The event to modify */ - private static void applyImpact(Player attacker, LivingEntity target, EntityDamageByEntityEvent event) { + private static void applyGreaterImpact(Player attacker, LivingEntity target, EntityDamageByEntityEvent event) { final int GREATER_IMPACT_CHANCE = 25; final double GREATER_IMPACT_MULTIPLIER = 1.5; + if (!Permissions.getInstance().greaterImpact(attacker)) { + return; + } + if (random.nextInt(100) <= GREATER_IMPACT_CHANCE) { event.setDamage(event.getDamage() + 2); target.setVelocity(attacker.getLocation().getDirection().normalize().multiply(GREATER_IMPACT_MULTIPLIER)); diff --git a/src/main/java/com/gmail/nossr50/util/Permissions.java b/src/main/java/com/gmail/nossr50/util/Permissions.java index d3fd838b9..8bf424d88 100644 --- a/src/main/java/com/gmail/nossr50/util/Permissions.java +++ b/src/main/java/com/gmail/nossr50/util/Permissions.java @@ -288,6 +288,10 @@ public class Permissions { return player.hasPermission("mcmmo.ability.axes.impact"); } + public boolean greaterImpact(Player player) { + return player.hasPermission("mcmmo.ability.axes.greaterimpact"); + } + /* * MCMMO.ABILITY.ACROBATICS.* */ diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index bfbb48df3..cf0de1155 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -342,14 +342,17 @@ permissions: mcmmo.ability.axes.bonusdamage: true mcmmo.ability.axes.criticalhit: true mcmmo.ability.axes.impact: true + mcmmo.ability.axes.greaterimpact: true mcmmo.ability.axes.skullsplitter: description: Allows access to the Skull Splitter ability mcmmo.ability.axes.bonusdamage: description: Allows bonus damage from Axes mcmmo.ability.axes.criticalhit: description: Allows access to the Critical Hit ability - mcmmo.ability.axes.skullsplitter: + mcmmo.ability.axes.impact: description: Allows access to the Impact ability + mcmmo.ability.axes.greaterimpact: + description: Allows access to the Greater Impact ability mcmmo.ability.acrobatics.*: description: Allows access to all Acrobatics abilities children: