diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 34f3ce4e4e..1e30ea9366 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -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; diff --git a/src/server/game/AI/PlayerAI/PlayerAI.cpp b/src/server/game/AI/PlayerAI/PlayerAI.cpp index fa1f398a8e..d4aa7e7e68 100644 --- a/src/server/game/AI/PlayerAI/PlayerAI.cpp +++ b/src/server/game/AI/PlayerAI/PlayerAI.cpp @@ -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; diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 7f1a8880d4..6da9d31a5a 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -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); }); } diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index cf36c66b34..3885597fcd 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -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) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 665dd4255e..c8684118a7 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -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); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6da95d16de..bdc25c16ad 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -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, OptionalId) > 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]); } diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index c725c681a3..73d0b951ca 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -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; } diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index e6e43f1830..52b30a1036 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -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(); diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 5dc19288aa..96ce832fd0 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -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); } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 28f8d1d157..848f908ba8 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -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. diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index dc39180238..cac4c41d67 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -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(CalculatePct(target->GetMaxHealth(), healthPct), (zeroHealth ? 0 : 1))); } diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 37f6796cd5..55bb49028b 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -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; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index d357df4b90..e043b0d7ef 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -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 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(gcd, MIN_GCD, MAX_GCD); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 7bebfd6321..4482658748 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -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: diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index ccb5184211..56b599a262 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2404,7 +2404,7 @@ void SpellMgr::LoadSpellAreas() if (SpellInfo const* spellInfo = GetSpellInfo(spell)) { if (spellArea.flags & SPELL_AREA_FLAG_AUTOCAST) - const_cast(spellInfo)->Attributes |= SPELL_ATTR0_CANT_CANCEL; + const_cast(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