diff options
| author | Chaplain <aionthefirst@gmail.com> | 2011-09-06 18:43:55 +0300 |
|---|---|---|
| committer | Chaplain <aionthefirst@gmail.com> | 2011-09-06 18:43:55 +0300 |
| commit | c190326de489253c3ab25e493504680a5c7da783 (patch) | |
| tree | 45eb5721abc80d70c05822ead2fd1e6023f11929 /src/server/game/Entities/Player | |
| parent | 207f598a20aa957054813c20ff2f2cd84cd75b09 (diff) | |
Core/Mechanic: Implement Diminishing Returns for miss\parry\dodge. Original author for parry\dodge case Lynx3d.
fixes: #2339, #2536, #887, #687 etc.
Diffstat (limited to 'src/server/game/Entities/Player')
| -rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 65 | ||||
| -rwxr-xr-x | src/server/game/Entities/Player/Player.h | 3 |
2 files changed, 38 insertions, 30 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index df8fe46499d..6c310021045 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5754,35 +5754,37 @@ float Player::GetMeleeCritFromAgility() return crit*100.0f; } -float Player::GetDodgeFromAgility() +void Player::GetDodgeFromAgility(float &diminishing, float &nondiminishing) { // Table for base dodge values - float dodge_base[MAX_CLASSES] = { - 0.0075f, // Warrior - 0.00652f, // Paladin - -0.0545f, // Hunter - -0.0059f, // Rogue - 0.03183f, // Priest - 0.0114f, // DK - 0.0167f, // Shaman - 0.034575f, // Mage - 0.02011f, // Warlock + const float dodge_base[MAX_CLASSES] = + { + 0.036640f, // Warrior + 0.034943f, // Paladi + -0.040873f, // Hunter + 0.020957f, // Rogue + 0.034178f, // Priest + 0.036640f, // DK + 0.021080f, // Shaman + 0.036587f, // Mage + 0.024211f, // Warlock 0.0f, // ?? - -0.0187f // Druid + 0.056097f // Druid }; - // Crit/agility to dodge/agility coefficient multipliers - float crit_to_dodge[MAX_CLASSES] = { - 1.1f, // Warrior - 1.0f, // Paladin - 1.6f, // Hunter - 2.0f, // Rogue - 1.0f, // Priest - 1.0f, // DK? - 1.0f, // Shaman - 1.0f, // Mage - 1.0f, // Warlock - 0.0f, // ?? - 1.7f // Druid + // Crit/agility to dodge/agility coefficient multipliers; 3.2.0 increased required agility by 15% + const float crit_to_dodge[MAX_CLASSES] = + { + 0.85f/1.15f, // Warrior + 1.00f/1.15f, // Paladin + 1.11f/1.15f, // Hunter + 2.00f/1.15f, // Rogue + 1.00f/1.15f, // Priest + 0.85f/1.15f, // DK + 1.60f/1.15f, // Shaman + 1.00f/1.15f, // Mage + 0.97f/1.15f, // Warlock (?) + 0.0f, // ?? + 2.00f/1.15f // Druid }; uint8 level = getLevel(); @@ -5791,13 +5793,18 @@ float Player::GetDodgeFromAgility() if (level > GT_MAX_LEVEL) level = GT_MAX_LEVEL; - // Dodge per agility for most classes equal crit per agility (but for some classes need apply some multiplier) + // Dodge per agility is proportional to crit per agility, which is available from DBC files GtChanceToMeleeCritEntry const *dodgeRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1); if (dodgeRatio == NULL || pclass > MAX_CLASSES) - return 0.0f; + return; + + // TODO: research if talents/effects that increase total agility by x% should increase non-diminishing part + float base_agility = GetCreateStat(STAT_AGILITY) * m_auraModifiersGroup[UNIT_MOD_STAT_START + STAT_AGILITY][BASE_PCT]; + float bonus_agility = GetStat(STAT_AGILITY) - base_agility; - float dodge=dodge_base[pclass-1] + GetStat(STAT_AGILITY) * dodgeRatio->ratio * crit_to_dodge[pclass-1]; - return dodge*100.0f; + // calculate diminishing (green in char screen) and non-diminishing (white) contribution + diminishing = 100.0f * bonus_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1]; + nondiminishing = 100.0f * (dodge_base[pclass-1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1]); } float Player::GetSpellCritFromIntellect() diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 3d19fe65f19..47f81ffb1d2 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1875,7 +1875,8 @@ class Player : public Unit, public GridObject<Player> void UpdateDefenseBonusesMod(); inline void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);} float GetMeleeCritFromAgility(); - float GetDodgeFromAgility(); + void GetDodgeFromAgility(float &diminishing, float &nondiminishing); + float GetMissPercentageFromDefence(WeaponAttackType attType) const; float GetSpellCritFromIntellect(); float OCTRegenHPPerSpirit(); float OCTRegenMPPerSpirit(); |
