aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/DataStores/DBCStructure.h4
-rwxr-xr-xsrc/server/game/DataStores/DBCfmt.h2
-rwxr-xr-xsrc/server/game/Entities/Unit/StatSystem.cpp57
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);