Ver código fonte

Added permissions node for Greater Impact, cleanup of Axes command

GJ 13 anos atrás
pai
commit
4750aba763

+ 3 - 1
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

+ 72 - 24
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") }));
+        }
+
+        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") }));
+        }
 
-        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 (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);
+    }
 }

+ 9 - 4
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));

+ 4 - 0
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.*
      */

+ 4 - 1
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: