diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java index 237c74928..bbbe95f9d 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java @@ -128,7 +128,14 @@ public class Roll extends AcrobaticsSubSkill implements RandomChance { rollChance = rollStrings[0]; rollChanceLucky = rollStrings[1]; - String[] gracefulRollStrings = SkillUtils.calculateAbilityDisplayValues(skillValue, SubSkillType.ACROBATICS_ROLL, isLucky); + /* + * Graceful is double the odds of a normal roll + */ + String[] gracefulRollStrings = SkillUtils.calculateAbilityDisplayValuesCustom(skillValue, + SubSkillType.ACROBATICS_ROLL, + isLucky, + AdvancedConfig.getInstance().getMaxBonusLevel(this) / 2, + AdvancedConfig.getInstance().getMaxChance(this)); gracefulRollChance = gracefulRollStrings[0]; gracefulRollChanceLucky = gracefulRollStrings[1]; @@ -250,7 +257,12 @@ public class Roll extends AcrobaticsSubSkill implements RandomChance { private double gracefulRollCheck(Player player, McMMOPlayer mcMMOPlayer, double damage, int skillLevel) { double modifiedDamage = calculateModifiedRollDamage(damage, Acrobatics.gracefulRollThreshold); - if (!isFatal(player, modifiedDamage) && SkillUtils.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ACROBATICS_ROLL, player, getPrimarySkill(), skillLevel, getActivationChance(mcMMOPlayer))) { + if (!isFatal(player, modifiedDamage) + && SkillUtils.isActivationSuccessfulCustom(player, + this, + AdvancedConfig.getInstance().getMaxChance(SubSkillType.ACROBATICS_ROLL), + AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL) / 2)) //This effectively makes it so you reach the max chance for success at half the requirements of roll's max chance (which would make graceful roll twice as likely per skill level) + { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Ability.Proc"); SkillUtils.applyXpGain(mcMMOPlayer, getPrimarySkill(), calculateRollXP(player, damage, true), XPGainReason.PVE); @@ -373,7 +385,7 @@ public class Roll extends AcrobaticsSubSkill implements RandomChance { chancePerLevel = (1/curve) * maxBonusLevel; - return LocaleLoader.getString("Acrobatics.SubSkill.Roll.Mechanics", rollChanceHalfMax, graceChanceHalfMax, maxBonusLevel, chancePerLevel, damageThreshold); + return LocaleLoader.getString("Acrobatics.SubSkill.Roll.Mechanics", rollChanceHalfMax, graceChanceHalfMax, maxBonusLevel, chancePerLevel, damageThreshold, damageThreshold * 2); } /** diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java index 7656013a0..a62bd2079 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -65,6 +65,10 @@ public class SkillUtils { return calculateAbilityDisplayValues((AdvancedConfig.getInstance().getMaxChance(subSkillType) / maxBonusLevel) * Math.min(skillValue, maxBonusLevel), isLucky); } + public static String[] calculateAbilityDisplayValuesCustom(float skillValue, SubSkillType subSkillType, boolean isLucky, int maxBonusLevel, double maxChance) { + return calculateAbilityDisplayValues((maxChance / maxBonusLevel) * Math.min(skillValue, maxBonusLevel), isLucky); + } + public static String[] calculateLengthDisplayValues(Player player, float skillValue, PrimarySkillType skill) { int maxLength = skill.getAbility().getMaxLength(); int abilityLengthVar = Config.getInstance().getIsRetroMode() ? AdvancedConfig.getInstance().getAbilityLengthRetro() : AdvancedConfig.getInstance().getAbilityLengthStandard(); @@ -285,10 +289,10 @@ public class SkillUtils { * @param player The owner of this sub-skill * @param skill The identifier for the parent of our sub-skill * @param activationChance This is the value that we roll against, 100 is normal, and 75 is for lucky perk - * @param subskillActivationType this value represents what kind of activation procedures this sub-skill uses + * @param skillActivationType this value represents what kind of activation procedures this sub-skill uses * @return returns true if all conditions are met and they event is not cancelled */ - public static boolean isActivationSuccessful(SkillActivationType subskillActivationType, SubSkillType subSkillType, Player player, + public static boolean isActivationSuccessful(SkillActivationType skillActivationType, SubSkillType subSkillType, Player player, PrimarySkillType skill, int skillLevel, int activationChance) { //Maximum chance to succeed @@ -296,7 +300,7 @@ public class SkillUtils { //Maximum roll we can make int maxBonusLevel = AdvancedConfig.getInstance().getMaxBonusLevel(subSkillType); - switch(subskillActivationType) + switch(skillActivationType) { //100 Skill = Guaranteed case RANDOM_LINEAR_100_SCALE_NO_CAP: @@ -315,6 +319,24 @@ public class SkillUtils { } } + /** + * This method is for running a random success check with custom maxChance and maxBonusLevel values + * Mostly used for RNG effects that can't be directly associated with a specific AbstractSubSkill + * @param player target player + * @param abstractSubSkill this abstract subskill + * @param maxChance custom max chance + * @param maxBonusLevel custom max bonus level + * @return true if activation was successful + */ + public static boolean isActivationSuccessfulCustom(Player player, AbstractSubSkill abstractSubSkill, double maxChance, int maxBonusLevel) + { + + int skillLevel = UserManager.getPlayer(player).getSkillLevel(abstractSubSkill.getPrimarySkill()); + + + return performRandomSkillCheck(abstractSubSkill, player, skillLevel, PerksUtils.handleLuckyPerks(player, abstractSubSkill.getPrimarySkill()), maxChance, maxBonusLevel); + } + public static double getChanceOfSuccess(int skillLevel, double maxLevelBonus, double curve) { return getChanceOfSuccess((double) skillLevel, maxLevelBonus, curve); diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 0942436d7..56f69fba9 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -60,7 +60,7 @@ Acrobatics.SubSkill.Roll.Name=Roll Acrobatics.SubSkill.Roll.Description=Land strategically to avoid damage. Acrobatics.SubSkill.Roll.Chance=[[RED]]Roll Chance: [[YELLOW]]{0} Acrobatics.SubSkill.Roll.GraceChance=[[RED]]Graceful Roll Chance: [[YELLOW]]{0} -Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]Rolling is an active Sub-Skill with a passive component.\nWhenever you take fall damage you have a chance to completely negate the damage based on your skill level, at level 50 you have a [[YELLOW]]{0}%[[GRAY]] chance to prevent damage, and [[YELLOW]]{1}%[[GRAY]] if you activate Graceful Roll.\nThe chance for success is scaled against your skill level in a linear curve until level [[YELLOW]]{2}[[GRAY]] where it maxes out, every level in Acrobatics gives you a [[YELLOW]]{3}%[[GRAY]] chance to succeed.\nBy holding the sneak button you can double your odds to avoid fall damage and avoid up to twice the fall damage! Holding sneak will transform a normal roll into a Graceful Roll.\nRolling will only prevent up to [[RED]]{4}[[GRAY]] damage. +Acrobatics.SubSkill.Roll.Mechanics=[[GRAY]]Rolling is an active Sub-Skill with a passive component.\nWhenever you take fall damage you have a chance to completely negate the damage based on your skill level, at level 50 you have a [[YELLOW]]{0}%[[GRAY]] chance to prevent damage, and [[YELLOW]]{1}%[[GRAY]] if you activate Graceful Roll.\nThe chance for success is scaled against your skill level in a linear curve until level [[YELLOW]]{2}[[GRAY]] where it maxes out, every level in Acrobatics gives you a [[YELLOW]]{3}%[[GRAY]] chance to succeed.\nBy holding the sneak button you can double your odds to avoid fall damage and avoid up to twice the fall damage! Holding sneak will transform a normal roll into a Graceful Roll.\nRolling will only prevent up to [[RED]]{4}[[GRAY]] damage. Graceful Rolls will prevent up to [[GREEN]]{5}[[GRAY]] damage. Acrobatics.SubSkill.GracefulRoll.Name=Graceful Roll Acrobatics.SubSkill.GracefulRoll.Description=Twice as effective as a normal Roll Acrobatics.SubSkill.Dodge.Name=Dodge