Core/Spells: Named and implemented most of SpellAttr7
This commit is contained in:
1 parent
4b1cf485e0
commit
3c0cf32b43
12 files changed
+135
-130
No files matched your search
@@ -880,7 +880,7 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons
|
||||
if (Player* killer = attacker->ToPlayer())
|
||||
{
|
||||
// in bg, count dmg if victim is also a player
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && !(spellProto && spellProto->HasAttribute(SPELL_ATTR7_DO_NOT_COUNT_FOR_PVP_SCOREBOARD)))
|
||||
if (Battleground* bg = killer->GetBattleground())
|
||||
bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
|
||||
|
||||
@@ -955,7 +955,7 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons
|
||||
|
||||
if (damagetype != NODAMAGE && damagetype != DOT)
|
||||
{
|
||||
if (victim != attacker && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR6_NO_PUSHBACK) || spellProto->HasAttribute(SPELL_ATTR7_NO_PUSHBACK_ON_DAMAGE) || spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC))))
|
||||
if (victim != attacker && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR6_NO_PUSHBACK) || spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK) || spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC))))
|
||||
{
|
||||
if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
|
||||
{
|
||||
@@ -2303,8 +2303,8 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
|
||||
return SPELL_MISS_NONE;
|
||||
|
||||
bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_CANT_DODGE);
|
||||
bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_CANT_PARRY);
|
||||
bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
|
||||
bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
|
||||
bool canBlock = !spellInfo->HasAttribute(SPELL_ATTR8_CANT_BLOCK);
|
||||
|
||||
// if victim is casting or cc'd it can't avoid attacks
|
||||
@@ -3589,7 +3589,7 @@ void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId
|
||||
// Call OnDispel hook on AuraScript
|
||||
aura->CallScriptDispel(&dispelInfo);
|
||||
|
||||
if (aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_CHARGES))
|
||||
if (aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES))
|
||||
aura->ModCharges(-dispelInfo.GetRemovedCharges(), AuraRemoveFlags::ByEnemySpell);
|
||||
else
|
||||
aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AuraRemoveFlags::ByEnemySpell);
|
||||
@@ -3629,7 +3629,7 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, ObjectGuid casterGUID, W
|
||||
}
|
||||
}
|
||||
|
||||
bool stealCharge = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_CHARGES);
|
||||
bool stealCharge = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
|
||||
// Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
|
||||
uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
|
||||
|
||||
@@ -4301,7 +4301,7 @@ void Unit::GetDispellableAuraList(WorldObject const* caster, uint32 dispelMask,
|
||||
// The charges / stack amounts don't count towards the total number of auras that can be dispelled.
|
||||
// Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
|
||||
// Polymorph instead of 1 / (5 + 1) -> 16%.
|
||||
bool const dispelCharges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_CHARGES);
|
||||
bool const dispelCharges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
|
||||
uint8 charges = dispelCharges ? aura->GetCharges() : aura->GetStackAmount();
|
||||
if (charges > 0)
|
||||
dispelList.emplace_back(aura, chance, charges);
|
||||
@@ -5056,10 +5056,21 @@ void Unit::SendSpellNonMeleeDamageLog(Unit* target, uint32 spellID, uint32 damag
|
||||
/*static*/ void Unit::ProcSkillsAndAuras(Unit* actor, Unit* actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell* spell, DamageInfo* damageInfo, HealInfo* healInfo)
|
||||
{
|
||||
WeaponAttackType attType = damageInfo ? damageInfo->GetAttackType() : BASE_ATTACK;
|
||||
if (typeMaskActor && actor)
|
||||
SpellInfo const* spellInfo = [&]() -> SpellInfo const*
|
||||
{
|
||||
if (spell)
|
||||
return spell->GetSpellInfo();
|
||||
if (damageInfo)
|
||||
return damageInfo->GetSpellInfo();
|
||||
if (healInfo)
|
||||
return healInfo->GetSpellInfo();
|
||||
return nullptr;
|
||||
}();
|
||||
|
||||
if (typeMaskActor && actor && !(spellInfo && spellInfo->HasAttribute(SPELL_ATTR3_SUPPRESS_CASTER_PROCS)))
|
||||
actor->ProcSkillsAndReactives(false, actionTarget, typeMaskActor, hitMask, attType);
|
||||
|
||||
if (typeMaskActionTarget && actionTarget)
|
||||
if (typeMaskActionTarget && actionTarget && !(spellInfo && spellInfo->HasAttribute(SPELL_ATTR3_SUPPRESS_TARGET_PROCS)))
|
||||
actionTarget->ProcSkillsAndReactives(true, actor, typeMaskActionTarget, hitMask, attType);
|
||||
|
||||
if (actor)
|
||||
@@ -5940,8 +5951,9 @@ void Unit::SetCharm(Unit* charm, bool apply)
|
||||
{
|
||||
if (Player* player = unit->ToPlayer())
|
||||
{
|
||||
if (Battleground* bg = player->GetBattleground())
|
||||
bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
|
||||
if (!healInfo.GetSpellInfo() || !healInfo.GetSpellInfo()->HasAttribute(SPELL_ATTR7_DO_NOT_COUNT_FOR_PVP_SCOREBOARD))
|
||||
if (Battleground* bg = player->GetBattleground())
|
||||
bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
|
||||
|
||||
// use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
|
||||
if (gain)
|
||||
@@ -12087,10 +12099,10 @@ bool Unit::CanApplyResilience() const
|
||||
*damage -= target->GetDamageReduction(*damage);
|
||||
}
|
||||
|
||||
int32 Unit::CalculateAOEAvoidance(int32 damage, uint32 schoolMask, ObjectGuid const& casterGuid) const
|
||||
int32 Unit::CalculateAOEAvoidance(int32 damage, uint32 schoolMask, bool npcCaster) const
|
||||
{
|
||||
damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
|
||||
if (casterGuid.IsAnyTypeCreature())
|
||||
if (npcCaster)
|
||||
damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE, schoolMask));
|
||||
|
||||
return damage;
|
||||
@@ -12100,7 +12112,7 @@ int32 Unit::CalculateAOEAvoidance(int32 damage, uint32 schoolMask, ObjectGuid co
|
||||
// Crit or block - determined on damage calculation phase! (and can be both in some time)
|
||||
float Unit::MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, SpellInfo const* spellInfo /*= nullptr*/) const
|
||||
{
|
||||
if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_CANT_MISS))
|
||||
if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
|
||||
return 0.f;
|
||||
|
||||
// Calculate miss chance
|
||||
|
||||
Reference in new issue
Block a user