Core/Spells: Rename SpellAttr0 to use official attribute names
This commit is contained in:
1 parent
24b84ba980
commit
d448ea4370
15 files changed
+104
-104
No files matched your search
@@ -192,7 +192,7 @@ void UnitAI::FillAISpellInfo()
|
||||
if (!spellInfo)
|
||||
continue;
|
||||
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_DEAD))
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD))
|
||||
AIInfo->condition = AICOND_DIE;
|
||||
else if (spellInfo->IsPassive() || spellInfo->GetDuration() == -1)
|
||||
AIInfo->condition = AICOND_AGGRO;
|
||||
|
||||
@@ -683,7 +683,7 @@ void PlayerAI::CancelAllShapeshifts()
|
||||
SpellInfo const* auraInfo = aura->GetSpellInfo();
|
||||
if (!auraInfo)
|
||||
continue;
|
||||
if (auraInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL))
|
||||
if (auraInfo->HasAttribute(SPELL_ATTR0_NO_AURA_CANCEL))
|
||||
continue;
|
||||
if (!auraInfo->IsPositive() || auraInfo->IsPassive())
|
||||
continue;
|
||||
|
||||
@@ -560,7 +560,7 @@ inline void Battleground::_ProcessJoin(uint32 diff)
|
||||
return !aura->IsPermanent()
|
||||
&& aura->GetDuration() <= 30 * IN_MILLISECONDS
|
||||
&& aurApp->IsPositive()
|
||||
&& !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)
|
||||
&& !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)
|
||||
&& !aura->HasEffectType(SPELL_AURA_MOD_INVISIBILITY);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -282,7 +282,7 @@ bool SpellChatLink::ValidateName(char* buffer, char const* context)
|
||||
ChatLink::ValidateName(buffer, context);
|
||||
|
||||
// spells with that flag have a prefix of "$PROFESSION: "
|
||||
if (_spell->HasAttribute(SPELL_ATTR0_TRADESPELL))
|
||||
if (_spell->HasAttribute(SPELL_ATTR0_IS_TRADESKILL))
|
||||
{
|
||||
SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(_spell->Id);
|
||||
if (bounds.first == bounds.second)
|
||||
|
||||
@@ -6013,7 +6013,7 @@ void Player::CheckAreaExploreAndOutdoor()
|
||||
return;
|
||||
|
||||
if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && !IsOutdoors())
|
||||
RemoveAurasWithAttribute(SPELL_ATTR0_OUTDOORS_ONLY);
|
||||
RemoveAurasWithAttribute(SPELL_ATTR0_ONLY_OUTDOORS);
|
||||
|
||||
uint32 const areaId = GetAreaId();
|
||||
AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
|
||||
|
||||
@@ -2287,7 +2287,7 @@ bool Unit::isSpellBlocked(Unit* victim, SpellInfo const* spellProto)
|
||||
{
|
||||
// These spells can't be blocked
|
||||
if (spellProto
|
||||
&& (spellProto->HasAttribute(SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK)
|
||||
&& (spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE)
|
||||
|| spellProto->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT)
|
||||
|| spellProto->HasAttribute(SPELL_ATTR8_CANT_BLOCK)))
|
||||
return false;
|
||||
@@ -2375,7 +2375,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo
|
||||
return SPELL_MISS_RESIST;
|
||||
|
||||
// Same spells cannot be parried/dodged
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK))
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
|
||||
return SPELL_MISS_NONE;
|
||||
|
||||
bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_CANT_DODGE);
|
||||
@@ -6354,7 +6354,7 @@ bool Unit::IsMagnet() const
|
||||
Unit* Unit::GetMagicHitRedirectTarget(Unit* victim, SpellInfo const* spellInfo)
|
||||
{
|
||||
// Patch 1.2 notes: Spell Reflection no longer reflects abilities
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_CANT_BE_REDIRECTED) || spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_CANT_BE_REDIRECTED) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
|
||||
return victim;
|
||||
|
||||
Unit::AuraEffectList const& magnetAuras = victim->GetAuraEffectsByType(SPELL_AURA_SPELL_MAGNET);
|
||||
@@ -7749,7 +7749,7 @@ bool Unit::IsImmunedToDamage(SpellInfo const* spellInfo) const
|
||||
return false;
|
||||
|
||||
// for example 40175
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY) && spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT))
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT))
|
||||
return false;
|
||||
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE) || spellInfo->HasAttribute(SPELL_ATTR2_UNAFFECTED_BY_AURA_SCHOOL_IMMUNE))
|
||||
@@ -7787,7 +7787,7 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo, Unit* caster, Optional<u
|
||||
if (idList.count(spellInfo->Id) > 0)
|
||||
return true;
|
||||
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
|
||||
return false;
|
||||
|
||||
if (uint32 dispel = spellInfo->Dispel)
|
||||
@@ -7883,7 +7883,7 @@ bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index, Unit
|
||||
if (!spellInfo || !spellInfo->Effects[index].IsEffect())
|
||||
return false;
|
||||
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
|
||||
return false;
|
||||
|
||||
// If m_immuneToEffect type contain this effect type, IMMUNE effect.
|
||||
@@ -9257,7 +9257,7 @@ void Unit::AtEnterCombat()
|
||||
{
|
||||
if (Spell* spell = m_currentSpells[CURRENT_GENERIC_SPELL])
|
||||
if (spell->getState() == SPELL_STATE_PREPARING
|
||||
&& spell->m_spellInfo->HasAttribute(SPELL_ATTR0_CANT_USED_IN_COMBAT)
|
||||
&& spell->m_spellInfo->HasAttribute(SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL)
|
||||
&& spell->m_spellInfo->InterruptFlags.HasFlag(SpellInterruptFlags::Combat))
|
||||
InterruptNonMeleeSpells(false);
|
||||
|
||||
@@ -9444,10 +9444,10 @@ void Unit::ModSpellCastTime(SpellInfo const* spellInfo, int32 & castTime, Spell*
|
||||
float castSpeedMod = 1;
|
||||
castSpeedMod = castSpeedMod - GetTotalAuraMultiplier(SPELL_AURA_HASTE_SPELLS) + 1.0f;
|
||||
|
||||
if (!(spellInfo->HasAttribute(SPELL_ATTR0_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL) || spellInfo->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS)) &&
|
||||
if (!(spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) || spellInfo->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS)) &&
|
||||
((GetTypeId() == TYPEID_PLAYER && spellInfo->SpellFamilyName) || GetTypeId() == TYPEID_UNIT))
|
||||
castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
|
||||
else if (spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) && !spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG))
|
||||
else if (spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT) && !spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG))
|
||||
castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK] * castSpeedMod);
|
||||
else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
|
||||
castTime = 500;
|
||||
@@ -9465,10 +9465,10 @@ void Unit::ModSpellDurationTime(SpellInfo const* spellInfo, int32 & duration, Sp
|
||||
if (Player* modOwner = GetSpellModOwner())
|
||||
modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, duration, spell);
|
||||
|
||||
if (!(spellInfo->HasAttribute(SPELL_ATTR0_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL) || spellInfo->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS)) &&
|
||||
if (!(spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) || spellInfo->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS)) &&
|
||||
((GetTypeId() == TYPEID_PLAYER && spellInfo->SpellFamilyName) || GetTypeId() == TYPEID_UNIT))
|
||||
duration = int32(float(duration) * GetFloatValue(UNIT_MOD_CAST_SPEED));
|
||||
else if (spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) && !spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG))
|
||||
else if (spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT) && !spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG))
|
||||
duration = int32(float(duration) * m_modAttackSpeedPct[RANGED_ATTACK]);
|
||||
}
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@ void WorldSession::HandlePetAction(WorldPacket& recvData)
|
||||
SpellInfo const* spell = (flag == ACT_ENABLED || flag == ACT_PASSIVE) ? sSpellMgr->GetSpellInfo(spellid) : nullptr;
|
||||
if (!spell)
|
||||
return;
|
||||
if (!spell->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_DEAD))
|
||||
if (!spell->HasAttribute(SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD))
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -301,8 +301,8 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
|
||||
if (!spellInfo)
|
||||
return;
|
||||
|
||||
// not allow remove spells with attr SPELL_ATTR0_CANT_CANCEL
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL))
|
||||
// not allow remove spells with attr SPELL_ATTR0_NO_AURA_CANCEL
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_NO_AURA_CANCEL))
|
||||
return;
|
||||
|
||||
// channeled spell case (it currently cast then)
|
||||
@@ -398,8 +398,8 @@ void WorldSession::HandleCancelChanneling(WorldPacket& recvData)
|
||||
if (!spellInfo)
|
||||
return;
|
||||
|
||||
// not allow cancel channeling with attr SPELL_ATTR0_CANT_CANCEL
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL))
|
||||
// not allow cancel channeling with attr SPELL_ATTR0_NO_AURA_CANCEL
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR0_NO_AURA_CANCEL))
|
||||
return;
|
||||
|
||||
Unit* mover = GetGameClient()->GetActivelyMovedUnit();
|
||||
|
||||
@@ -1124,7 +1124,7 @@ void LoadLootTemplates_Spell()
|
||||
{
|
||||
// not report about not trainable spells (optionally supported by DB)
|
||||
// ignore 61756 (Northrend Inscription Research (FAST QA VERSION) for example
|
||||
if (!spellInfo->HasAttribute(SPELL_ATTR0_NOT_SHAPESHIFT) || spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL))
|
||||
if (!spellInfo->HasAttribute(SPELL_ATTR0_NOT_SHAPESHIFTED) || spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL))
|
||||
{
|
||||
LootTemplates_Spell.ReportNonExistingId(spell_id, "Spell", spellInfo->Id);
|
||||
}
|
||||
|
||||
@@ -351,40 +351,40 @@ const uint32 ItemQualityColors[MAX_ITEM_QUALITY] =
|
||||
// Spell Attributes definitions
|
||||
// ***********************************
|
||||
|
||||
enum SpellAttr0
|
||||
enum SpellAttr0 : uint32
|
||||
{
|
||||
SPELL_ATTR0_UNK0 = 0x00000001, // 0
|
||||
SPELL_ATTR0_REQ_AMMO = 0x00000002, // 1 on next ranged
|
||||
SPELL_ATTR0_ON_NEXT_SWING = 0x00000004, // 2
|
||||
SPELL_ATTR0_IS_REPLENISHMENT = 0x00000008, // 3 not set in 3.0.3
|
||||
SPELL_ATTR0_ABILITY = 0x00000010, // 4 client puts 'ability' instead of 'spell' in game strings for these spells
|
||||
SPELL_ATTR0_TRADESPELL = 0x00000020, // 5 trade spells (recipes), will be added by client to a sublist of profession spell
|
||||
SPELL_ATTR0_PASSIVE = 0x00000040, // 6 Passive spell
|
||||
SPELL_ATTR0_HIDDEN_CLIENTSIDE = 0x00000080, // 7 Spells with this attribute are not visible in spellbook or aura bar
|
||||
SPELL_ATTR0_HIDE_IN_COMBAT_LOG = 0x00000100, // 8 This attribite controls whether spell appears in combat logs
|
||||
SPELL_ATTR0_TARGET_MAINHAND_ITEM = 0x00000200, // 9 Client automatically selects item from mainhand slot as a cast target
|
||||
SPELL_ATTR0_ON_NEXT_SWING_2 = 0x00000400, // 10
|
||||
SPELL_ATTR0_UNK11 = 0x00000800, // 11
|
||||
SPELL_ATTR0_DAYTIME_ONLY = 0x00001000, // 12 only useable at daytime, not set in 2.4.2
|
||||
SPELL_ATTR0_NIGHT_ONLY = 0x00002000, // 13 only useable at night, not set in 2.4.2
|
||||
SPELL_ATTR0_INDOORS_ONLY = 0x00004000, // 14 only useable indoors, not set in 2.4.2
|
||||
SPELL_ATTR0_OUTDOORS_ONLY = 0x00008000, // 15 Only useable outdoors.
|
||||
SPELL_ATTR0_NOT_SHAPESHIFT = 0x00010000, // 16 Not while shapeshifted
|
||||
SPELL_ATTR0_ONLY_STEALTHED = 0x00020000, // 17 Must be in stealth
|
||||
SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE = 0x00040000, // 18 client won't hide unit weapons in sheath on cast/channel
|
||||
SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION = 0x00080000, // 19 spelldamage depends on caster level
|
||||
SPELL_ATTR0_STOP_ATTACK_TARGET = 0x00100000, // 20 Stop attack after use this spell (and not begin attack if use)
|
||||
SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK = 0x00200000, // 21 Cannot be dodged/parried/blocked
|
||||
SPELL_ATTR0_CAST_TRACK_TARGET = 0x00400000, // 22 Client automatically forces player to face target when casting
|
||||
SPELL_ATTR0_CASTABLE_WHILE_DEAD = 0x00800000, // 23 castable while dead?
|
||||
SPELL_ATTR0_CASTABLE_WHILE_MOUNTED = 0x01000000, // 24 castable while mounted
|
||||
SPELL_ATTR0_DISABLED_WHILE_ACTIVE = 0x02000000, // 25 Activate and start cooldown after aura fade or remove summoned creature or go
|
||||
SPELL_ATTR0_NEGATIVE_1 = 0x04000000, // 26 Many negative spells have this attr
|
||||
SPELL_ATTR0_CASTABLE_WHILE_SITTING = 0x08000000, // 27 castable while sitting
|
||||
SPELL_ATTR0_CANT_USED_IN_COMBAT = 0x10000000, // 28 Cannot be used in combat
|
||||
SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY = 0x20000000, // 29 unaffected by invulnerability (hmm possible not...)
|
||||
SPELL_ATTR0_HEARTBEAT_RESIST_CHECK = 0x40000000, // 30 random chance the effect will end TODO: implement core support
|
||||
SPELL_ATTR0_CANT_CANCEL = 0x80000000 // 31 positive aura can't be canceled
|
||||
SPELL_ATTR0_PROC_FAILURE_BURNS_CHARGE = 0x00000001, /*NYI*/ // Proc Failure Burns Charge
|
||||
SPELL_ATTR0_USES_RANGED_SLOT = 0x00000002, // Uses Ranged Slot DESCRIPTION Use ammo, ranged attack range modifiers, ranged haste, etc.
|
||||
SPELL_ATTR0_ON_NEXT_SWING_NO_DAMAGE = 0x00000004, // 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, // Do Not Log Immune Misses (client only)
|
||||
SPELL_ATTR0_IS_ABILITY = 0x00000010, // Is Ability DESCRIPTION Cannot be reflected, not affected by cast speed modifiers, etc.
|
||||
SPELL_ATTR0_IS_TRADESKILL = 0x00000020, // Is Tradeskill DESCRIPTION Displayed in recipe list, not affected by cast speed modifiers
|
||||
SPELL_ATTR0_PASSIVE = 0x00000040, // Passive DESCRIPTION Spell is automatically cast on self by core
|
||||
SPELL_ATTR0_DO_NOT_DISPLAY_SPELLBOOK_AURA_ICON_COMBAT_LOG = 0x00000080, // Do Not Display (Spellbook, Aura Icon, Combat Log) (client only) DESCRIPTION Not visible in spellbook or aura bar
|
||||
SPELL_ATTR0_DO_NOT_LOG = 0x00000100, // Do Not Log (client only) DESCRIPTION Spell will not appear in combat logs
|
||||
SPELL_ATTR0_HELD_ITEM_ONLY = 0x00000200, // Held Item Only (client only) DESCRIPTION Client will automatically select main-hand item as cast target
|
||||
SPELL_ATTR0_ON_NEXT_SWING = 0x00000400, // On Next Swing DESCRIPTION Both "on next swing" attributes have identical handling in server & client
|
||||
SPELL_ATTR0_WEARER_CASTS_PROC_TRIGGER = 0x00000800, /*NYI*/ // Wearer Casts Proc Trigger
|
||||
SPELL_ATTR0_SERVER_ONLY = 0x00001000, // Server Only
|
||||
SPELL_ATTR0_ALLOW_ITEM_SPELL_IN_PVP = 0x00002000, // Allow Item Spell In PvP
|
||||
SPELL_ATTR0_ONLY_INDOORS = 0x00004000, // Only Indoors
|
||||
SPELL_ATTR0_ONLY_OUTDOORS = 0x00008000, // Only Outdoors
|
||||
SPELL_ATTR0_NOT_SHAPESHIFTED = 0x00010000, // Not Shapeshifted
|
||||
SPELL_ATTR0_ONLY_STEALTHED = 0x00020000, // Only Stealthed
|
||||
SPELL_ATTR0_DO_NOT_SHEATH = 0x00040000, // Do Not Sheath (client only)
|
||||
SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL = 0x00080000, // Scales w/ Creature Level DESCRIPTION For non-player casts, scale impact and power cost with caster's level
|
||||
SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT = 0x00100000, // Cancels Auto Attack Combat DESCRIPTION After casting this, the current auto-attack will be interrupted
|
||||
SPELL_ATTR0_NO_ACTIVE_DEFENSE = 0x00200000, // No Active Defense DESCRIPTION Spell cannot be dodged, parried or blocked
|
||||
SPELL_ATTR0_TRACK_TARGET_IN_CAST_PLAYER_ONLY = 0x00400000, // Track Target in Cast (Player Only) (client only)
|
||||
SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD = 0x00800000, // Allow Cast While Dead DESCRIPTION Spells without this flag cannot be cast by dead units in non-triggered contexts
|
||||
SPELL_ATTR0_ALLOW_WHILE_MOUNTED = 0x01000000, // Allow While Mounted
|
||||
SPELL_ATTR0_COOLDOWN_ON_EVENT = 0x02000000, // Cooldown On Event DESCRIPTION Spell is unusable while already active, and cooldown does not begin until the effects have worn off
|
||||
SPELL_ATTR0_AURA_IS_DEBUFF = 0x04000000, // Aura Is Debuff DESCRIPTION Forces the spell to be treated as a negative spell
|
||||
SPELL_ATTR0_ALLOW_WHILE_SITTING = 0x08000000, // Allow While Sitting
|
||||
SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL = 0x10000000, // Not In Combat (Only Peaceful)
|
||||
SPELL_ATTR0_NO_IMMUNITIES = 0x20000000, // No Immunities DESCRIPTION Allows spell to pierce invulnerability, unless the invulnerability spell also has this attribute
|
||||
SPELL_ATTR0_HEARTBEAT_RESIST = 0x40000000, // Heartbeat Resist DESCRIPTION Periodically re-rolls against resistance to potentially expire aura early
|
||||
SPELL_ATTR0_NO_AURA_CANCEL = 0x80000000 // No Aura Cancel DESCRIPTION Prevents the player from voluntarily canceling a positive aura
|
||||
};
|
||||
|
||||
enum SpellAttr1
|
||||
@@ -520,7 +520,7 @@ enum SpellAttr4
|
||||
SPELL_ATTR4_NOT_CHECK_SELFCAST_POWER = 0x00100000, // 20 supersedes message "More powerful spell applied" for self casts.
|
||||
SPELL_ATTR4_DONT_REMOVE_IN_ARENA = 0x00200000, // 21 Pally aura, dk presence, dudu form, warrior stance, shadowform, hunter track
|
||||
SPELL_ATTR4_UNK22 = 0x00400000, // 22 Seal of Command (42058, 57770) and Gymer's Smash 55426
|
||||
SPELL_ATTR4_CANT_TRIGGER_ITEM_SPELLS = 0x00800000, // 23 spells with this flag should not trigger item spells / enchants (mostly in conjunction with SPELL_ATTR0_STOP_ATTACK_TARGET)
|
||||
SPELL_ATTR4_CANT_TRIGGER_ITEM_SPELLS = 0x00800000, // 23 spells with this flag should not trigger item spells / enchants (mostly in conjunction with SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT)
|
||||
SPELL_ATTR4_UNK24 = 0x01000000, // 24 some shoot spell
|
||||
SPELL_ATTR4_IS_PET_SCALING = 0x02000000, // 25 pet scaling auras
|
||||
SPELL_ATTR4_CAST_ONLY_IN_OUTLAND = 0x04000000, // 26 Can only be used in Outland.
|
||||
|
||||
@@ -1286,7 +1286,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
|
||||
continue;
|
||||
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
|
||||
if (!spellInfo || !(spellInfo->IsPassive() || spellInfo->HasAttribute(SPELL_ATTR0_HIDDEN_CLIENTSIDE)))
|
||||
if (!spellInfo || !(spellInfo->IsPassive() || spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY_SPELLBOOK_AURA_ICON_COMBAT_LOG)))
|
||||
continue;
|
||||
|
||||
if (spellInfo->HasAttribute(SPELL_ATTR8_MASTERY_SPECIALIZATION) && !plrTarget->IsCurrentSpecMasterySpell(spellInfo))
|
||||
@@ -1304,7 +1304,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
|
||||
if (GlyphPropertiesEntry const* glyph = sGlyphPropertiesStore.LookupEntry(glyphId))
|
||||
{
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(glyph->SpellID);
|
||||
if (!spellInfo || !(spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) || spellInfo->HasAttribute(SPELL_ATTR0_HIDDEN_CLIENTSIDE)))
|
||||
if (!spellInfo || !(spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) || spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY_SPELLBOOK_AURA_ICON_COMBAT_LOG)))
|
||||
continue;
|
||||
|
||||
if (spellInfo->Stances & (UI64LIT(1) << (GetMiscValue() - 1)))
|
||||
@@ -3680,9 +3680,9 @@ void AuraEffect::HandleModTotalPercentStat(AuraApplication const* aurApp, uint8
|
||||
}
|
||||
}
|
||||
|
||||
// recalculate current HP/MP after applying aura modifications (only for spells with SPELL_ATTR0_ABILITY 0x00000010 flag)
|
||||
// recalculate current HP/MP after applying aura modifications (only for spells with SPELL_ATTR0_IS_ABILITY 0x00000010 flag)
|
||||
// this check is total bullshit i think
|
||||
if (((GetMiscValueB() & 1 << STAT_STAMINA) || GetMiscValueB() == - 1) && m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY))
|
||||
if (((GetMiscValueB() & 1 << STAT_STAMINA) || GetMiscValueB() == - 1) && m_spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY))
|
||||
target->SetHealth(std::max<uint32>(CalculatePct(target->GetMaxHealth(), healthPct), (zeroHealth ? 0 : 1)));
|
||||
}
|
||||
|
||||
|
||||
@@ -169,7 +169,7 @@ class TC_GAME_API Aura
|
||||
return GetCasterGUID() == target->GetGUID()
|
||||
&& m_spellInfo->Stances
|
||||
&& !m_spellInfo->HasAttribute(SPELL_ATTR2_NOT_NEED_SHAPESHIFT)
|
||||
&& !m_spellInfo->HasAttribute(SPELL_ATTR0_NOT_SHAPESHIFT);
|
||||
&& !m_spellInfo->HasAttribute(SPELL_ATTR0_NOT_SHAPESHIFTED);
|
||||
}
|
||||
|
||||
bool CanBeSaved() const;
|
||||
|
||||
@@ -684,8 +684,8 @@ m_caster((info->HasAttribute(SPELL_ATTR6_CAST_BY_CHARMER) && caster->GetCharmerO
|
||||
|
||||
// Determine if spell can be reflected back to the caster
|
||||
// Patch 1.2 notes: Spell Reflection no longer reflects abilities
|
||||
m_canReflect = m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC && !m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)
|
||||
&& !m_spellInfo->HasAttribute(SPELL_ATTR1_CANT_BE_REFLECTED) && !m_spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)
|
||||
m_canReflect = m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC && !m_spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY)
|
||||
&& !m_spellInfo->HasAttribute(SPELL_ATTR1_CANT_BE_REFLECTED) && !m_spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)
|
||||
&& !m_spellInfo->IsPassive();
|
||||
|
||||
CleanupTargetList();
|
||||
@@ -2587,7 +2587,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
|
||||
case SPELL_DAMAGE_CLASS_MAGIC:
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC))
|
||||
procAttacker |= PROC_FLAG_DEAL_PERIODIC;
|
||||
else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY))
|
||||
else if (m_spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY))
|
||||
{
|
||||
if (positive)
|
||||
procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY;
|
||||
@@ -2613,7 +2613,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
|
||||
case SPELL_DAMAGE_CLASS_MAGIC:
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC))
|
||||
procVictim |= PROC_FLAG_TAKE_PERIODIC;
|
||||
else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY))
|
||||
else if (m_spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY))
|
||||
{
|
||||
if (positive)
|
||||
procVictim |= PROC_FLAG_TAKE_HELPFUL_ABILITY;
|
||||
@@ -2706,7 +2706,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
|
||||
if (Unit* summoner = caster->ToTempSummon()->GetSummoner())
|
||||
summoner->ProcSkillsAndAuras(unitTarget, procAttacker, procVictim, PROC_SPELL_TYPE_DAMAGE, PROC_SPELL_PHASE_HIT, hitMask, this, &spellDamageInfo, nullptr);
|
||||
|
||||
if (caster->GetTypeId() == TYPEID_PLAYER && !m_spellInfo->HasAttribute(SPELL_ATTR0_STOP_ATTACK_TARGET) && !m_spellInfo->HasAttribute(SPELL_ATTR4_CANT_TRIGGER_ITEM_SPELLS) &&
|
||||
if (caster->GetTypeId() == TYPEID_PLAYER && !m_spellInfo->HasAttribute(SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT) && !m_spellInfo->HasAttribute(SPELL_ATTR4_CANT_TRIGGER_ITEM_SPELLS) &&
|
||||
(m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE || m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED))
|
||||
caster->ToPlayer()->CastItemCombatSpell(spellDamageInfo);
|
||||
}
|
||||
@@ -2723,7 +2723,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
|
||||
DamageInfo spellNoDamageInfo(damageInfo, NODAMAGE, m_attackType, hitMask);
|
||||
caster->ProcSkillsAndAuras(unitTarget, procAttacker, procVictim, PROC_SPELL_TYPE_NO_DMG_HEAL, PROC_SPELL_PHASE_HIT, hitMask, this, &spellNoDamageInfo, nullptr);
|
||||
|
||||
if (caster->GetTypeId() == TYPEID_PLAYER && !m_spellInfo->HasAttribute(SPELL_ATTR0_STOP_ATTACK_TARGET) && !m_spellInfo->HasAttribute(SPELL_ATTR4_CANT_TRIGGER_ITEM_SPELLS) &&
|
||||
if (caster->GetTypeId() == TYPEID_PLAYER && !m_spellInfo->HasAttribute(SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT) && !m_spellInfo->HasAttribute(SPELL_ATTR4_CANT_TRIGGER_ITEM_SPELLS) &&
|
||||
(m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE || m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED))
|
||||
caster->ToPlayer()->CastItemCombatSpell(spellNoDamageInfo);
|
||||
}
|
||||
@@ -3212,7 +3212,7 @@ void Spell::prepare(SpellCastTargets const& targets, AuraEffect const* triggered
|
||||
// Don't allow to interrupt channeled spells that are not allowed to be cancelled
|
||||
if (Spell* curSpell = m_caster->GetCurrentSpell(CURRENT_CHANNELED_SPELL))
|
||||
{
|
||||
if (curSpell->m_spellInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL) && !m_spellInfo->HasAttribute(SPELL_ATTR4_CAN_CAST_WHILE_CASTING))
|
||||
if (curSpell->m_spellInfo->HasAttribute(SPELL_ATTR0_NO_AURA_CANCEL) && !m_spellInfo->HasAttribute(SPELL_ATTR4_CAN_CAST_WHILE_CASTING))
|
||||
{
|
||||
SendCastResult(SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW);
|
||||
finish(false);
|
||||
@@ -3674,7 +3674,7 @@ void Spell::_cast(bool skipCheck)
|
||||
{
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC))
|
||||
procAttacker |= PROC_FLAG_DEAL_PERIODIC;
|
||||
else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY))
|
||||
else if (m_spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY))
|
||||
{
|
||||
if (IsPositive())
|
||||
procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY;
|
||||
@@ -3897,7 +3897,7 @@ void Spell::_handle_finish_phase()
|
||||
{
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC))
|
||||
procAttacker |= PROC_FLAG_DEAL_PERIODIC;
|
||||
else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY))
|
||||
else if (m_spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY))
|
||||
{
|
||||
if (IsPositive())
|
||||
procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY;
|
||||
@@ -4095,7 +4095,7 @@ void Spell::finish(bool ok, bool sendChannelUpdate /* = false */)
|
||||
}
|
||||
|
||||
// Stop Attack for some spells
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_STOP_ATTACK_TARGET))
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT))
|
||||
m_caster->AttackStop();
|
||||
}
|
||||
|
||||
@@ -4338,7 +4338,7 @@ void Spell::SendSpellStart()
|
||||
if (((IsTriggered() && !m_spellInfo->IsAutoRepeatRangedSpell()) || m_triggeredByAuraSpell) && !m_cast_count)
|
||||
castFlags |= CAST_FLAG_PENDING;
|
||||
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO))
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT))
|
||||
castFlags |= CAST_FLAG_PROJECTILE;
|
||||
|
||||
if ((m_caster->GetTypeId() == TYPEID_PLAYER ||
|
||||
@@ -4433,7 +4433,7 @@ void Spell::SendSpellGo()
|
||||
if (((IsTriggered() && !m_spellInfo->IsAutoRepeatRangedSpell()) || m_triggeredByAuraSpell) && !m_cast_count)
|
||||
castFlags |= CAST_FLAG_PENDING;
|
||||
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO))
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT))
|
||||
castFlags |= CAST_FLAG_PROJECTILE; // arrows/bullets visual
|
||||
|
||||
if ((m_caster->GetTypeId() == TYPEID_PLAYER ||
|
||||
@@ -5445,7 +5445,7 @@ void Spell::HandleEffects(Unit* pUnitTarget, Item* pItemTarget, GameObject* pGoT
|
||||
SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint32* param2 /*= nullptr*/, MountResult* mountResult /*= nullptr*/)
|
||||
{
|
||||
// check death state
|
||||
if (!m_caster->IsAlive() && !m_spellInfo->IsPassive() && !(m_spellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_DEAD) || (IsTriggered() && !m_triggeredByAuraSpell)))
|
||||
if (!m_caster->IsAlive() && !m_spellInfo->IsPassive() && !(m_spellInfo->HasAttribute(SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD) || (IsTriggered() && !m_triggeredByAuraSpell)))
|
||||
return SPELL_FAILED_CASTER_DEAD;
|
||||
|
||||
// Prevent cheating in case the player has an immunity effect and tries to interact with a non-allowed gameobject. The error message is handled by the client so we don't report anything here
|
||||
@@ -5465,7 +5465,7 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint
|
||||
{
|
||||
// These two auras check SpellFamilyName defined by dbc class data instead of current spell SpellFamilyName
|
||||
if (m_caster->HasAuraType(SPELL_AURA_DISABLE_CASTING_EXCEPT_ABILITIES)
|
||||
&& !m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO)
|
||||
&& !m_spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT)
|
||||
&& !m_spellInfo->HasEffect(SPELL_EFFECT_ATTACK)
|
||||
&& !m_caster->HasAuraTypeWithFamilyFlags(SPELL_AURA_DISABLE_CASTING_EXCEPT_ABILITIES, sChrClassesStore.AssertEntry(m_caster->getClass())->SpellClassSet, m_spellInfo->SpellFamilyFlags))
|
||||
return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
|
||||
@@ -5474,7 +5474,7 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint
|
||||
{
|
||||
if (!m_caster->HasAuraTypeWithFamilyFlags(SPELL_AURA_DISABLE_ATTACKING_EXCEPT_ABILITIES, sChrClassesStore.AssertEntry(m_caster->getClass())->SpellClassSet, m_spellInfo->SpellFamilyFlags))
|
||||
{
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO)
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT)
|
||||
|| m_spellInfo->IsNextMeleeSwingSpell()
|
||||
|| m_spellInfo->HasAttribute(SPELL_ATTR1_MELEE_COMBAT_START)
|
||||
|| m_spellInfo->HasAttribute(SPELL_ATTR2_INITIATE_COMBAT_POST_CAST)
|
||||
@@ -5510,7 +5510,7 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint
|
||||
|
||||
// Check global cooldown
|
||||
if (strict && !(_triggeredCastFlags & TRIGGERED_IGNORE_GCD) && HasGlobalCooldown())
|
||||
return !m_spellInfo->HasAttribute(SPELL_ATTR0_DISABLED_WHILE_ACTIVE) ? SPELL_FAILED_NOT_READY : SPELL_FAILED_DONT_REPORT;
|
||||
return !m_spellInfo->HasAttribute(SPELL_ATTR0_COOLDOWN_ON_EVENT) ? SPELL_FAILED_NOT_READY : SPELL_FAILED_DONT_REPORT;
|
||||
|
||||
// only triggered spells can be processed an ended battleground
|
||||
if (!IsTriggered() && m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
@@ -5520,11 +5520,11 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint
|
||||
|
||||
if (m_caster->GetTypeId() == TYPEID_PLAYER && VMAP::VMapFactory::createOrGetVMapManager()->isLineOfSightCalcEnabled())
|
||||
{
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_OUTDOORS_ONLY) &&
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_ONLY_OUTDOORS) &&
|
||||
!m_caster->IsOutdoors())
|
||||
return SPELL_FAILED_ONLY_OUTDOORS;
|
||||
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_INDOORS_ONLY) &&
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_ONLY_INDOORS) &&
|
||||
!m_caster->IsOutdoors())
|
||||
return SPELL_FAILED_ONLY_INDOORS;
|
||||
}
|
||||
@@ -5741,7 +5741,7 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint
|
||||
|
||||
// not let players cast spells at mount (and let do it to creatures)
|
||||
if (m_caster->IsMounted() && m_caster->GetTypeId() == TYPEID_PLAYER && !(_triggeredCastFlags & TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE) &&
|
||||
!m_spellInfo->IsPassive() && !m_spellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_MOUNTED))
|
||||
!m_spellInfo->IsPassive() && !m_spellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
|
||||
{
|
||||
if (m_caster->IsInFlight())
|
||||
return SPELL_FAILED_NOT_ON_TAXI;
|
||||
@@ -6776,7 +6776,7 @@ std::pair<float, float> Spell::GetMinMaxRange(bool strict) const
|
||||
rangeMod += 8.0f / 3.0f;
|
||||
}
|
||||
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) && m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
if (m_spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT) && m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
if (Item* ranged = m_caster->ToPlayer()->GetWeaponForAttack(RANGED_ATTACK, true))
|
||||
maxRange *= ranged->GetTemplate()->GetRangedModRange() * 0.01f;
|
||||
|
||||
@@ -8358,7 +8358,7 @@ void Spell::TriggerGlobalCooldown()
|
||||
// Apply haste rating
|
||||
if (m_spellInfo->StartRecoveryCategory == 133 && m_spellInfo->StartRecoveryTime == 1500 &&
|
||||
m_spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE && m_spellInfo->DmgClass != SPELL_DAMAGE_CLASS_RANGED &&
|
||||
!m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) && !m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY))
|
||||
!m_spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT) && !m_spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY))
|
||||
{
|
||||
gcd = int32(float(gcd) * m_caster->GetFloatValue(UNIT_MOD_CAST_SPEED));
|
||||
RoundToInterval<int32>(gcd, MIN_GCD, MAX_GCD);
|
||||
|
||||
@@ -552,7 +552,7 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const
|
||||
|
||||
if (!caster->IsControlledByPlayer() &&
|
||||
_spellInfo->SpellLevel && _spellInfo->SpellLevel != caster->getLevel() &&
|
||||
!basePointsPerLevel && _spellInfo->HasAttribute(SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION))
|
||||
!basePointsPerLevel && _spellInfo->HasAttribute(SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL))
|
||||
{
|
||||
bool canEffectScale = false;
|
||||
switch (Effect)
|
||||
@@ -1394,7 +1394,7 @@ bool SpellInfo::IsStackableOnOneSlotWithDifferentCasters() const
|
||||
|
||||
bool SpellInfo::IsCooldownStartedOnEvent() const
|
||||
{
|
||||
if (HasAttribute(SPELL_ATTR0_DISABLED_WHILE_ACTIVE))
|
||||
if (HasAttribute(SPELL_ATTR0_COOLDOWN_ON_EVENT))
|
||||
return true;
|
||||
|
||||
return CategoryEntry && CategoryEntry->GetFlags().HasFlag(SpellCategoryFlags::CooldownEventOnLeaveCombat);
|
||||
@@ -1442,7 +1442,7 @@ bool SpellInfo::IsGroupBuff() const
|
||||
|
||||
bool SpellInfo::CanBeUsedInCombat() const
|
||||
{
|
||||
return !HasAttribute(SPELL_ATTR0_CANT_USED_IN_COMBAT);
|
||||
return !HasAttribute(SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL);
|
||||
}
|
||||
|
||||
bool SpellInfo::IsPositive() const
|
||||
@@ -1481,7 +1481,7 @@ bool SpellInfo::NeedsComboPoints() const
|
||||
|
||||
bool SpellInfo::IsNextMeleeSwingSpell() const
|
||||
{
|
||||
return HasAttribute(SpellAttr0(SPELL_ATTR0_ON_NEXT_SWING | SPELL_ATTR0_ON_NEXT_SWING_2));
|
||||
return HasAttribute(SpellAttr0(SPELL_ATTR0_ON_NEXT_SWING_NO_DAMAGE | SPELL_ATTR0_ON_NEXT_SWING));
|
||||
}
|
||||
|
||||
bool SpellInfo::IsBreakingStealth() const
|
||||
@@ -1566,11 +1566,11 @@ bool SpellInfo::IsAffectedBySpellMod(SpellModifier const* mod) const
|
||||
bool SpellInfo::CanPierceImmuneAura(SpellInfo const* auraSpellInfo) const
|
||||
{
|
||||
// aura can't be pierced
|
||||
if (!auraSpellInfo || auraSpellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
|
||||
if (!auraSpellInfo || auraSpellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
|
||||
return false;
|
||||
|
||||
// these spells pierce all available spells (Resurrection Sickness for example)
|
||||
if (HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
|
||||
if (HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
|
||||
return true;
|
||||
|
||||
// these spells (Cyclone for example) can pierce all...
|
||||
@@ -1593,11 +1593,11 @@ bool SpellInfo::CanPierceImmuneAura(SpellInfo const* auraSpellInfo) const
|
||||
bool SpellInfo::CanDispelAura(SpellInfo const* auraSpellInfo) const
|
||||
{
|
||||
// These auras (like Divine Shield) can't be dispelled
|
||||
if (auraSpellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
|
||||
if (auraSpellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
|
||||
return false;
|
||||
|
||||
// These spells (like Mass Dispel) can dispel all auras
|
||||
if (HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
|
||||
if (HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
|
||||
return true;
|
||||
|
||||
// These auras (Cyclone for example) are not dispelable
|
||||
@@ -1708,7 +1708,7 @@ SpellCastResult SpellInfo::CheckShapeshift(uint32 form) const
|
||||
|
||||
if (actAsShifted)
|
||||
{
|
||||
if (HasAttribute(SPELL_ATTR0_NOT_SHAPESHIFT) || (shapeInfo && shapeInfo->GetFlags().HasFlag(SpellShapeshiftFormFlags::CanOnlyCastShapeshiftSpells))) // not while shapeshifted
|
||||
if (HasAttribute(SPELL_ATTR0_NOT_SHAPESHIFTED) || (shapeInfo && shapeInfo->GetFlags().HasFlag(SpellShapeshiftFormFlags::CanOnlyCastShapeshiftSpells))) // not while shapeshifted
|
||||
return SPELL_FAILED_NOT_SHAPESHIFT;
|
||||
else if (Stances != 0) // needs other shapeshift
|
||||
return SPELL_FAILED_ONLY_SHAPESHIFT;
|
||||
@@ -2098,7 +2098,7 @@ SpellCastResult SpellInfo::CheckVehicle(Unit const* caster) const
|
||||
if (!vehicleSeat)
|
||||
return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
|
||||
|
||||
if (!HasAttribute(SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE) && !HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_MOUNTED)
|
||||
if (!HasAttribute(SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE) && !HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED)
|
||||
&& (vehicleSeat->Flags & checkMask) != checkMask)
|
||||
return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
|
||||
|
||||
@@ -3254,7 +3254,7 @@ bool SpellInfo::SpellCancelsAuraEffect(SpellInfo const* auraSpellInfo, uint8 aur
|
||||
if (!HasAttribute(SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY))
|
||||
return false;
|
||||
|
||||
if (auraSpellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
|
||||
if (auraSpellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
|
||||
return false;
|
||||
|
||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||
@@ -3637,7 +3637,7 @@ int32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask, S
|
||||
|
||||
if (!caster->IsControlledByPlayer())
|
||||
{
|
||||
if (HasAttribute(SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION))
|
||||
if (HasAttribute(SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL))
|
||||
{
|
||||
GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.LookupEntry(SpellLevel - 1);
|
||||
GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.LookupEntry(caster->getLevel() - 1);
|
||||
@@ -3737,7 +3737,7 @@ SpellInfo const* SpellInfo::GetAuraRankForLevel(uint8 level) const
|
||||
return this;
|
||||
|
||||
// Client ignores spell with these attributes (sub_53D9D0)
|
||||
if (HasAttribute(SPELL_ATTR0_NEGATIVE_1) || HasAttribute(SPELL_ATTR2_UNK3))
|
||||
if (HasAttribute(SPELL_ATTR0_AURA_IS_DEBUFF) || HasAttribute(SPELL_ATTR2_UNK3))
|
||||
return this;
|
||||
|
||||
bool needRankSelection = false;
|
||||
@@ -3828,7 +3828,7 @@ void SpellInfo::_InitializeExplicitTargetMask()
|
||||
bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const
|
||||
{
|
||||
// not found a single positive spell with this attribute
|
||||
if (HasAttribute(SPELL_ATTR0_NEGATIVE_1))
|
||||
if (HasAttribute(SPELL_ATTR0_AURA_IS_DEBUFF))
|
||||
return false;
|
||||
|
||||
switch (SpellFamilyName)
|
||||
@@ -4013,7 +4013,7 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const
|
||||
if (Effects[effIndex].TargetA.GetTarget() != TARGET_UNIT_CASTER)
|
||||
return false;
|
||||
// but not this if this first effect (didn't find better check)
|
||||
if (HasAttribute(SPELL_ATTR0_NEGATIVE_1) && effIndex == 0)
|
||||
if (HasAttribute(SPELL_ATTR0_AURA_IS_DEBUFF) && effIndex == 0)
|
||||
return false;
|
||||
break;
|
||||
case SPELL_AURA_MECHANIC_IMMUNITY:
|
||||
|
||||
@@ -2404,7 +2404,7 @@ void SpellMgr::LoadSpellAreas()
|
||||
if (SpellInfo const* spellInfo = GetSpellInfo(spell))
|
||||
{
|
||||
if (spellArea.flags & SPELL_AREA_FLAG_AUTOCAST)
|
||||
const_cast<SpellInfo*>(spellInfo)->Attributes |= SPELL_ATTR0_CANT_CANCEL;
|
||||
const_cast<SpellInfo*>(spellInfo)->Attributes |= SPELL_ATTR0_NO_AURA_CANCEL;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2792,8 +2792,8 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
|
||||
[[fallthrough]];
|
||||
default:
|
||||
{
|
||||
// No value and not interrupt cast or crowd control without SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY flag
|
||||
if (!spellInfo->Effects[j].CalcValue() && !((spellInfo->Effects[j].Effect == SPELL_EFFECT_INTERRUPT_CAST || spellInfo->HasAttribute(SPELL_ATTR0_CU_AURA_CC)) && !spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)))
|
||||
// No value and not interrupt cast or crowd control without SPELL_ATTR0_NO_IMMUNITIES flag
|
||||
if (!spellInfo->Effects[j].CalcValue() && !((spellInfo->Effects[j].Effect == SPELL_EFFECT_INTERRUPT_CAST || spellInfo->HasAttribute(SPELL_ATTR0_CU_AURA_CC)) && !spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)))
|
||||
break;
|
||||
|
||||
// Sindragosa Frost Breath
|
||||
@@ -3258,7 +3258,7 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
ApplySpellFix({ 47569 }, [](SpellInfo* spellInfo)
|
||||
{
|
||||
// with this spell atrribute aura can be stacked several times
|
||||
spellInfo->Attributes &= ~SPELL_ATTR0_NOT_SHAPESHIFT;
|
||||
spellInfo->Attributes &= ~SPELL_ATTR0_NOT_SHAPESHIFTED;
|
||||
});
|
||||
|
||||
// Hymn of Hope
|
||||
@@ -4044,7 +4044,7 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
{
|
||||
spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd
|
||||
spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd
|
||||
spellInfo->Attributes |= SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY;
|
||||
spellInfo->Attributes |= SPELL_ATTR0_NO_IMMUNITIES;
|
||||
});
|
||||
|
||||
// Raging Spirit Visual
|
||||
@@ -4237,7 +4237,7 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
// Introspection
|
||||
ApplySpellFix({ 40055, 40165, 40166, 40167 }, [](SpellInfo* spellInfo)
|
||||
{
|
||||
spellInfo->Attributes |= SPELL_ATTR0_NEGATIVE_1;
|
||||
spellInfo->Attributes |= SPELL_ATTR0_AURA_IS_DEBUFF;
|
||||
});
|
||||
|
||||
// Minor Fortitude
|
||||
@@ -4909,7 +4909,7 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
// Torment
|
||||
ApplySpellFix({ 99256, 100230, 100231, 100232 }, [](SpellInfo* spellInfo)
|
||||
{
|
||||
spellInfo->Attributes |= SPELL_ATTR0_NEGATIVE_1;
|
||||
spellInfo->Attributes |= SPELL_ATTR0_AURA_IS_DEBUFF;
|
||||
});
|
||||
|
||||
// Summon Fragment of Rhyolith
|
||||
|
||||
Reference in new issue
Block a user