diff options
| -rw-r--r-- | src/server/game/DataStores/DBCStructure.h | 4 | ||||
| -rwxr-xr-x | src/server/game/DataStores/DBCfmt.h | 2 | ||||
| -rwxr-xr-x | src/server/game/Entities/Unit/StatSystem.cpp | 57 |
3 files changed, 13 insertions, 50 deletions
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 1ca295fd7ba..f743b051ce8 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -705,8 +705,8 @@ struct ChrClassesEntry //uint32 flags2; // 8 m_flags (0x08 HasRelicSlot) uint32 CinematicSequence; // 9 m_cinematicSequenceID uint32 expansion; // 10 m_required_expansion - //uint32 // 11 - //uint32 // 12 + uint32 APPerStrenth; // 11 + uint32 APPerAgility; // 12 //uint32 // 13 }; diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 9f4d20358da..bdef905acfd 100755 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -39,7 +39,7 @@ const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxx const char CharTitlesEntryfmt[]="nxsxix"; const char ChatChannelsEntryfmt[]="nixsx"; -const char ChrClassesEntryfmt[]="nixsxxxixiixxx"; +const char ChrClassesEntryfmt[]="nixsxxxixiiiix"; const char ChrRacesEntryfmt[]="nxixiixixxxxixsxxxxxixxx"; const char ChrClassesXPowerTypesfmt[]="nii"; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 9fc0ce049e5..f89a0a6b2fe 100755 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -277,6 +277,7 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) float val2 = 0.0f; float level = float(getLevel()); + ChrClassesEntry const* entry = sChrClassesStore.LookupEntry(getClass()); UnitMods unitMod = ranged ? UNIT_MOD_ATTACK_POWER_RANGED : UNIT_MOD_ATTACK_POWER; uint16 index = UNIT_FIELD_ATTACK_POWER; @@ -300,53 +301,15 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) } else { - switch (getClass()) - { - case CLASS_WARRIOR: - val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f; - break; - case CLASS_PALADIN: - val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f; - break; - case CLASS_DEATH_KNIGHT: - val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f; - break; - case CLASS_ROGUE: - val2 = level * 2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) * 2.0f - 30.0f; - break; - case CLASS_HUNTER: - val2 = level * 2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f; - break; - case CLASS_SHAMAN: - val2 = level * 2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) * 2.0f - 30.0f; - break; - case CLASS_DRUID: - { - switch (GetShapeshiftForm()) - { - case FORM_CAT: - val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f + GetStat(STAT_AGILITY) * 2.0f - 40.0f; - break; - case FORM_BEAR: - case FORM_DIREBEAR: - val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f + GetStat(STAT_AGILITY) * 2.0f - 40.0f; - break; - default: - val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f; - break; - } - break; - } - case CLASS_MAGE: - val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f; - break; - case CLASS_PRIEST: - val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f; - break; - case CLASS_WARLOCK: - val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f; - break; - } + float strengthValue = std::max((GetStat(STAT_STRENGTH) - 10.0f) * entry->APPerStrenth, 0.0f); + float agilityValue = std::max((GetStat(STAT_AGILITY) - 10.0f) * entry->APPerAgility, 0.0f); + + SpellShapeshiftFormEntry const* form = sSpellShapeshiftFormStore.LookupEntry(GetShapeshiftForm()); + // Directly taken from client, SHAPESHIFT_FLAG_AP_FROM_STRENGTH ? + if (form && form->flags1 & 0x20) + agilityValue += std::max((GetStat(STAT_AGILITY) - 10.0f) * entry->APPerStrenth, 0.0f);; + + val2 = strengthValue + agilityValue; } SetModifierValue(unitMod, BASE_VALUE, val2); |
