Skip to content

Commit

Permalink
Fix physical damage calculation
Browse files Browse the repository at this point in the history
DamageMultiplier was applied twice, resulting in extra damage
  • Loading branch information
cala committed Dec 18, 2017
1 parent c7c0d80 commit 0cc2647
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 23 deletions.
41 changes: 21 additions & 20 deletions src/game/Entities/Creature.cpp
Expand Up @@ -1221,6 +1221,9 @@ void Creature::SelectLevel(uint32 forcedLevel /*= USE_DEFAULT_DATABASE_LEVEL*/)
float maxRangedDmg = 0.f;
float meleeAttackPwr = 0.f;
float rangedAttackPwr = 0.f;

float damageMod = _GetDamageMod(rank);
float damageMulti = cinfo->DamageMultiplier * damageMod;
bool usedDamageMulti = false;

if (CreatureClassLvlStats const* cCLS = sObjectMgr.GetCreatureClassLvlStats(level, cinfo->UnitClass, cinfo->Expansion))
Expand All @@ -1243,12 +1246,12 @@ void Creature::SelectLevel(uint32 forcedLevel /*= USE_DEFAULT_DATABASE_LEVEL*/)
if (cinfo->DamageMultiplier >= 0)
{
usedDamageMulti = true;
mainMinDmg = ((cCLS->BaseDamage * cinfo->DamageVariance) + (cCLS->BaseMeleeAttackPower / 14.0f)) * (cinfo->MeleeBaseAttackTime / 1000.0f) * cinfo->DamageMultiplier;
mainMaxDmg = ((cCLS->BaseDamage * cinfo->DamageVariance *1.5f) + (cCLS->BaseMeleeAttackPower / 14.0f)) * (cinfo->MeleeBaseAttackTime / 1000.0f) * cinfo->DamageMultiplier;
mainMinDmg = ((cCLS->BaseDamage * cinfo->DamageVariance) + (cCLS->BaseMeleeAttackPower / 14.0f)) * (cinfo->MeleeBaseAttackTime / 1000.0f) * damageMulti;
mainMaxDmg = ((cCLS->BaseDamage * cinfo->DamageVariance *1.5f) + (cCLS->BaseMeleeAttackPower / 14.0f)) * (cinfo->MeleeBaseAttackTime / 1000.0f) * damageMulti;
offMinDmg = mainMinDmg / 2.0f;
offMaxDmg = mainMinDmg / 2.0f;
minRangedDmg = ((cCLS->BaseDamage * cinfo->DamageVariance) + (cCLS->BaseRangedAttackPower / 14.0f)) * (cinfo->RangedBaseAttackTime / 1000.0f) * cinfo->DamageMultiplier;
maxRangedDmg = ((cCLS->BaseDamage * cinfo->DamageVariance * 1.5f) + (cCLS->BaseRangedAttackPower / 14.0f)) * (cinfo->RangedBaseAttackTime / 1000.0f) * cinfo->DamageMultiplier;
minRangedDmg = ((cCLS->BaseDamage * cinfo->DamageVariance) + (cCLS->BaseRangedAttackPower / 14.0f)) * (cinfo->RangedBaseAttackTime / 1000.0f) * damageMulti;
maxRangedDmg = ((cCLS->BaseDamage * cinfo->DamageVariance * 1.5f) + (cCLS->BaseRangedAttackPower / 14.0f)) * (cinfo->RangedBaseAttackTime / 1000.0f) * damageMulti;

// attack power (not sure about the next line)
meleeAttackPwr = cCLS->BaseMeleeAttackPower;
Expand Down Expand Up @@ -1286,12 +1289,12 @@ void Creature::SelectLevel(uint32 forcedLevel /*= USE_DEFAULT_DATABASE_LEVEL*/)
// damage
if (!usedDamageMulti)
{
mainMinDmg = cinfo->MinMeleeDmg;
mainMaxDmg = cinfo->MaxMeleeDmg;
offMinDmg = cinfo->MinMeleeDmg;
offMaxDmg = cinfo->MaxMeleeDmg;
minRangedDmg = cinfo->MinRangedDmg;
maxRangedDmg = cinfo->MaxRangedDmg;
mainMinDmg = cinfo->MinMeleeDmg * damageMulti;
mainMaxDmg = cinfo->MaxMeleeDmg * damageMulti;
offMinDmg = cinfo->MinMeleeDmg * damageMulti;
offMaxDmg = cinfo->MaxMeleeDmg * damageMulti;
minRangedDmg = cinfo->MinRangedDmg * damageMulti;
maxRangedDmg = cinfo->MaxRangedDmg * damageMulti;

// attack power
meleeAttackPwr = cinfo->MeleeAttackPower;
Expand Down Expand Up @@ -1358,18 +1361,16 @@ void Creature::SelectLevel(uint32 forcedLevel /*= USE_DEFAULT_DATABASE_LEVEL*/)
SetModifierValue(UNIT_MOD_ARMOR, BASE_VALUE, armor);

// damage
float damagemod = _GetDamageMod(rank);

SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, mainMinDmg * damagemod);
SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, mainMaxDmg * damagemod);
SetBaseWeaponDamage(OFF_ATTACK, MINDAMAGE, offMinDmg * damagemod);
SetBaseWeaponDamage(OFF_ATTACK, MAXDAMAGE, offMaxDmg * damagemod);
SetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE, minRangedDmg * damagemod);
SetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE, maxRangedDmg * damagemod);
SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, mainMinDmg);
SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, mainMaxDmg);
SetBaseWeaponDamage(OFF_ATTACK, MINDAMAGE, offMinDmg);
SetBaseWeaponDamage(OFF_ATTACK, MAXDAMAGE, offMaxDmg);
SetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE, minRangedDmg);
SetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE, maxRangedDmg);

// attack power
SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, meleeAttackPwr * damagemod);
SetModifierValue(UNIT_MOD_ATTACK_POWER_RANGED, BASE_VALUE, rangedAttackPwr * damagemod);
SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, meleeAttackPwr * damageMod);
SetModifierValue(UNIT_MOD_ATTACK_POWER_RANGED, BASE_VALUE, rangedAttackPwr * damageMod);
}

float Creature::_GetHealthMod(int32 Rank)
Expand Down
5 changes: 2 additions & 3 deletions src/game/Entities/StatSystem.cpp
Expand Up @@ -867,13 +867,12 @@ void Creature::UpdateDamagePhysical(WeaponAttackType attType)
float base_pct = GetModifierValue(unitMod, BASE_PCT);
float total_value = GetModifierValue(unitMod, TOTAL_VALUE);
float total_pct = GetModifierValue(unitMod, TOTAL_PCT);
float dmg_multiplier = GetCreatureInfo()->DamageMultiplier;

float weapon_mindamage = GetWeaponDamageRange(attType, MINDAMAGE);
float weapon_maxdamage = GetWeaponDamageRange(attType, MAXDAMAGE);

float mindamage = ((base_value + weapon_mindamage) * dmg_multiplier * base_pct + total_value) * total_pct;
float maxdamage = ((base_value + weapon_maxdamage) * dmg_multiplier * base_pct + total_value) * total_pct;
float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;

SetStatFloatValue(attType == BASE_ATTACK ? UNIT_FIELD_MINDAMAGE : UNIT_FIELD_MINOFFHANDDAMAGE, mindamage);
SetStatFloatValue(attType == BASE_ATTACK ? UNIT_FIELD_MAXDAMAGE : UNIT_FIELD_MAXOFFHANDDAMAGE, maxdamage);
Expand Down

0 comments on commit 0cc2647

Please sign in to comment.