aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.cpp4
-rw-r--r--src/server/game/Combat/ThreatManager.cpp2
-rw-r--r--src/server/game/Entities/Object/Object.cpp11
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp30
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h2
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h68
-rw-r--r--src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp166
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp10
-rw-r--r--src/server/game/Spells/Spell.cpp53
-rw-r--r--src/server/game/Spells/SpellInfo.cpp22
-rw-r--r--src/server/game/Spells/SpellMgr.cpp46
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;
});