mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
Rebase resync
This commit is contained in:
parent
a0797532e8
commit
1997c1e903
3106 changed files with 11118 additions and 627576 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue