aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-08-16 00:09:24 +0200
committerShauren <shauren.trinity@gmail.com>2016-08-16 00:09:24 +0200
commit4a6cf1b61d6174fd2739e935b9a2f32db385859d (patch)
treea93b6ed42ad5ba8fe926967c3503d4b088f1884f /src
parent59cb6740ffe0b9b7cb2a22ff474971fffb570974 (diff)
Core/Stats: Fixed feral melee damage calculation
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp5
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp30
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp17
3 files changed, 19 insertions, 33 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 849aab0af79..90957563a6d 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7501,7 +7501,8 @@ void Player::_ApplyWeaponDamage(uint8 slot, Item* item, bool apply)
SetBaseWeaponDamage(attType, MAXDAMAGE, damage);
}
- if (proto->GetDelay() && !IsInFeralForm())
+ SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(GetShapeshiftForm());
+ if (proto->GetDelay() && !(shapeshift && shapeshift->CombatRoundTime))
SetAttackTime(attType, apply ? proto->GetDelay() : BASE_ATTACK_TIME);
if (CanModifyStats() && (damage || proto->GetDelay()))
@@ -9682,7 +9683,7 @@ Item* Player::GetWeaponForAttack(WeaponAttackType attackType, bool useable /*= f
if (!useable)
return item;
- if (item->IsBroken() || IsInFeralForm())
+ if (item->IsBroken())
return nullptr;
return item;
diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
index 231742b65b6..ba355276738 100644
--- a/src/server/game/Entities/Unit/StatSystem.cpp
+++ b/src/server/game/Entities/Unit/StatSystem.cpp
@@ -408,9 +408,9 @@ void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bo
break;
}
- float attackSpeedMod = GetAPMultiplier(attType, normalized);
+ float attackPowerMod = GetAPMultiplier(attType, normalized);
- float baseValue = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType) / 3.5f * attackSpeedMod;
+ float baseValue = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType) / 3.5f * attackPowerMod;
float basePct = GetModifierValue(unitMod, BASE_PCT);
float totalValue = GetModifierValue(unitMod, TOTAL_VALUE);
float totalPct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f;
@@ -418,22 +418,11 @@ void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bo
float weaponMinDamage = GetWeaponDamageRange(attType, MINDAMAGE);
float weaponMaxDamage = GetWeaponDamageRange(attType, MAXDAMAGE);
- if (IsInFeralForm()) // check if player is druid and in cat or bear forms
+ SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(GetShapeshiftForm());
+ if (shapeshift && shapeshift->CombatRoundTime)
{
- float weaponSpeed = BASE_ATTACK_TIME / 1000.f;
- if (Item* weapon = GetWeaponForAttack(BASE_ATTACK, true))
- weaponSpeed = weapon->GetTemplate()->GetDelay() / 1000;
-
- if (GetShapeshiftForm() == FORM_CAT_FORM)
- {
- weaponMinDamage = weaponMinDamage / weaponSpeed;
- weaponMaxDamage = weaponMaxDamage / weaponSpeed;
- }
- else if (GetShapeshiftForm() == FORM_BEAR_FORM)
- {
- weaponMinDamage = weaponMinDamage / weaponSpeed + weaponMinDamage / 2.5;
- weaponMaxDamage = weaponMinDamage / weaponSpeed + weaponMaxDamage / 2.5;
- }
+ weaponMinDamage = weaponMinDamage * shapeshift->CombatRoundTime / 1000.0f / attackPowerMod;
+ weaponMaxDamage = weaponMaxDamage * shapeshift->CombatRoundTime / 1000.0f / attackPowerMod;
}
else if (!CanUseAttackType(attType)) // check if player not in form but still can't use (disarm case)
{
@@ -447,13 +436,6 @@ void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bo
weaponMinDamage = BASE_MINDAMAGE;
weaponMaxDamage = BASE_MAXDAMAGE;
}
- /*
- TODO: Is this still needed after ammo has been removed?
- else if (attType == RANGED_ATTACK) // add ammo DPS to ranged damage
- {
- weaponMinDamage += GetAmmoDPS() * attackSpeedMod;
- weaponMaxDamage += GetAmmoDPS() * attackSpeedMod;
- }*/
minDamage = ((weaponMinDamage + baseValue) * basePct + totalValue) * totalPct;
maxDamage = ((weaponMaxDamage + baseValue) * basePct + totalValue) * totalPct;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index d665225edc1..fcd7bed0e7f 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -10679,7 +10679,7 @@ void Unit::SetShapeshiftForm(ShapeshiftForm form)
bool Unit::IsInFeralForm() const
{
ShapeshiftForm form = GetShapeshiftForm();
- return form == FORM_CAT_FORM || form == FORM_BEAR_FORM;
+ return form == FORM_CAT_FORM || form == FORM_BEAR_FORM || form == FORM_DIRE_BEAR_FORM || form == FORM_GHOST_WOLF;
}
bool Unit::IsInDisallowedMountForm() const
@@ -12593,14 +12593,17 @@ float Unit::CalculateDefaultCoefficient(SpellInfo const* spellInfo, DamageEffect
float Unit::GetAPMultiplier(WeaponAttackType attType, bool normalized)
{
- if (!normalized || GetTypeId() != TYPEID_PLAYER)
- return float(GetAttackTime(attType)) / 1000.0f;
+ if (GetTypeId() != TYPEID_PLAYER)
+ return GetAttackTime(attType) / 1000.0f;
+
+ Item* weapon = ToPlayer()->GetWeaponForAttack(attType, true);
+ if (!normalized)
+ return (weapon ? weapon->GetTemplate()->GetDelay() : BASE_ATTACK_TIME) / 1000.0f;
- Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
- if (!Weapon)
+ if (!weapon)
return 2.4f; // fist attack
- switch (Weapon->GetTemplate()->GetInventoryType())
+ switch (weapon->GetTemplate()->GetInventoryType())
{
case INVTYPE_2HWEAPON:
return 3.3f;
@@ -12612,7 +12615,7 @@ float Unit::GetAPMultiplier(WeaponAttackType attType, bool normalized)
case INVTYPE_WEAPONMAINHAND:
case INVTYPE_WEAPONOFFHAND:
default:
- return Weapon->GetTemplate()->GetSubClass() == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
+ return weapon->GetTemplate()->GetSubClass() == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
}
}