mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2024-11-22 21:26:46 +01:00
Added permissions node for Greater Impact, cleanup of Axes command
This commit is contained in:
parent
5a9249dee1
commit
4750aba763
@ -9,6 +9,8 @@ Key:
|
|||||||
|
|
||||||
Version 1.3.07
|
Version 1.3.07
|
||||||
+ Added a permission node for Archery bonus damage
|
+ 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
|
! Changed MySQL to save player information 50ms apart from each other to reduce the load on the MySQL server
|
||||||
- Removed some unused permission nodes
|
- 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 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 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 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 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 no longer kick players when they are removed from database
|
||||||
! Changed /mcremove to work on offline users for FlatFile
|
! Changed /mcremove to work on offline users for FlatFile
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.gmail.nossr50.commands.skills;
|
package com.gmail.nossr50.commands.skills;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
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.PlayerProfile;
|
||||||
import com.gmail.nossr50.datatypes.SkillType;
|
import com.gmail.nossr50.datatypes.SkillType;
|
||||||
import com.gmail.nossr50.locale.LocaleLoader;
|
import com.gmail.nossr50.locale.LocaleLoader;
|
||||||
|
import com.gmail.nossr50.util.Permissions;
|
||||||
import com.gmail.nossr50.util.Users;
|
import com.gmail.nossr50.util.Users;
|
||||||
|
|
||||||
public class AxesCommand implements CommandExecutor {
|
public class AxesCommand implements CommandExecutor {
|
||||||
@ -19,6 +22,12 @@ public class AxesCommand implements CommandExecutor {
|
|||||||
private String greaterImpactDamage;
|
private String greaterImpactDamage;
|
||||||
private String skullSplitterLength;
|
private String skullSplitterLength;
|
||||||
|
|
||||||
|
private boolean canSkullSplitter;
|
||||||
|
private boolean canCritical;
|
||||||
|
private boolean canBonusDamage;
|
||||||
|
private boolean canImpact;
|
||||||
|
private boolean canGreaterImpact;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
if (CommandHelper.noConsoleUsage(sender)) {
|
if (CommandHelper.noConsoleUsage(sender)) {
|
||||||
@ -34,51 +43,90 @@ public class AxesCommand implements CommandExecutor {
|
|||||||
|
|
||||||
skillValue = (float) PP.getSkillLevel(SkillType.AXES);
|
skillValue = (float) PP.getSkillLevel(SkillType.AXES);
|
||||||
dataCalculations(skillValue);
|
dataCalculations(skillValue);
|
||||||
|
permissionsCheck(player);
|
||||||
|
|
||||||
player.sendMessage(LocaleLoader.getString("Skills.Header", new Object[] { LocaleLoader.getString("Axes.SkillName") }));
|
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("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("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") }));
|
if (canSkullSplitter || canCritical || canBonusDamage || canImpact || canGreaterImpact) {
|
||||||
player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.0"), LocaleLoader.getString("Axes.Effect.1") }));
|
player.sendMessage(LocaleLoader.getString("Skills.Header", new Object[] { LocaleLoader.getString("Effects.Effects") }));
|
||||||
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") }));
|
|
||||||
|
|
||||||
player.sendMessage(LocaleLoader.getString("Skills.Header", new Object[] { LocaleLoader.getString("Commands.Stats.Self") }));
|
if (canSkullSplitter) {
|
||||||
player.sendMessage(LocaleLoader.getString("Axes.Combat.CritChance", new Object[] { critChance }));
|
player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Axes.Effect.0"), LocaleLoader.getString("Axes.Effect.1") }));
|
||||||
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}) }));
|
if (canCritical) {
|
||||||
player.sendMessage(LocaleLoader.getString("Axes.Combat.SS.Length", new Object[] { skullSplitterLength }));
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dataCalculations(float skillValue) {
|
private void dataCalculations(float skillValue) {
|
||||||
|
DecimalFormat percent = new DecimalFormat("##0.00%");
|
||||||
|
|
||||||
impactDamage = String.valueOf(5 + ((int) skillValue / 30));
|
impactDamage = String.valueOf(5 + ((int) skillValue / 30));
|
||||||
skullSplitterLength = String.valueOf(2 + ((int) skillValue / 50));
|
skullSplitterLength = String.valueOf(2 + ((int) skillValue / 50));
|
||||||
|
greaterImpactDamage = "2";
|
||||||
|
|
||||||
if (skillValue >= 1000) {
|
if (skillValue >= 750) {
|
||||||
critChance = "37.5";
|
critChance = "37.50";
|
||||||
bonusDamage = "4";
|
bonusDamage = "4";
|
||||||
greaterImpactDamage = "2";
|
|
||||||
}
|
|
||||||
else if (skillValue >= 750) {
|
|
||||||
critChance = "37.5";
|
|
||||||
bonusDamage = "4";
|
|
||||||
greaterImpactDamage = "2";
|
|
||||||
}
|
}
|
||||||
else if (skillValue >= 200) {
|
else if (skillValue >= 200) {
|
||||||
critChance = String.valueOf(skillValue / 20);
|
critChance = percent.format(skillValue / 2000);
|
||||||
bonusDamage = "4";
|
bonusDamage = "4";
|
||||||
greaterImpactDamage = "2";
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
critChance = String.valueOf(skillValue / 20);
|
critChance = percent.format(skillValue / 2000);
|
||||||
bonusDamage = String.valueOf((int) skillValue / 50);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ import com.gmail.nossr50.datatypes.SkillType;
|
|||||||
import com.gmail.nossr50.locale.LocaleLoader;
|
import com.gmail.nossr50.locale.LocaleLoader;
|
||||||
import com.gmail.nossr50.party.Party;
|
import com.gmail.nossr50.party.Party;
|
||||||
import com.gmail.nossr50.util.Misc;
|
import com.gmail.nossr50.util.Misc;
|
||||||
|
import com.gmail.nossr50.util.Permissions;
|
||||||
import com.gmail.nossr50.util.Users;
|
import com.gmail.nossr50.util.Users;
|
||||||
|
|
||||||
public class Axes {
|
public class Axes {
|
||||||
@ -110,7 +111,7 @@ public class Axes {
|
|||||||
durabilityDamage += Users.getProfile(attacker).getSkillLevel(SkillType.AXES)/30;
|
durabilityDamage += Users.getProfile(attacker).getSkillLevel(SkillType.AXES)/30;
|
||||||
|
|
||||||
if (!hasArmor(targetPlayer)) {
|
if (!hasArmor(targetPlayer)) {
|
||||||
applyImpact(attacker, target, event);
|
applyGreaterImpact(attacker, target, event);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (ItemStack armor : targetPlayer.getInventory().getArmorContents()) {
|
for (ItemStack armor : targetPlayer.getInventory().getArmorContents()) {
|
||||||
@ -120,21 +121,25 @@ public class Axes {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
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 attacker The attacking player
|
||||||
* @param target The defending entity
|
* @param target The defending entity
|
||||||
* @param event The event to modify
|
* @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 int GREATER_IMPACT_CHANCE = 25;
|
||||||
final double GREATER_IMPACT_MULTIPLIER = 1.5;
|
final double GREATER_IMPACT_MULTIPLIER = 1.5;
|
||||||
|
|
||||||
|
if (!Permissions.getInstance().greaterImpact(attacker)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (random.nextInt(100) <= GREATER_IMPACT_CHANCE) {
|
if (random.nextInt(100) <= GREATER_IMPACT_CHANCE) {
|
||||||
event.setDamage(event.getDamage() + 2);
|
event.setDamage(event.getDamage() + 2);
|
||||||
target.setVelocity(attacker.getLocation().getDirection().normalize().multiply(GREATER_IMPACT_MULTIPLIER));
|
target.setVelocity(attacker.getLocation().getDirection().normalize().multiply(GREATER_IMPACT_MULTIPLIER));
|
||||||
|
@ -288,6 +288,10 @@ public class Permissions {
|
|||||||
return player.hasPermission("mcmmo.ability.axes.impact");
|
return player.hasPermission("mcmmo.ability.axes.impact");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean greaterImpact(Player player) {
|
||||||
|
return player.hasPermission("mcmmo.ability.axes.greaterimpact");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MCMMO.ABILITY.ACROBATICS.*
|
* MCMMO.ABILITY.ACROBATICS.*
|
||||||
*/
|
*/
|
||||||
|
@ -342,14 +342,17 @@ permissions:
|
|||||||
mcmmo.ability.axes.bonusdamage: true
|
mcmmo.ability.axes.bonusdamage: true
|
||||||
mcmmo.ability.axes.criticalhit: true
|
mcmmo.ability.axes.criticalhit: true
|
||||||
mcmmo.ability.axes.impact: true
|
mcmmo.ability.axes.impact: true
|
||||||
|
mcmmo.ability.axes.greaterimpact: true
|
||||||
mcmmo.ability.axes.skullsplitter:
|
mcmmo.ability.axes.skullsplitter:
|
||||||
description: Allows access to the Skull Splitter ability
|
description: Allows access to the Skull Splitter ability
|
||||||
mcmmo.ability.axes.bonusdamage:
|
mcmmo.ability.axes.bonusdamage:
|
||||||
description: Allows bonus damage from Axes
|
description: Allows bonus damage from Axes
|
||||||
mcmmo.ability.axes.criticalhit:
|
mcmmo.ability.axes.criticalhit:
|
||||||
description: Allows access to the Critical Hit ability
|
description: Allows access to the Critical Hit ability
|
||||||
mcmmo.ability.axes.skullsplitter:
|
mcmmo.ability.axes.impact:
|
||||||
description: Allows access to the Impact ability
|
description: Allows access to the Impact ability
|
||||||
|
mcmmo.ability.axes.greaterimpact:
|
||||||
|
description: Allows access to the Greater Impact ability
|
||||||
mcmmo.ability.acrobatics.*:
|
mcmmo.ability.acrobatics.*:
|
||||||
description: Allows access to all Acrobatics abilities
|
description: Allows access to all Acrobatics abilities
|
||||||
children:
|
children:
|
||||||
|
Loading…
Reference in New Issue
Block a user