Rebase resync

This commit is contained in:
Antz 2020-02-17 09:19:44 +00:00
parent a0797532e8
commit 1997c1e903
3106 changed files with 11118 additions and 627576 deletions

View file

@ -1,4 +1,4 @@
/*
/**
* This code is part of MaNGOS. Contributor & Copyright details are in AUTHORS/THANKS.
*
* This program is free software; you can redistribute it and/or modify
@ -111,6 +111,8 @@ void Player::UpdateSpellDamageAndHealingBonus()
// Get damage bonus for all schools
for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
SetStatInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + i, SpellBaseDamageBonusDone(SpellSchoolMask(1 << i)));
SetStatFloatValue(PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT, GetTotalAuraModifier(SPELL_AURA_OVERRIDE_SPELL_POWER_BY_AP_PCT));
}
bool Player::UpdateAllStats()
@ -164,12 +166,11 @@ void Player::UpdateResistances(uint32 school)
void Player::UpdateArmor()
{
float value = 0.0f;
float value;
UnitMods unitMod = UNIT_MOD_ARMOR;
value = GetModifierValue(unitMod, BASE_VALUE); // base armor (from items)
value *= GetModifierValue(unitMod, BASE_PCT); // armor percent from items
value += GetStat(STAT_AGILITY) * 2.0f; // armor bonus from stats
value += GetModifierValue(unitMod, TOTAL_VALUE);
// add dynamic flat mods
@ -234,7 +235,7 @@ void Player::UpdateMaxPower(Powers power)
UnitMods unitMod = UnitMods(UNIT_MOD_POWER_START + power);
uint32 create_power = GetCreatePowers(power);
uint32 create_power = GetCreateMaxPowers(power);
// ignore classes without mana
float bonusPower = (power == POWER_MANA && create_power > 0) ? GetManaBonusFromIntellect() : 0;
@ -247,14 +248,11 @@ void Player::UpdateMaxPower(Powers power)
SetMaxPower(power, uint32(value));
}
void Player::ApplyFeralAPBonus(int32 amount, bool apply)
{
m_baseFeralAP += apply ? amount : -amount;
UpdateAttackPowerAndDamage();
}
void Player::UpdateAttackPowerAndDamage(bool ranged)
{
ChrClassesEntry const * chrEntry = sChrClassesStore.LookupEntry(getClass());
MANGOS_ASSERT(chrEntry);
float val2 = 0.0f;
float level = float(getLevel());
@ -270,83 +268,42 @@ void Player::UpdateAttackPowerAndDamage(bool ranged)
index_mod = UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS;
index_mult = UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER;
float rapPerAgi = std::max(GetStat(STAT_AGILITY) - 10.0f, 0.0f) * chrEntry->rapPerAgi;
switch (getClass())
{
case CLASS_HUNTER: val2 = level * 2.0f + GetStat(STAT_AGILITY) - 10.0f; break;
case CLASS_ROGUE: val2 = level + GetStat(STAT_AGILITY) - 10.0f; break;
case CLASS_WARRIOR: val2 = level + GetStat(STAT_AGILITY) - 10.0f; break;
case CLASS_DRUID:
switch (GetShapeshiftForm())
{
case FORM_CAT:
case FORM_BEAR:
val2 = 0.0f; break;
default:
val2 = GetStat(STAT_AGILITY) - 10.0f; break;
}
break;
default: val2 = GetStat(STAT_AGILITY) - 10.0f; break;
case CLASS_HUNTER: val2 = level * 2.0f + rapPerAgi; break;
case CLASS_ROGUE: val2 = level + rapPerAgi; break;
case CLASS_WARRIOR: val2 = level + rapPerAgi; break;
default: break;
}
}
else
{
float apPerAgi = std::max(GetStat(STAT_AGILITY) - 10.0f, 0.0f) * chrEntry->apPerAgi;
float apPerStr = std::max(GetStat(STAT_STRENGTH) - 10.0f, 0.0f) * chrEntry->apPerStr;
float levelmod;
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) - 20.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) - 20.0f; break;
case CLASS_WARRIOR:
case CLASS_PALADIN:
case CLASS_DEATH_KNIGHT:
case CLASS_DRUID:
{
ShapeshiftForm form = GetShapeshiftForm();
// Check if Predatory Strikes is skilled
float mLevelBonus = 0.0f;
float mBonusWeaponAtt = 0.0f;
switch (form)
{
case FORM_CAT:
case FORM_BEAR:
case FORM_MOONKIN:
{
Unit::AuraList const& mDummy = GetAurasByType(SPELL_AURA_DUMMY);
for (Unit::AuraList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
{
if ((*itr)->GetSpellProto()->SpellIconID != 1563)
continue;
// Predatory Strikes (effect 0)
if ((*itr)->GetEffIndex() == EFFECT_INDEX_0 && IsInFeralForm())
mLevelBonus = getLevel() * (*itr)->GetModifier()->m_amount / 100.0f;
// Predatory Strikes (effect 1)
else if ((*itr)->GetEffIndex() == EFFECT_INDEX_1)
mBonusWeaponAtt = (*itr)->GetModifier()->m_amount * m_baseFeralAP / 100.0f;
if (mLevelBonus != 0.0f && mBonusWeaponAtt != 0.0f)
break;
}
break;
}
default: break;
}
switch (form)
{
case FORM_CAT:
val2 = GetStat(STAT_STRENGTH) * 2.0f + GetStat(STAT_AGILITY) - 20.0f + mLevelBonus + m_baseFeralAP + mBonusWeaponAtt; break;
case FORM_BEAR:
val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f + mLevelBonus + m_baseFeralAP + mBonusWeaponAtt; break;
case FORM_MOONKIN:
val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f + m_baseFeralAP + mBonusWeaponAtt; break;
default:
val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f; break;
}
levelmod = 3.0f;
break;
}
case CLASS_MAGE: val2 = GetStat(STAT_STRENGTH) - 10.0f; break;
case CLASS_PRIEST: val2 = GetStat(STAT_STRENGTH) - 10.0f; break;
case CLASS_WARLOCK: val2 = GetStat(STAT_STRENGTH) - 10.0f; break;
default:
levelmod = 2.0f;
break;
}
val2 = level * levelmod + apPerAgi + apPerStr;
// extracted from client
if (getClass() == CLASS_DRUID && GetShapeshiftForm())
{
if (SpellShapeshiftFormEntry const * entry = sSpellShapeshiftFormStore.LookupEntry(uint32(GetShapeshiftForm())))
if (entry->flags1 & 0x20)
val2 += std::max(GetStat(STAT_AGILITY) - 10.0f, 0.0f) * chrEntry->apPerStr;
}
}
@ -356,21 +313,8 @@ void Player::UpdateAttackPowerAndDamage(bool ranged)
float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
// add dynamic flat mods
if (ranged)
if (!ranged)
{
if ((getClassMask() & CLASSMASK_WAND_USERS) == 0)
{
AuraList const& mRAPbyStat = GetAurasByType(SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT);
for (AuraList::const_iterator i = mRAPbyStat.begin(); i != mRAPbyStat.end(); ++i)
attPowerMod += int32(GetStat(Stats((*i)->GetModifier()->m_miscvalue)) * (*i)->GetModifier()->m_amount / 100.0f);
}
}
else
{
AuraList const& mAPbyStat = GetAurasByType(SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT);
for (AuraList::const_iterator i = mAPbyStat.begin(); i != mAPbyStat.end(); ++i)
attPowerMod += int32(GetStat(Stats((*i)->GetModifier()->m_miscvalue)) * (*i)->GetModifier()->m_amount / 100.0f);
AuraList const& mAPbyArmor = GetAurasByType(SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR);
for (AuraList::const_iterator iter = mAPbyArmor.begin(); iter != mAPbyArmor.end(); ++iter)
// always: ((*i)->GetModifier()->m_miscvalue == 1 == SPELL_SCHOOL_MASK_NORMAL)
@ -439,12 +383,19 @@ void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, fl
if (IsInFeralForm()) // check if player is druid and in cat or bear forms, non main hand attacks not allowed for this mode so not check attack type
{
uint32 lvl = getLevel();
if (lvl > 60)
lvl = 60;
float weaponSpeed = GetAttackTime(attType) / 1000.0f;
weapon_mindamage = lvl * 0.85f * att_speed;
weapon_maxdamage = lvl * 1.25f * att_speed;
switch (GetShapeshiftForm())
{
case FORM_CAT:
weapon_mindamage = weapon_mindamage / weaponSpeed;
weapon_maxdamage = weapon_maxdamage / weaponSpeed;
break;
case FORM_BEAR:
weapon_mindamage = weapon_mindamage / weaponSpeed + weapon_mindamage / 2.5f;
weapon_maxdamage = weapon_maxdamage / weaponSpeed + weapon_maxdamage / 2.5f;
break;
}
}
else if (!CanUseEquippedWeapon(attType)) // check if player not in form but still can't use weapon (broken/etc)
{
@ -587,9 +538,11 @@ void Player::UpdateParryPercentage()
if (CanParry() && parry_cap[pclass] > 0.0f)
{
// Base parry
float nondiminishing = 5.0f;
float nondiminishing = 5.0f;
float diminishing = 0.0f;
GetParryFromStrength(diminishing, nondiminishing);
// Parry from rating
float diminishing = GetRatingBonusValue(CR_PARRY);
diminishing += GetRatingBonusValue(CR_PARRY);
// Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
nondiminishing += GetTotalAuraModifier(SPELL_AURA_MOD_PARRY_PERCENT);
// apply diminishing formula to diminishing parry chance
@ -617,7 +570,8 @@ void Player::UpdateDodgePercentage()
116.890707f // Druid
};
float diminishing = 0.0f, nondiminishing = 0.0f;
float diminishing = 0.0f;
float nondiminishing = 0.0f;
// Dodge from agility
GetDodgeFromAgility(diminishing, nondiminishing);
// Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura
@ -715,28 +669,6 @@ void Player::UpdateExpertise(WeaponAttackType attack)
void Player::UpdateArmorPenetration()
{
m_armorPenetrationPct = GetRatingBonusValue(CR_ARMOR_PENETRATION);
AuraList const& armorAuras = GetAurasByType(SPELL_AURA_MOD_TARGET_ARMOR_PCT);
for (AuraList::const_iterator itr = armorAuras.begin(); itr != armorAuras.end(); ++itr)
{
// affects all weapons
if((*itr)->GetSpellProto()->GetEquippedItemClass() == -1)
{
m_armorPenetrationPct += (*itr)->GetModifier()->m_amount;
continue;
}
// dependent on weapon class
for (uint8 i = 0; i < MAX_ATTACK; ++i)
{
Item* weapon = GetWeaponForAttack(WeaponAttackType(i));
if (weapon && weapon->IsFitToSpellRequirements((*itr)->GetSpellProto()))
{
m_armorPenetrationPct += (*itr)->GetModifier()->m_amount;
break;
}
}
}
}
void Player::ApplyManaRegenBonus(int32 amount, bool apply)
@ -1077,7 +1009,7 @@ void Pet::UpdateMaxPower(Powers power)
float addValue = (power == POWER_MANA) ? GetStat(STAT_INTELLECT) - GetCreateStat(STAT_INTELLECT) : 0.0f;
float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreatePowers(power);
float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreateMaxPowers(power);
value *= GetModifierValue(unitMod, BASE_PCT);
value += GetModifierValue(unitMod, TOTAL_VALUE) + addValue * 15.0f;
value *= GetModifierValue(unitMod, TOTAL_PCT);