mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
[11434] Implemented diminishing returns (DR) for dodge and parry chances.
Also updated base dodge and agility=>dodge conversion values for 3.2 and later Base stats and percentage based talents/buffs are not affected by DR, it basically prevents items and stat buffs becoming disproportionally powerful in terms of survivability as characters approach 100% avoidance. TODO: implement DR for chance to be missed from defense rating
This commit is contained in:
parent
8807af4a18
commit
3f531024f7
4 changed files with 109 additions and 43 deletions
|
|
@ -552,20 +552,55 @@ void Player::UpdateAllCritPercentages()
|
|||
UpdateCritPercentage(RANGED_ATTACK);
|
||||
}
|
||||
|
||||
const float Player::m_diminishing_k[MAX_CLASSES] =
|
||||
{
|
||||
0.9560f, // Warrior
|
||||
0.9560f, // Paladin
|
||||
0.9880f, // Hunter
|
||||
0.9880f, // Rogue
|
||||
0.9830f, // Priest
|
||||
0.9560f, // DK
|
||||
0.9880f, // Shaman
|
||||
0.9830f, // Mage
|
||||
0.9830f, // Warlock
|
||||
0.0f, // ??
|
||||
0.9720f // Druid
|
||||
};
|
||||
|
||||
void Player::UpdateParryPercentage()
|
||||
{
|
||||
const float parry_cap[MAX_CLASSES] =
|
||||
{
|
||||
47.003525f, // Warrior
|
||||
47.003525f, // Paladin
|
||||
145.560408f, // Hunter
|
||||
145.560408f, // Rogue
|
||||
0.0f, // Priest
|
||||
47.003525f, // DK
|
||||
145.560408f, // Shaman
|
||||
0.0f, // Mage
|
||||
0.0f, // Warlock
|
||||
0.0f, // ??
|
||||
0.0f // Druid
|
||||
};
|
||||
|
||||
// No parry
|
||||
float value = 0.0f;
|
||||
if (CanParry())
|
||||
uint32 pclass = getClass()-1;
|
||||
if (CanParry() && parry_cap[pclass] > 0.0f)
|
||||
{
|
||||
// Base parry
|
||||
value = 5.0f;
|
||||
// Modify value from defense skill
|
||||
value += (int32(GetDefenseSkillValue()) - int32(GetMaxSkillValueForLevel())) * 0.04f;
|
||||
// Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
|
||||
value += GetTotalAuraModifier(SPELL_AURA_MOD_PARRY_PERCENT);
|
||||
float nondiminishing = 5.0f;
|
||||
// Parry from rating
|
||||
value += GetRatingBonusValue(CR_PARRY);
|
||||
float diminishing = GetRatingBonusValue(CR_PARRY);
|
||||
// Modify value from defense skill (only bonus from defense rating diminishes)
|
||||
nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
|
||||
diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
|
||||
// Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
|
||||
nondiminishing += GetTotalAuraModifier(SPELL_AURA_MOD_PARRY_PERCENT);
|
||||
// apply diminishing formula to diminishing parry chance
|
||||
value = nondiminishing + diminishing * parry_cap[pclass] /
|
||||
(diminishing + parry_cap[pclass] * m_diminishing_k[pclass]);
|
||||
value = value < 0.0f ? 0.0f : value;
|
||||
}
|
||||
SetStatFloatValue(PLAYER_PARRY_PERCENTAGE, value);
|
||||
|
|
@ -573,14 +608,35 @@ void Player::UpdateParryPercentage()
|
|||
|
||||
void Player::UpdateDodgePercentage()
|
||||
{
|
||||
const float dodge_cap[MAX_CLASSES] =
|
||||
{
|
||||
88.129021f, // Warrior
|
||||
88.129021f, // Paladin
|
||||
145.560408f, // Hunter
|
||||
145.560408f, // Rogue
|
||||
150.375940f, // Priest
|
||||
88.129021f, // DK
|
||||
145.560408f, // Shaman
|
||||
150.375940f, // Mage
|
||||
150.375940f, // Warlock
|
||||
0.0f, // ??
|
||||
116.890707f // Druid
|
||||
};
|
||||
|
||||
float diminishing = 0.0f, nondiminishing = 0.0f;
|
||||
// Dodge from agility
|
||||
float value = GetDodgeFromAgility();
|
||||
// Modify value from defense skill
|
||||
value += (int32(GetDefenseSkillValue()) - int32(GetMaxSkillValueForLevel())) * 0.04f;
|
||||
GetDodgeFromAgility(diminishing, nondiminishing);
|
||||
// Modify value from defense skill (only bonus from defense rating diminishes)
|
||||
nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
|
||||
diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
|
||||
// Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura
|
||||
value += GetTotalAuraModifier(SPELL_AURA_MOD_DODGE_PERCENT);
|
||||
nondiminishing += GetTotalAuraModifier(SPELL_AURA_MOD_DODGE_PERCENT);
|
||||
// Dodge from rating
|
||||
value += GetRatingBonusValue(CR_DODGE);
|
||||
diminishing += GetRatingBonusValue(CR_DODGE);
|
||||
// apply diminishing formula to diminishing dodge chance
|
||||
uint32 pclass = getClass()-1;
|
||||
float value = nondiminishing + (diminishing * dodge_cap[pclass] /
|
||||
(diminishing + dodge_cap[pclass] * m_diminishing_k[pclass]));
|
||||
value = value < 0.0f ? 0.0f : value;
|
||||
SetStatFloatValue(PLAYER_DODGE_PERCENTAGE, value);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue