diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-04-30 16:57:32 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-04-30 16:57:32 +0200 |
commit | 88d7b58a3dd8b0eb95c233a20c1608ddce73d9ea (patch) | |
tree | db38ff659b4105a3b60888bbb67339921d6ae2a0 /src | |
parent | b409a37c800b9d572048ee409f1bb138e97b8d8c (diff) |
Core/Spells: Rename SpellAttr3 to use official attribute names
* Implemented SPELL_ATTR3_NO_AVOIDANCE
* Implemented SPELL_ATTR3_ONLY_PROC_OUTDOORS
* Implemented SPELL_ATTR3_ONLY_PROC_ON_CASTER
* Implemented SPELL_ATTR3_PVP_ENABLING
* Implemented SPELL_ATTR3_SUPPRESS_CASTER_PROCS
* Implemented SPELL_ATTR3_SUPPRESS_TARGET_PROCS
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/CoreAI/UnitAI.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Combat/ThreatManager.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 30 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 2 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 68 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp | 166 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 53 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 46 |
11 files changed, 203 insertions, 211 deletions
diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 416804aaf64..f9f44c15cfb 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -129,7 +129,7 @@ SpellCastResult UnitAI::DoCast(uint32 spellId) { if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, me->GetMap()->GetDifficultyID())) { - bool playerOnly = spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS); + bool playerOnly = spellInfo->HasAttribute(SPELL_ATTR3_ONLY_ON_PLAYER); target = SelectTarget(SelectTargetMethod::Random, 0, spellInfo->GetMaxRange(false), playerOnly); } break; @@ -144,7 +144,7 @@ SpellCastResult UnitAI::DoCast(uint32 spellId) { if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, me->GetMap()->GetDifficultyID())) { - bool playerOnly = spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS); + bool playerOnly = spellInfo->HasAttribute(SPELL_ATTR3_ONLY_ON_PLAYER); float range = spellInfo->GetMaxRange(false); DefaultTargetSelector targetSelector(me, range, playerOnly, true, -(int32)spellId); diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 85baee76892..2e0c0f7eba3 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -302,7 +302,7 @@ void ThreatManager::AddThreat(Unit* target, float amount, SpellInfo const* spell { if (spell->HasAttribute(SPELL_ATTR1_NO_THREAT)) return; - if (!_owner->IsEngaged() && spell->HasAttribute(SPELL_ATTR3_NO_INITIAL_AGGRO)) + if (!_owner->IsEngaged() && spell->HasAttribute(SPELL_ATTR2_NO_INITIAL_THREAT)) return; } diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 9cad8331c2d..362e9a7bebe 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2361,7 +2361,7 @@ void WorldObject::ModSpellCastTime(SpellInfo const* spellInfo, int32& castTime, if (!unitCaster) return; - if (!(spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) || spellInfo->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS)) && + if (!(spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) || spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS)) && ((GetTypeId() == TYPEID_PLAYER && spellInfo->SpellFamilyName) || GetTypeId() == TYPEID_UNIT)) castTime = unitCaster->CanInstantCast() ? 0 : int32(float(castTime) * unitCaster->m_unitData->ModCastingSpeed); else if (spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT) && !spellInfo->HasAttribute(SPELL_ATTR2_AUTO_REPEAT)) @@ -2386,7 +2386,7 @@ void WorldObject::ModSpellDurationTime(SpellInfo const* spellInfo, int32& durati if (!unitCaster) return; - if (!(spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) || spellInfo->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS)) && + if (!(spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) || spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS)) && ((GetTypeId() == TYPEID_PLAYER && spellInfo->SpellFamilyName) || GetTypeId() == TYPEID_UNIT)) duration = int32(float(duration) * unitCaster->m_unitData->ModCastingSpeed); else if (spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT) && !spellInfo->HasAttribute(SPELL_ATTR2_AUTO_REPEAT)) @@ -2409,6 +2409,9 @@ SpellMissInfo WorldObject::MagicSpellHitResult(Unit* victim, SpellInfo const* sp if (!victim->IsAlive() && victim->GetTypeId() != TYPEID_PLAYER) return SPELL_MISS_NONE; + if (spellInfo->HasAttribute(SPELL_ATTR3_NO_AVOIDANCE)) + return SPELL_MISS_NONE; + float missChance = [&]() { if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS)) @@ -2448,7 +2451,7 @@ SpellMissInfo WorldObject::MagicSpellHitResult(Unit* victim, SpellInfo const* sp modOwner->ApplySpellMod(spellInfo, SpellModOp::HitChance, modHitChance); // Spells with SPELL_ATTR3_IGNORE_HIT_RESULT will ignore target's avoidance effects - if (!spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT)) + if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT)) { // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras modHitChance += victim->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, schoolMask); @@ -2529,7 +2532,7 @@ SpellMissInfo WorldObject::SpellHitResult(Unit* victim, SpellInfo const* spellIn return SPELL_MISS_REFLECT; } - if (spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT)) + if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT)) return SPELL_MISS_NONE; switch (spellInfo->DmgClass) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 65e78d8cff9..7aca0596c47 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1100,7 +1100,7 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL) { // Spells with this attribute were already calculated in MeleeSpellHitResult - if (!spellInfo->HasAttribute(SPELL_ATTR3_BLOCKABLE_SPELL)) + if (!spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED)) { // Get blocked status blocked = isSpellBlocked(victim, spellInfo, attackType); @@ -2317,7 +2317,7 @@ void Unit::SendMeleeAttackStop(Unit* victim) bool Unit::isSpellBlocked(Unit* victim, SpellInfo const* spellProto, WeaponAttackType attackType) { // These spells can't be blocked - if (spellProto && (spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE) || spellProto->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT))) + if (spellProto && (spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE) || spellProto->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))) return false; // Can't block when casting/controlled @@ -2382,6 +2382,9 @@ bool Unit::CanUseAttackType(uint8 attacktype) const // Melee based spells hit result calculations SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo) const { + if (spellInfo->HasAttribute(SPELL_ATTR3_NO_AVOIDANCE)) + return SPELL_MISS_NONE; + WeaponAttackType attType = BASE_ATTACK; // Check damage class instead of attack type to correctly handle judgements @@ -2410,7 +2413,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE); bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY); - bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_BLOCKABLE_SPELL); + bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED); // if victim is casting or cc'd it can't avoid attacks if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED)) @@ -4150,7 +4153,7 @@ void Unit::RemoveArenaAuras() Aura const* aura = aurApp->GetBase(); return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_DONT_REMOVE_IN_ARENA) // don't remove stances, shadowform, pally/hunter auras && !aura->IsPassive() // don't remove passive auras - && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_DEATH_PERSISTENT))) || // not negative death persistent auras + && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove }); } @@ -6449,7 +6452,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin return pdamage; // Some spells don't benefit from done mods - if (spellProto->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS)) + if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS)) return pdamage; // For totems get damage bonus from owner @@ -6486,7 +6489,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin if ((spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE)) return RANGED_ATTACK; - if (spellProto->HasAttribute(SPELL_ATTR3_REQ_OFFHAND) && !spellProto->HasAttribute(SPELL_ATTR3_MAIN_HAND)) + if (spellProto->HasAttribute(SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON) && !spellProto->HasAttribute(SPELL_ATTR3_REQUIRES_MAIN_HAND_WEAPON)) return OFF_ATTACK; return BASE_ATTACK; @@ -6531,7 +6534,7 @@ float Unit::SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, Damage return 1.0f; // Some spells don't benefit from done mods - if (spellProto->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS)) + if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS)) return 1.0f; // Some spells don't benefit from pct done mods @@ -7027,7 +7030,7 @@ float Unit::SpellHealingPctDone(Unit* victim, SpellInfo const* spellProto) const return owner->SpellHealingPctDone(victim, spellProto); // Some spells don't benefit from done mods - if (spellProto->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS)) + if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS)) return 1.0f; // Some spells don't benefit from done mods @@ -7185,7 +7188,7 @@ bool Unit::IsImmunedToDamage(SpellInfo const* spellInfo) const return false; // for example 40175 - if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT)) + if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT)) return false; if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) @@ -7333,7 +7336,7 @@ bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, SpellEffectInfo co if (AuraType aura = spellEffectInfo.ApplyAuraName) { - if (!spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT)) + if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT)) { SpellImmuneContainer const& list = m_spellImmune[IMMUNITY_STATE]; if (list.count(aura) > 0) @@ -9916,14 +9919,7 @@ void Unit::TriggerAurasProcOnEvent(ProcEventInfo& eventInfo, AuraApplicationProc if (aurApp->GetRemoveMode()) continue; - SpellInfo const* spellInfo = aurApp->GetBase()->GetSpellInfo(); - if (spellInfo->HasAttribute(SPELL_ATTR3_DISABLE_PROC)) - SetCantProc(true); - aurApp->GetBase()->TriggerProcOnEvent(procEffectMask, aurApp, eventInfo); - - if (spellInfo->HasAttribute(SPELL_ATTR3_DISABLE_PROC)) - SetCantProc(false); } if (disableProcs) diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 114270bc492..90b1089c3e8 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1159,7 +1159,7 @@ namespace Trinity if (u->GetTypeId() == TYPEID_UNIT && u->IsTotem()) return false; - if (_spellInfo && _spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS) && u->GetTypeId() != TYPEID_PLAYER) + if (_spellInfo && _spellInfo->HasAttribute(SPELL_ATTR3_ONLY_ON_PLAYER) && u->GetTypeId() != TYPEID_PLAYER) return false; if (!i_funit->IsValidAttackTarget(u, _spellInfo)) diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index be7758a0700..d42987d37c4 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -404,7 +404,7 @@ uint32 constexpr QuestDifficultyColors[MAX_QUEST_DIFFICULTY] = // EnumUtils: DESCRIBE THIS enum SpellAttr0 : uint32 { - SPELL_ATTR0_PROC_FAILURE_BURNS_CHARGE = 0x00000001, /*NYI, proc failure includes missed roll*/ // TITLE Proc Failure Burns Charge + SPELL_ATTR0_PROC_FAILURE_BURNS_CHARGE = 0x00000001, // TITLE Proc Failure Burns Charge SPELL_ATTR0_USES_RANGED_SLOT = 0x00000002, // TITLE Uses Ranged Slot DESCRIPTION Use ammo, ranged attack range modifiers, ranged haste, etc. SPELL_ATTR0_ON_NEXT_SWING_NO_DAMAGE = 0x00000004, // TITLE On Next Swing (No Damage) DESCRIPTION Both "on next swing" attributes have identical handling in server & client SPELL_ATTR0_DO_NOT_LOG_IMMUNE_MISSES = 0x00000008, // TITLE Do Not Log Immune Misses (client only) @@ -451,7 +451,7 @@ enum SpellAttr1 : uint32 SPELL_ATTR1_NO_REFLECTION = 0x00000080, // TITLE No Reflection DESCRIPTION Spell will pierce through Spell Reflection and similar SPELL_ATTR1_ONLY_PEACEFUL_TARGETS = 0x00000100, // TITLE Only Peaceful Targets DESCRIPTION Target cannot be in combat SPELL_ATTR1_INITIATES_COMBAT_ENABLES_AUTO_ATTACK = 0x00000200, // TITLE Initiates Combat (Enables Auto-Attack) (client only) DESCRIPTION Caster will begin auto-attacking the target on cast - SPELL_ATTR1_NO_THREAT = 0x00000400, // TITLE Does not generate threat DESCRIPTION Also does not cause target to engage + SPELL_ATTR1_NO_THREAT = 0x00000400, // TITLE No Threat DESCRIPTION Also does not cause target to engage SPELL_ATTR1_AURA_UNIQUE = 0x00000800, // TITLE Aura Unique DESCRIPTION Aura will not refresh its duration when recast SPELL_ATTR1_FAILURE_BREAKS_STEALTH = 0x00001000, // TITLE Failure Breaks Stealth SPELL_ATTR1_TOGGLE_FAR_SIGHT = 0x00002000, // TITLE Toggle Far Sight (client only) @@ -515,38 +515,38 @@ enum SpellAttr2 : uint32 // EnumUtils: DESCRIBE THIS enum SpellAttr3 : uint32 { - SPELL_ATTR3_UNK0 = 0x00000001, // TITLE Unknown attribute 0@Attr3 - SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT = 0x00000002, // TITLE No Proc Equip Requirement DESCRIPTION Ignores subclass mask check when checking proc - SPELL_ATTR3_UNK2 = 0x00000004, // TITLE Unknown attribute 2@Attr3 - SPELL_ATTR3_BLOCKABLE_SPELL = 0x00000008, // TITLE Blockable spell - SPELL_ATTR3_IGNORE_RESURRECTION_TIMER = 0x00000010, // TITLE Ignore resurrection timer - SPELL_ATTR3_NO_DURABILITY_LOSS = 0x00000020, // TITLE No Durability Loss - SPELL_ATTR3_UNK6 = 0x00000040, // TITLE Unknown attribute 6@Attr3 - SPELL_ATTR3_STACK_FOR_DIFF_CASTERS = 0x00000080, // TITLE Stack separately for each caster - SPELL_ATTR3_ONLY_TARGET_PLAYERS = 0x00000100, // TITLE Can only target players - SPELL_ATTR3_NOT_A_PROC = 0x00000200, // TITLE Not a Proc DESCRIPTION Without this attribute, any triggered spell will be unable to trigger other auras' procs - SPELL_ATTR3_MAIN_HAND = 0x00000400, // TITLE Require main hand weapon - SPELL_ATTR3_BATTLEGROUND = 0x00000800, // TITLE Can only be cast in battleground - SPELL_ATTR3_ONLY_TARGET_GHOSTS = 0x00001000, // TITLE Can only target ghost players - SPELL_ATTR3_DONT_DISPLAY_CHANNEL_BAR = 0x00002000, // TITLE Do not display channel bar (client only) - SPELL_ATTR3_IS_HONORLESS_TARGET = 0x00004000, // TITLE Honorless Target - SPELL_ATTR3_UNK15 = 0x00008000, // TITLE Unknown attribute 15@Attr3 DESCRIPTION Auto Shoot, Shoot, Throw - ranged normal attack attribute? - SPELL_ATTR3_CANT_TRIGGER_PROC = 0x00010000, // TITLE Cannot trigger procs - SPELL_ATTR3_NO_INITIAL_AGGRO = 0x00020000, // TITLE No initial aggro - SPELL_ATTR3_IGNORE_HIT_RESULT = 0x00040000, // TITLE Ignore hit result DESCRIPTION Spell cannot miss, or be dodged/parried/blocked - SPELL_ATTR3_DISABLE_PROC = 0x00080000, // TITLE Cannot trigger spells during aura proc - SPELL_ATTR3_DEATH_PERSISTENT = 0x00100000, // TITLE Persists through death - SPELL_ATTR3_UNK21 = 0x00200000, // TITLE Unknown attribute 21@Attr3 - SPELL_ATTR3_REQ_WAND = 0x00400000, // TITLE Requires equipped Wand - SPELL_ATTR3_UNK23 = 0x00800000, // TITLE Unknown attribute 23@Attr3 - SPELL_ATTR3_REQ_OFFHAND = 0x01000000, // TITLE Requires offhand weapon - SPELL_ATTR3_TREAT_AS_PERIODIC = 0x02000000, // TITLE Treat as periodic effect - SPELL_ATTR3_CAN_PROC_FROM_PROCS = 0x04000000, // TITLE Can Proc From Procs - SPELL_ATTR3_DRAIN_SOUL = 0x08000000, // TITLE Drain Soul - SPELL_ATTR3_UNK28 = 0x10000000, // TITLE Unknown attribute 28@Attr3 - SPELL_ATTR3_NO_DONE_BONUS = 0x20000000, // TITLE Damage dealt is unaffected by modifiers - SPELL_ATTR3_DONT_DISPLAY_RANGE = 0x40000000, // TITLE Do not show range in tooltip (client only) - SPELL_ATTR3_UNK31 = 0x80000000 // TITLE Unknown attribute 31@Attr3 + SPELL_ATTR3_PVP_ENABLING = 0x00000001, // TITLE PvP Enabling + SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT = 0x00000002, // TITLE No Proc Equip Requirement DESCRIPTION Ignores subclass mask check when checking proc + SPELL_ATTR3_NO_CASTING_BAR_TEXT = 0x00000004, // TITLE No Casting Bar Text + SPELL_ATTR3_COMPLETELY_BLOCKED = 0x00000008, // TITLE Completely Blocked + SPELL_ATTR3_NO_RES_TIMER = 0x00000010, // TITLE No Res Timer + SPELL_ATTR3_NO_DURABILITY_LOSS = 0x00000020, // TITLE No Durability Loss + SPELL_ATTR3_NO_AVOIDANCE = 0x00000040, // TITLE No Avoidance + SPELL_ATTR3_DOT_STACKING_RULE = 0x00000080, // TITLE DoT Stacking Rule DESCRIPTION Stack separately for each caster + SPELL_ATTR3_ONLY_ON_PLAYER = 0x00000100, // TITLE Only On Player + SPELL_ATTR3_NOT_A_PROC = 0x00000200, // TITLE Not a Proc DESCRIPTION Without this attribute, any triggered spell will be unable to trigger other auras' procs + SPELL_ATTR3_REQUIRES_MAIN_HAND_WEAPON = 0x00000400, // TITLE Requires Main-Hand Weapon + SPELL_ATTR3_ONLY_BATTLEGROUNDS = 0x00000800, // TITLE Only Battlegrounds + SPELL_ATTR3_ONLY_ON_GHOSTS = 0x00001000, // TITLE Only On Ghosts + SPELL_ATTR3_HIDE_CHANNEL_BAR = 0x00002000, // TITLE Hide Channel Bar (client only) + SPELL_ATTR3_HIDE_IN_RAID_FILTER = 0x00004000, // TITLE Hide In Raid Filter (client only) + SPELL_ATTR3_NORMAL_RANGED_ATTACK = 0x00008000, // TITLE Normal Ranged Attack DESCRIPTION Auto Shoot, Shoot, Throw - ranged normal attack attribute? + SPELL_ATTR3_SUPPRESS_CASTER_PROCS = 0x00010000, // TITLE Suppress Caster Procs + SPELL_ATTR3_SUPPRESS_TARGET_PROCS = 0x00020000, // TITLE Suppress Target Procs + SPELL_ATTR3_ALWAYS_HIT = 0x00040000, // TITLE Always Hit DESCRIPTION Spell cannot miss, or be dodged/parried/blocked + SPELL_ATTR3_INSTANT_TARGET_PROCS = 0x00080000, // TITLE Instant Target Procs DESCRIPTION Proc events are triggered before spell batching processes the spell hit on target + SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD = 0x00100000, // TITLE Allow Aura While Dead + SPELL_ATTR3_ONLY_PROC_OUTDOORS = 0x00200000, // TITLE Only Proc Outdoors + SPELL_ATTR3_DO_NOT_TRIGGER_TARGET_STAND = 0x00400000, // TITLE Do Not Trigger Target Stand + SPELL_ATTR3_NO_DAMAGE_HISTORY = 0x00800000, /*NYI, no damage history implementation*/ // TITLE No Damage History + SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON = 0x01000000, // TITLE Requires Off-Hand Weapon + SPELL_ATTR3_TREAT_AS_PERIODIC = 0x02000000, // TITLE Treat As Periodic + SPELL_ATTR3_CAN_PROC_FROM_PROCS = 0x04000000, // TITLE Can Proc From Procs + SPELL_ATTR3_ONLY_PROC_ON_CASTER = 0x08000000, // TITLE Only Proc on Caster + SPELL_ATTR3_IGNORE_CASTER_AND_TARGET_RESTRICTIONS = 0x10000000, /*NYI*/ // TITLE Ignore Caster & Target Restrictions + SPELL_ATTR3_IGNORE_CASTER_MODIFIERS = 0x20000000, // TITLE Ignore Caster Modifiers + SPELL_ATTR3_DO_NOT_DISPLAY_RANGE = 0x40000000, // TITLE Do Not Display Range (client only) + SPELL_ATTR3_NOT_ON_AOE_IMMUNE = 0x80000000 /*NYI, no aoe immunity implementation*/ // TITLE Not On AOE Immune }; // EnumUtils: DESCRIBE THIS diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp index 1455c012bee..d10ba44c58d 100644 --- a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp +++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp @@ -386,7 +386,7 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr1>::ToString(SpellAttr1 value) case SPELL_ATTR1_NO_REFLECTION: return { "SPELL_ATTR1_NO_REFLECTION", "No Reflection", "Spell will pierce through Spell Reflection and similar" }; case SPELL_ATTR1_ONLY_PEACEFUL_TARGETS: return { "SPELL_ATTR1_ONLY_PEACEFUL_TARGETS", "Only Peaceful Targets", "Target cannot be in combat" }; case SPELL_ATTR1_INITIATES_COMBAT_ENABLES_AUTO_ATTACK: return { "SPELL_ATTR1_INITIATES_COMBAT_ENABLES_AUTO_ATTACK", "Initiates Combat (Enables Auto-Attack) (client only)", "Caster will begin auto-attacking the target on cast" }; - case SPELL_ATTR1_NO_THREAT: return { "SPELL_ATTR1_NO_THREAT", "Does not generate threat", "Also does not cause target to engage" }; + case SPELL_ATTR1_NO_THREAT: return { "SPELL_ATTR1_NO_THREAT", "No Threat", "Also does not cause target to engage" }; case SPELL_ATTR1_AURA_UNIQUE: return { "SPELL_ATTR1_AURA_UNIQUE", "Aura Unique", "Aura will not refresh its duration when recast" }; case SPELL_ATTR1_FAILURE_BREAKS_STEALTH: return { "SPELL_ATTR1_FAILURE_BREAKS_STEALTH", "Failure Breaks Stealth", "" }; case SPELL_ATTR1_TOGGLE_FAR_SIGHT: return { "SPELL_ATTR1_TOGGLE_FAR_SIGHT", "Toggle Far Sight (client only)", "" }; @@ -634,38 +634,38 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr3>::ToString(SpellAttr3 value) { switch (value) { - case SPELL_ATTR3_UNK0: return { "SPELL_ATTR3_UNK0", "Unknown attribute 0@Attr3", "" }; + case SPELL_ATTR3_PVP_ENABLING: return { "SPELL_ATTR3_PVP_ENABLING", "PvP Enabling", "" }; case SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT: return { "SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT", "No Proc Equip Requirement", "Ignores subclass mask check when checking proc" }; - case SPELL_ATTR3_UNK2: return { "SPELL_ATTR3_UNK2", "Unknown attribute 2@Attr3", "" }; - case SPELL_ATTR3_BLOCKABLE_SPELL: return { "SPELL_ATTR3_BLOCKABLE_SPELL", "Blockable spell", "" }; - case SPELL_ATTR3_IGNORE_RESURRECTION_TIMER: return { "SPELL_ATTR3_IGNORE_RESURRECTION_TIMER", "Ignore resurrection timer", "" }; + case SPELL_ATTR3_NO_CASTING_BAR_TEXT: return { "SPELL_ATTR3_NO_CASTING_BAR_TEXT", "No Casting Bar Text", "" }; + case SPELL_ATTR3_COMPLETELY_BLOCKED: return { "SPELL_ATTR3_COMPLETELY_BLOCKED", "Completely Blocked", "" }; + case SPELL_ATTR3_NO_RES_TIMER: return { "SPELL_ATTR3_NO_RES_TIMER", "No Res Timer", "" }; case SPELL_ATTR3_NO_DURABILITY_LOSS: return { "SPELL_ATTR3_NO_DURABILITY_LOSS", "No Durability Loss", "" }; - case SPELL_ATTR3_UNK6: return { "SPELL_ATTR3_UNK6", "Unknown attribute 6@Attr3", "" }; - case SPELL_ATTR3_STACK_FOR_DIFF_CASTERS: return { "SPELL_ATTR3_STACK_FOR_DIFF_CASTERS", "Stack separately for each caster", "" }; - case SPELL_ATTR3_ONLY_TARGET_PLAYERS: return { "SPELL_ATTR3_ONLY_TARGET_PLAYERS", "Can only target players", "" }; + case SPELL_ATTR3_NO_AVOIDANCE: return { "SPELL_ATTR3_NO_AVOIDANCE", "No Avoidance", "" }; + case SPELL_ATTR3_DOT_STACKING_RULE: return { "SPELL_ATTR3_DOT_STACKING_RULE", "DoT Stacking Rule", "Stack separately for each caster" }; + case SPELL_ATTR3_ONLY_ON_PLAYER: return { "SPELL_ATTR3_ONLY_ON_PLAYER", "Only On Player", "" }; case SPELL_ATTR3_NOT_A_PROC: return { "SPELL_ATTR3_NOT_A_PROC", "Not a Proc", "Without this attribute, any triggered spell will be unable to trigger other auras' procs" }; - case SPELL_ATTR3_MAIN_HAND: return { "SPELL_ATTR3_MAIN_HAND", "Require main hand weapon", "" }; - case SPELL_ATTR3_BATTLEGROUND: return { "SPELL_ATTR3_BATTLEGROUND", "Can only be cast in battleground", "" }; - case SPELL_ATTR3_ONLY_TARGET_GHOSTS: return { "SPELL_ATTR3_ONLY_TARGET_GHOSTS", "Can only target ghost players", "" }; - case SPELL_ATTR3_DONT_DISPLAY_CHANNEL_BAR: return { "SPELL_ATTR3_DONT_DISPLAY_CHANNEL_BAR", "Do not display channel bar (client only)", "" }; - case SPELL_ATTR3_IS_HONORLESS_TARGET: return { "SPELL_ATTR3_IS_HONORLESS_TARGET", "Honorless Target", "" }; - case SPELL_ATTR3_UNK15: return { "SPELL_ATTR3_UNK15", "Unknown attribute 15@Attr3", "Auto Shoot, Shoot, Throw - ranged normal attack attribute?" }; - case SPELL_ATTR3_CANT_TRIGGER_PROC: return { "SPELL_ATTR3_CANT_TRIGGER_PROC", "Cannot trigger procs", "" }; - case SPELL_ATTR3_NO_INITIAL_AGGRO: return { "SPELL_ATTR3_NO_INITIAL_AGGRO", "No initial aggro", "" }; - case SPELL_ATTR3_IGNORE_HIT_RESULT: return { "SPELL_ATTR3_IGNORE_HIT_RESULT", "Ignore hit result", "Spell cannot miss, or be dodged/parried/blocked" }; - case SPELL_ATTR3_DISABLE_PROC: return { "SPELL_ATTR3_DISABLE_PROC", "Cannot trigger spells during aura proc", "" }; - case SPELL_ATTR3_DEATH_PERSISTENT: return { "SPELL_ATTR3_DEATH_PERSISTENT", "Persists through death", "" }; - case SPELL_ATTR3_UNK21: return { "SPELL_ATTR3_UNK21", "Unknown attribute 21@Attr3", "" }; - case SPELL_ATTR3_REQ_WAND: return { "SPELL_ATTR3_REQ_WAND", "Requires equipped Wand", "" }; - case SPELL_ATTR3_UNK23: return { "SPELL_ATTR3_UNK23", "Unknown attribute 23@Attr3", "" }; - case SPELL_ATTR3_REQ_OFFHAND: return { "SPELL_ATTR3_REQ_OFFHAND", "Requires offhand weapon", "" }; - case SPELL_ATTR3_TREAT_AS_PERIODIC: return { "SPELL_ATTR3_TREAT_AS_PERIODIC", "Treat as periodic effect", "" }; + case SPELL_ATTR3_REQUIRES_MAIN_HAND_WEAPON: return { "SPELL_ATTR3_REQUIRES_MAIN_HAND_WEAPON", "Requires Main-Hand Weapon", "" }; + case SPELL_ATTR3_ONLY_BATTLEGROUNDS: return { "SPELL_ATTR3_ONLY_BATTLEGROUNDS", "Only Battlegrounds", "" }; + case SPELL_ATTR3_ONLY_ON_GHOSTS: return { "SPELL_ATTR3_ONLY_ON_GHOSTS", "Only On Ghosts", "" }; + case SPELL_ATTR3_HIDE_CHANNEL_BAR: return { "SPELL_ATTR3_HIDE_CHANNEL_BAR", "Hide Channel Bar (client only)", "" }; + case SPELL_ATTR3_HIDE_IN_RAID_FILTER: return { "SPELL_ATTR3_HIDE_IN_RAID_FILTER", "Hide In Raid Filter (client only)", "" }; + case SPELL_ATTR3_NORMAL_RANGED_ATTACK: return { "SPELL_ATTR3_NORMAL_RANGED_ATTACK", "Normal Ranged Attack", "Auto Shoot, Shoot, Throw - ranged normal attack attribute?" }; + case SPELL_ATTR3_SUPPRESS_CASTER_PROCS: return { "SPELL_ATTR3_SUPPRESS_CASTER_PROCS", "Suppress Caster Procs", "" }; + case SPELL_ATTR3_SUPPRESS_TARGET_PROCS: return { "SPELL_ATTR3_SUPPRESS_TARGET_PROCS", "Suppress Target Procs", "" }; + case SPELL_ATTR3_ALWAYS_HIT: return { "SPELL_ATTR3_ALWAYS_HIT", "Always Hit", "Spell cannot miss, or be dodged/parried/blocked" }; + case SPELL_ATTR3_INSTANT_TARGET_PROCS: return { "SPELL_ATTR3_INSTANT_TARGET_PROCS", "Instant Target Procs", "Proc events are triggered before spell batching processes the spell hit on target" }; + case SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD: return { "SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD", "Allow Aura While Dead", "" }; + case SPELL_ATTR3_ONLY_PROC_OUTDOORS: return { "SPELL_ATTR3_ONLY_PROC_OUTDOORS", "Only Proc Outdoors", "" }; + case SPELL_ATTR3_DO_NOT_TRIGGER_TARGET_STAND: return { "SPELL_ATTR3_DO_NOT_TRIGGER_TARGET_STAND", "Do Not Trigger Target Stand", "" }; + case SPELL_ATTR3_NO_DAMAGE_HISTORY: return { "SPELL_ATTR3_NO_DAMAGE_HISTORY", "No Damage History", "" }; + case SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON: return { "SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON", "Requires Off-Hand Weapon", "" }; + case SPELL_ATTR3_TREAT_AS_PERIODIC: return { "SPELL_ATTR3_TREAT_AS_PERIODIC", "Treat As Periodic", "" }; case SPELL_ATTR3_CAN_PROC_FROM_PROCS: return { "SPELL_ATTR3_CAN_PROC_FROM_PROCS", "Can Proc From Procs", "" }; - case SPELL_ATTR3_DRAIN_SOUL: return { "SPELL_ATTR3_DRAIN_SOUL", "Drain Soul", "" }; - case SPELL_ATTR3_UNK28: return { "SPELL_ATTR3_UNK28", "Unknown attribute 28@Attr3", "" }; - case SPELL_ATTR3_NO_DONE_BONUS: return { "SPELL_ATTR3_NO_DONE_BONUS", "Damage dealt is unaffected by modifiers", "" }; - case SPELL_ATTR3_DONT_DISPLAY_RANGE: return { "SPELL_ATTR3_DONT_DISPLAY_RANGE", "Do not show range in tooltip (client only)", "" }; - case SPELL_ATTR3_UNK31: return { "SPELL_ATTR3_UNK31", "Unknown attribute 31@Attr3", "" }; + case SPELL_ATTR3_ONLY_PROC_ON_CASTER: return { "SPELL_ATTR3_ONLY_PROC_ON_CASTER", "Only Proc on Caster", "" }; + case SPELL_ATTR3_IGNORE_CASTER_AND_TARGET_RESTRICTIONS: return { "SPELL_ATTR3_IGNORE_CASTER_AND_TARGET_RESTRICTIONS", "Ignore Caster & Target Restrictions", "" }; + case SPELL_ATTR3_IGNORE_CASTER_MODIFIERS: return { "SPELL_ATTR3_IGNORE_CASTER_MODIFIERS", "Ignore Caster Modifiers", "" }; + case SPELL_ATTR3_DO_NOT_DISPLAY_RANGE: return { "SPELL_ATTR3_DO_NOT_DISPLAY_RANGE", "Do Not Display Range (client only)", "" }; + case SPELL_ATTR3_NOT_ON_AOE_IMMUNE: return { "SPELL_ATTR3_NOT_ON_AOE_IMMUNE", "Not On AOE Immune", "" }; default: throw std::out_of_range("value"); } } @@ -678,38 +678,38 @@ TC_API_EXPORT SpellAttr3 EnumUtils<SpellAttr3>::FromIndex(size_t index) { switch (index) { - case 0: return SPELL_ATTR3_UNK0; + case 0: return SPELL_ATTR3_PVP_ENABLING; case 1: return SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT; - case 2: return SPELL_ATTR3_UNK2; - case 3: return SPELL_ATTR3_BLOCKABLE_SPELL; - case 4: return SPELL_ATTR3_IGNORE_RESURRECTION_TIMER; + case 2: return SPELL_ATTR3_NO_CASTING_BAR_TEXT; + case 3: return SPELL_ATTR3_COMPLETELY_BLOCKED; + case 4: return SPELL_ATTR3_NO_RES_TIMER; case 5: return SPELL_ATTR3_NO_DURABILITY_LOSS; - case 6: return SPELL_ATTR3_UNK6; - case 7: return SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; - case 8: return SPELL_ATTR3_ONLY_TARGET_PLAYERS; + case 6: return SPELL_ATTR3_NO_AVOIDANCE; + case 7: return SPELL_ATTR3_DOT_STACKING_RULE; + case 8: return SPELL_ATTR3_ONLY_ON_PLAYER; case 9: return SPELL_ATTR3_NOT_A_PROC; - case 10: return SPELL_ATTR3_MAIN_HAND; - case 11: return SPELL_ATTR3_BATTLEGROUND; - case 12: return SPELL_ATTR3_ONLY_TARGET_GHOSTS; - case 13: return SPELL_ATTR3_DONT_DISPLAY_CHANNEL_BAR; - case 14: return SPELL_ATTR3_IS_HONORLESS_TARGET; - case 15: return SPELL_ATTR3_UNK15; - case 16: return SPELL_ATTR3_CANT_TRIGGER_PROC; - case 17: return SPELL_ATTR3_NO_INITIAL_AGGRO; - case 18: return SPELL_ATTR3_IGNORE_HIT_RESULT; - case 19: return SPELL_ATTR3_DISABLE_PROC; - case 20: return SPELL_ATTR3_DEATH_PERSISTENT; - case 21: return SPELL_ATTR3_UNK21; - case 22: return SPELL_ATTR3_REQ_WAND; - case 23: return SPELL_ATTR3_UNK23; - case 24: return SPELL_ATTR3_REQ_OFFHAND; + case 10: return SPELL_ATTR3_REQUIRES_MAIN_HAND_WEAPON; + case 11: return SPELL_ATTR3_ONLY_BATTLEGROUNDS; + case 12: return SPELL_ATTR3_ONLY_ON_GHOSTS; + case 13: return SPELL_ATTR3_HIDE_CHANNEL_BAR; + case 14: return SPELL_ATTR3_HIDE_IN_RAID_FILTER; + case 15: return SPELL_ATTR3_NORMAL_RANGED_ATTACK; + case 16: return SPELL_ATTR3_SUPPRESS_CASTER_PROCS; + case 17: return SPELL_ATTR3_SUPPRESS_TARGET_PROCS; + case 18: return SPELL_ATTR3_ALWAYS_HIT; + case 19: return SPELL_ATTR3_INSTANT_TARGET_PROCS; + case 20: return SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD; + case 21: return SPELL_ATTR3_ONLY_PROC_OUTDOORS; + case 22: return SPELL_ATTR3_DO_NOT_TRIGGER_TARGET_STAND; + case 23: return SPELL_ATTR3_NO_DAMAGE_HISTORY; + case 24: return SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON; case 25: return SPELL_ATTR3_TREAT_AS_PERIODIC; case 26: return SPELL_ATTR3_CAN_PROC_FROM_PROCS; - case 27: return SPELL_ATTR3_DRAIN_SOUL; - case 28: return SPELL_ATTR3_UNK28; - case 29: return SPELL_ATTR3_NO_DONE_BONUS; - case 30: return SPELL_ATTR3_DONT_DISPLAY_RANGE; - case 31: return SPELL_ATTR3_UNK31; + case 27: return SPELL_ATTR3_ONLY_PROC_ON_CASTER; + case 28: return SPELL_ATTR3_IGNORE_CASTER_AND_TARGET_RESTRICTIONS; + case 29: return SPELL_ATTR3_IGNORE_CASTER_MODIFIERS; + case 30: return SPELL_ATTR3_DO_NOT_DISPLAY_RANGE; + case 31: return SPELL_ATTR3_NOT_ON_AOE_IMMUNE; default: throw std::out_of_range("index"); } } @@ -719,38 +719,38 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr3>::ToIndex(SpellAttr3 value) { switch (value) { - case SPELL_ATTR3_UNK0: return 0; + case SPELL_ATTR3_PVP_ENABLING: return 0; case SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT: return 1; - case SPELL_ATTR3_UNK2: return 2; - case SPELL_ATTR3_BLOCKABLE_SPELL: return 3; - case SPELL_ATTR3_IGNORE_RESURRECTION_TIMER: return 4; + case SPELL_ATTR3_NO_CASTING_BAR_TEXT: return 2; + case SPELL_ATTR3_COMPLETELY_BLOCKED: return 3; + case SPELL_ATTR3_NO_RES_TIMER: return 4; case SPELL_ATTR3_NO_DURABILITY_LOSS: return 5; - case SPELL_ATTR3_UNK6: return 6; - case SPELL_ATTR3_STACK_FOR_DIFF_CASTERS: return 7; - case SPELL_ATTR3_ONLY_TARGET_PLAYERS: return 8; + case SPELL_ATTR3_NO_AVOIDANCE: return 6; + case SPELL_ATTR3_DOT_STACKING_RULE: return 7; + case SPELL_ATTR3_ONLY_ON_PLAYER: return 8; case SPELL_ATTR3_NOT_A_PROC: return 9; - case SPELL_ATTR3_MAIN_HAND: return 10; - case SPELL_ATTR3_BATTLEGROUND: return 11; - case SPELL_ATTR3_ONLY_TARGET_GHOSTS: return 12; - case SPELL_ATTR3_DONT_DISPLAY_CHANNEL_BAR: return 13; - case SPELL_ATTR3_IS_HONORLESS_TARGET: return 14; - case SPELL_ATTR3_UNK15: return 15; - case SPELL_ATTR3_CANT_TRIGGER_PROC: return 16; - case SPELL_ATTR3_NO_INITIAL_AGGRO: return 17; - case SPELL_ATTR3_IGNORE_HIT_RESULT: return 18; - case SPELL_ATTR3_DISABLE_PROC: return 19; - case SPELL_ATTR3_DEATH_PERSISTENT: return 20; - case SPELL_ATTR3_UNK21: return 21; - case SPELL_ATTR3_REQ_WAND: return 22; - case SPELL_ATTR3_UNK23: return 23; - case SPELL_ATTR3_REQ_OFFHAND: return 24; + case SPELL_ATTR3_REQUIRES_MAIN_HAND_WEAPON: return 10; + case SPELL_ATTR3_ONLY_BATTLEGROUNDS: return 11; + case SPELL_ATTR3_ONLY_ON_GHOSTS: return 12; + case SPELL_ATTR3_HIDE_CHANNEL_BAR: return 13; + case SPELL_ATTR3_HIDE_IN_RAID_FILTER: return 14; + case SPELL_ATTR3_NORMAL_RANGED_ATTACK: return 15; + case SPELL_ATTR3_SUPPRESS_CASTER_PROCS: return 16; + case SPELL_ATTR3_SUPPRESS_TARGET_PROCS: return 17; + case SPELL_ATTR3_ALWAYS_HIT: return 18; + case SPELL_ATTR3_INSTANT_TARGET_PROCS: return 19; + case SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD: return 20; + case SPELL_ATTR3_ONLY_PROC_OUTDOORS: return 21; + case SPELL_ATTR3_DO_NOT_TRIGGER_TARGET_STAND: return 22; + case SPELL_ATTR3_NO_DAMAGE_HISTORY: return 23; + case SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON: return 24; case SPELL_ATTR3_TREAT_AS_PERIODIC: return 25; case SPELL_ATTR3_CAN_PROC_FROM_PROCS: return 26; - case SPELL_ATTR3_DRAIN_SOUL: return 27; - case SPELL_ATTR3_UNK28: return 28; - case SPELL_ATTR3_NO_DONE_BONUS: return 29; - case SPELL_ATTR3_DONT_DISPLAY_RANGE: return 30; - case SPELL_ATTR3_UNK31: return 31; + case SPELL_ATTR3_ONLY_PROC_ON_CASTER: return 27; + case SPELL_ATTR3_IGNORE_CASTER_AND_TARGET_RESTRICTIONS: return 28; + case SPELL_ATTR3_IGNORE_CASTER_MODIFIERS: return 29; + case SPELL_ATTR3_DO_NOT_DISPLAY_RANGE: return 30; + case SPELL_ATTR3_NOT_ON_AOE_IMMUNE: return 31; default: throw std::out_of_range("value"); } } diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 2e14479eb97..995a697fac1 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1632,7 +1632,7 @@ bool Aura::CanStackWith(Aura const* existingAura) const if (existingAura->GetSpellInfo()->IsChanneled()) return true; - if (m_spellInfo->HasAttribute(SPELL_ATTR3_STACK_FOR_DIFF_CASTERS)) + if (m_spellInfo->HasAttribute(SPELL_ATTR3_DOT_STACKING_RULE)) return true; // check same periodic auras @@ -1876,6 +1876,14 @@ uint32 Aura::GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo } } + if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_PROC_OUTDOORS)) + if (!target->IsOutdoors()) + return 0; + + if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_PROC_ON_CASTER)) + if (target->GetGUID() != GetCasterGUID()) + return 0; + bool success = roll_chance_f(CalcProcChance(*procEntry, eventInfo)); const_cast<Aura*>(this)->SetLastProcAttemptTime(now); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 80e1fb4e547..e11e5f2aadd 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -772,7 +772,7 @@ void Spell::SelectSpellTargets() if (noTargetFound) { - SendCastResult(m_spellInfo->Id == 51690 ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_BAD_TARGETS); + SendCastResult(SPELL_FAILED_BAD_IMPLICIT_TARGETS); finish(false); return; } @@ -1988,9 +1988,9 @@ uint32 Spell::GetSearcherTypeMask(SpellTargetObjectTypes objType, ConditionConta break; } - if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS)) + if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_ON_PLAYER)) retMask &= GRID_MAP_TYPE_MASK_CORPSE | GRID_MAP_TYPE_MASK_PLAYER; - if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_GHOSTS)) + if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_ON_GHOSTS)) retMask &= GRID_MAP_TYPE_MASK_PLAYER; if (condList) @@ -2522,13 +2522,12 @@ void Spell::TargetInfo::PreprocessTarget(Spell* spell) if ((MissCondition == SPELL_MISS_IMMUNE || MissCondition == SPELL_MISS_IMMUNE2) && spell->m_caster->GetTypeId() == TYPEID_PLAYER && unit->GetTypeId() == TYPEID_PLAYER && spell->m_caster->IsValidAttackTarget(unit, spell->GetSpellInfo())) unit->SetInCombatWith(spell->m_caster->ToPlayer()); - _enablePVP = false; // need to check PvP state before spell effects, but act on it afterwards + // if target is flagged for pvp also flag caster if a player + _enablePVP = (MissCondition == SPELL_MISS_NONE || spell->m_spellInfo->HasAttribute(SPELL_ATTR3_PVP_ENABLING)) + && unit->IsPvP() && spell->m_caster->GetTypeId() == TYPEID_PLAYER; // need to check PvP state before spell effects, but act on it afterwards + if (_spellHitTarget) { - // if target is flagged for pvp also flag caster if a player - if (unit->IsPvP() && spell->m_caster->GetTypeId() == TYPEID_PLAYER) - _enablePVP = true; // Decide on PvP flagging now, but act on it later. - SpellMissInfo missInfo = spell->PreprocessSpellHit(_spellHitTarget, *this); if (missInfo != SPELL_MISS_NONE) { @@ -2603,8 +2602,9 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) ProcFlagsHit hitMask = PROC_HIT_NONE; // Spells with this flag cannot trigger if effect is cast on self - bool const canEffectTrigger = !spell->m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_PROC) && spell->unitTarget->CanProc() && - (spell->CanExecuteTriggersOnHit(EffectMask) || MissCondition == SPELL_MISS_IMMUNE || MissCondition == SPELL_MISS_IMMUNE2); + bool const canEffectTrigger = (!spell->m_spellInfo->HasAttribute(SPELL_ATTR3_SUPPRESS_CASTER_PROCS) || !spell->m_spellInfo->HasAttribute(SPELL_ATTR3_SUPPRESS_TARGET_PROCS)) + && spell->unitTarget->CanProc() + && (spell->CanExecuteTriggersOnHit(EffectMask) || MissCondition == SPELL_MISS_IMMUNE || MissCondition == SPELL_MISS_IMMUNE2); // Trigger info was not filled in Spell::prepareDataForTriggerSystem - we do it now if (canEffectTrigger && !procAttacker && !procVictim) @@ -2767,6 +2767,12 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) // Do triggers for unit if (canEffectTrigger) { + if (spell->m_spellInfo->HasAttribute(SPELL_ATTR3_SUPPRESS_CASTER_PROCS)) + procAttacker = ProcFlagsInit(PROC_FLAG_NONE, PROC_FLAG_2_NONE); + + if (spell->m_spellInfo->HasAttribute(SPELL_ATTR3_SUPPRESS_TARGET_PROCS)) + procVictim = ProcFlagsInit(PROC_FLAG_NONE, PROC_FLAG_2_NONE); + Unit::ProcSkillsAndAuras(caster, spell->unitTarget, procAttacker, procVictim, procSpellType, PROC_SPELL_PHASE_HIT, hitMask, spell, spellDamageInfo.get(), healInfo.get()); // item spells (spell hit of non-damage spell may also activate items, for example seal of corruption hidden hit) @@ -2791,7 +2797,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) if (Unit* unitCaster = spell->m_caster->ToUnit()) unitCaster->AtTargetAttacked(unit, spell->m_spellInfo->HasInitialAggro()); - if (!unit->IsStandState()) + if (!spell->m_spellInfo->HasAttribute(SPELL_ATTR3_DO_NOT_TRIGGER_TARGET_STAND) && !unit->IsStandState()) unit->SetStandState(UNIT_STAND_STATE_STAND); } @@ -2829,11 +2835,11 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) // Needs to be called after dealing damage/healing to not remove breaking on damage auras spell->DoTriggersOnSpellHit(_spellHitTarget, EffectMask); - - if (_enablePVP) - spell->m_caster->ToPlayer()->UpdatePvP(true); } + if (_enablePVP) + spell->m_caster->ToPlayer()->UpdatePvP(true); + spell->_spellAura = HitAura; spell->CallScriptAfterHitHandlers(); spell->_spellAura = nullptr; @@ -3753,7 +3759,8 @@ void Spell::_cast(bool skipCheck) if (!(_triggeredCastFlags & TRIGGERED_IGNORE_AURA_INTERRUPT_FLAGS) && !m_spellInfo->HasAttribute(SPELL_ATTR2_NOT_AN_ACTION)) m_originalCaster->RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::ActionDelayed, m_spellInfo); - Unit::ProcSkillsAndAuras(m_originalCaster, nullptr, procAttacker, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_CAST, hitMask, this, nullptr, nullptr); + if (!m_spellInfo->HasAttribute(SPELL_ATTR3_SUPPRESS_CASTER_PROCS)) + Unit::ProcSkillsAndAuras(m_originalCaster, nullptr, procAttacker, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_CAST, hitMask, this, nullptr, nullptr); // Call CreatureAI hook OnSpellCast if (Creature* caster = m_originalCaster->ToCreature()) @@ -4017,7 +4024,8 @@ void Spell::_handle_finish_phase() } } - Unit::ProcSkillsAndAuras(m_originalCaster, nullptr, procAttacker, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_FINISH, m_hitMask, this, nullptr, nullptr); + if (!m_spellInfo->HasAttribute(SPELL_ATTR3_SUPPRESS_CASTER_PROCS)) + Unit::ProcSkillsAndAuras(m_originalCaster, nullptr, procAttacker, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_FINISH, m_hitMask, this, nullptr, nullptr); } void Spell::SendSpellCooldown() @@ -4157,7 +4165,8 @@ void Spell::finish(bool ok) if (Creature* creatureCaster = unitCaster->ToCreature()) creatureCaster->ReleaseSpellFocus(this); - Unit::ProcSkillsAndAuras(unitCaster, nullptr, PROC_FLAG_CAST_ENDED, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, this, nullptr, nullptr); + if (!m_spellInfo->HasAttribute(SPELL_ATTR3_SUPPRESS_CASTER_PROCS)) + Unit::ProcSkillsAndAuras(unitCaster, nullptr, PROC_FLAG_CAST_ENDED, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, this, nullptr, nullptr); if (!ok) return; @@ -5033,7 +5042,7 @@ void Spell::SendResurrectRequest(Player* target) resurrectRequest.ResurrectOffererVirtualRealmAddress = GetVirtualRealmAddress(); resurrectRequest.Name = sentName; resurrectRequest.Sickness = m_caster->IsUnit() && m_caster->ToUnit()->IsSpiritHealer(); // "you'll be afflicted with resurrection sickness" - resurrectRequest.UseTimer = !m_spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_RESURRECTION_TIMER); + resurrectRequest.UseTimer = !m_spellInfo->HasAttribute(SPELL_ATTR3_NO_RES_TIMER); if (Pet* pet = target->GetPet()) if (CharmInfo* charmInfo = pet->GetCharmInfo()) resurrectRequest.PetNumber = charmInfo->GetPetNumber(); @@ -5653,8 +5662,8 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 } // Spell cast only in battleground - if (m_spellInfo->HasAttribute(SPELL_ATTR3_BATTLEGROUND) && m_caster->GetTypeId() == TYPEID_PLAYER) - if (!m_caster->ToPlayer()->InBattleground()) + if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_BATTLEGROUNDS)) + if (!m_caster->GetMap()->IsBattleground()) return SPELL_FAILED_ONLY_BATTLEGROUNDS; // do not allow spells to be cast in arenas or rated battlegrounds @@ -7566,14 +7575,14 @@ SpellCastResult Spell::CheckItems(int32* param1 /*= nullptr*/, int32* param2 /*= return SPELL_CAST_OK; }; - if (m_spellInfo->HasAttribute(SPELL_ATTR3_MAIN_HAND)) + if (m_spellInfo->HasAttribute(SPELL_ATTR3_REQUIRES_MAIN_HAND_WEAPON)) { SpellCastResult mainHandResult = weaponCheck(BASE_ATTACK); if (mainHandResult != SPELL_CAST_OK) return mainHandResult; } - if (m_spellInfo->HasAttribute(SPELL_ATTR3_REQ_OFFHAND)) + if (m_spellInfo->HasAttribute(SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON)) { SpellCastResult offHandResult = weaponCheck(OFF_ATTACK); if (offHandResult != SPELL_CAST_OK) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 45a23d29435..23c1b9c670c 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1569,7 +1569,7 @@ bool SpellInfo::IsMultiSlotAura() const bool SpellInfo::IsStackableOnOneSlotWithDifferentCasters() const { /// TODO: Re-verify meaning of SPELL_ATTR3_STACK_FOR_DIFF_CASTERS and update conditions here - return StackAmount > 1 && !IsChanneled() && !HasAttribute(SPELL_ATTR3_STACK_FOR_DIFF_CASTERS); + return StackAmount > 1 && !IsChanneled() && !HasAttribute(SPELL_ATTR3_DOT_STACKING_RULE); } bool SpellInfo::IsCooldownStartedOnEvent() const @@ -1583,12 +1583,12 @@ bool SpellInfo::IsCooldownStartedOnEvent() const bool SpellInfo::IsDeathPersistent() const { - return HasAttribute(SPELL_ATTR3_DEATH_PERSISTENT); + return HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD); } bool SpellInfo::IsRequiringDeadTarget() const { - return HasAttribute(SPELL_ATTR3_ONLY_TARGET_GHOSTS); + return HasAttribute(SPELL_ATTR3_ONLY_ON_GHOSTS); } bool SpellInfo::IsAllowingDeadTarget() const @@ -1689,7 +1689,7 @@ WeaponAttackType SpellInfo::GetAttackType() const switch (DmgClass) { case SPELL_DAMAGE_CLASS_MELEE: - if (HasAttribute(SPELL_ATTR3_REQ_OFFHAND)) + if (HasAttribute(SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON)) result = OFF_ATTACK; else result = BASE_ATTACK; @@ -1738,7 +1738,7 @@ bool SpellInfo::IsAffected(uint32 familyName, flag128 const& familyFlags) const bool SpellInfo::IsAffectedBySpellMods() const { - return !HasAttribute(SPELL_ATTR3_NO_DONE_BONUS); + return !HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS); } bool SpellInfo::IsAffectedBySpellMod(SpellModifier const* mod) const @@ -2120,9 +2120,9 @@ SpellCastResult SpellInfo::CheckTarget(WorldObject const* caster, WorldObject co return SPELL_FAILED_TARGET_AFFECTING_COMBAT; // only spells with SPELL_ATTR3_ONLY_TARGET_GHOSTS can target ghosts - if (HasAttribute(SPELL_ATTR3_ONLY_TARGET_GHOSTS) != unitTarget->HasAuraType(SPELL_AURA_GHOST)) + if (HasAttribute(SPELL_ATTR3_ONLY_ON_GHOSTS) != unitTarget->HasAuraType(SPELL_AURA_GHOST)) { - if (HasAttribute(SPELL_ATTR3_ONLY_TARGET_GHOSTS)) + if (HasAttribute(SPELL_ATTR3_ONLY_ON_GHOSTS)) return SPELL_FAILED_TARGET_NOT_GHOST; else return SPELL_FAILED_BAD_TARGETS; @@ -2178,7 +2178,7 @@ SpellCastResult SpellInfo::CheckTarget(WorldObject const* caster, WorldObject co else return SPELL_CAST_OK; // corpseOwner and unit specific target checks - if (HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS) && unitTarget->GetTypeId() != TYPEID_PLAYER) + if (HasAttribute(SPELL_ATTR3_ONLY_ON_PLAYER) && unitTarget->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_TARGET_NOT_PLAYER; if (!IsAllowingDeadTarget() && !unitTarget->IsAlive()) @@ -3632,7 +3632,7 @@ bool SpellInfo::CanSpellProvideImmunityAgainstAura(SpellInfo const* auraSpellInf } } - if (!auraSpellInfo->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT)) + if (!auraSpellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT)) { if (AuraType auraName = auraSpellEffectInfo.ApplyAuraName) { @@ -3951,7 +3951,7 @@ Optional<SpellPowerCost> SpellInfo::CalcPowerCost(SpellPowerEntry const* power, else { WeaponAttackType slot = BASE_ATTACK; - if (!HasAttribute(SPELL_ATTR3_MAIN_HAND) && HasAttribute(SPELL_ATTR3_REQ_OFFHAND)) + if (!HasAttribute(SPELL_ATTR3_REQUIRES_MAIN_HAND_WEAPON) && HasAttribute(SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON)) slot = OFF_ATTACK; speed = unitCaster->GetBaseAttackTime(slot); @@ -4263,7 +4263,7 @@ SpellInfo const* SpellInfo::GetAuraRankForLevel(uint8 level) const return this; // Client ignores spell with these attributes (sub_53D9D0) - if (HasAttribute(SPELL_ATTR0_AURA_IS_DEBUFF) || HasAttribute(SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF) || HasAttribute(SPELL_ATTR3_DRAIN_SOUL)) + if (HasAttribute(SPELL_ATTR0_AURA_IS_DEBUFF) || HasAttribute(SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF) || HasAttribute(SPELL_ATTR3_ONLY_PROC_ON_CASTER)) return this; bool needRankSelection = false; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 63c75f92f19..b67cbed7112 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3058,7 +3058,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes() } // spells ignoring hit result should not be binary - if (!spellInfoMutable->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT)) + if (!spellInfoMutable->HasAttribute(SPELL_ATTR3_ALWAYS_HIT)) { bool setFlag = false; for (SpellEffectInfo const& spellEffectInfo : spellInfoMutable->GetEffects()) @@ -3507,12 +3507,6 @@ void SpellMgr::LoadSpellInfoCorrections() }); }); - // Execute - ApplySpellFix({ 5308 }, [](SpellInfo* spellInfo) - { - spellInfo->AttributesEx3 |= SPELL_ATTR3_CANT_TRIGGER_PROC; - }); - ApplySpellFix({ 31347, // Doom 36327, // Shoot Arcane Explosion Arrow @@ -3662,7 +3656,7 @@ void SpellMgr::LoadSpellInfoCorrections() // Oscillation Field ApplySpellFix({ 37408 }, [](SpellInfo* spellInfo) { - spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; + spellInfo->AttributesEx3 |= SPELL_ATTR3_DOT_STACKING_RULE; }); // Crafty's Ultra-Advanced Proto-Typical Shortening Blaster @@ -3719,12 +3713,6 @@ void SpellMgr::LoadSpellInfoCorrections() }); }); - // Vampiric Embrace - ApplySpellFix({ 15290 }, [](SpellInfo* spellInfo) - { - spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO; - }); - // Earthbind Totem (instant pulse) ApplySpellFix({ 6474 }, [](SpellInfo* spellInfo) { @@ -3797,7 +3785,7 @@ void SpellMgr::LoadSpellInfoCorrections() // Paralyze ApplySpellFix({ 48278 }, [](SpellInfo* spellInfo) { - spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; + spellInfo->AttributesEx3 |= SPELL_ATTR3_DOT_STACKING_RULE; }); ApplySpellFix({ @@ -4005,7 +3993,7 @@ void SpellMgr::LoadSpellInfoCorrections() 64381 // Strength of the Pack (Auriaya) }, [](SpellInfo* spellInfo) { - spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; + spellInfo->AttributesEx3 |= SPELL_ATTR3_DOT_STACKING_RULE; }); ApplySpellFix({ @@ -4165,13 +4153,7 @@ void SpellMgr::LoadSpellInfoCorrections() // Shadow's Fate ApplySpellFix({ 71169 }, [](SpellInfo* spellInfo) { - spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; - }); - - // Lock Players and Tap Chest - ApplySpellFix({ 72347 }, [](SpellInfo* spellInfo) - { - spellInfo->AttributesEx3 &= ~SPELL_ATTR3_NO_INITIAL_AGGRO; + spellInfo->AttributesEx3 |= SPELL_ATTR3_DOT_STACKING_RULE; }); // Resistant Skin (Deathbringer Saurfang adds) @@ -4238,7 +4220,7 @@ void SpellMgr::LoadSpellInfoCorrections() // Empowered Flare (Blood Prince Council) ApplySpellFix({ 71708 }, [](SpellInfo* spellInfo) { - spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; + spellInfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_CASTER_MODIFIERS; }); // Swarming Shadows @@ -4250,7 +4232,7 @@ void SpellMgr::LoadSpellInfoCorrections() // Corruption ApplySpellFix({ 70602 }, [](SpellInfo* spellInfo) { - spellInfo->AttributesEx3 |= SPELL_ATTR3_STACK_FOR_DIFF_CASTERS; + spellInfo->AttributesEx3 |= SPELL_ATTR3_DOT_STACKING_RULE; }); // Column of Frost (visual marker) @@ -4294,7 +4276,7 @@ void SpellMgr::LoadSpellInfoCorrections() // Chilled to the Bone ApplySpellFix({ 70106 }, [](SpellInfo* spellInfo) { - spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; + spellInfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_CASTER_MODIFIERS; spellInfo->AttributesEx6 |= SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS; }); @@ -4344,7 +4326,7 @@ void SpellMgr::LoadSpellInfoCorrections() // Harvest Soul ApplySpellFix({ 73655 }, [](SpellInfo* spellInfo) { - spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; + spellInfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_CASTER_MODIFIERS; }); // Summon Shadow Trap @@ -4514,12 +4496,6 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Stances = UI64LIT(1) << (FORM_TREE_OF_LIFE - 1); }); - // Feral Charge (Cat Form) - ApplySpellFix({ 49376 }, [](SpellInfo* spellInfo) - { - spellInfo->AttributesEx3 &= ~SPELL_ATTR3_CANT_TRIGGER_PROC; - }); - // Gaze of Occu'thar ApplySpellFix({ 96942 }, [](SpellInfo* spellInfo) { @@ -4574,13 +4550,13 @@ void SpellMgr::LoadSpellInfoCorrections() // Baron Rivendare (Stratholme) - Unholy Aura ApplySpellFix({ 17466, 17467 }, [](SpellInfo* spellInfo) { - spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO; + spellInfo->AttributesEx2 |= SPELL_ATTR2_NO_INITIAL_THREAT; }); // Spore - Spore Visual ApplySpellFix({ 42525 }, [](SpellInfo* spellInfo) { - spellInfo->AttributesEx3 |= SPELL_ATTR3_DEATH_PERSISTENT; + spellInfo->AttributesEx3 |= SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD; spellInfo->AttributesEx2 |= SPELL_ATTR2_ALLOW_DEAD_TARGET; }); |