diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-04-24 18:40:10 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-04-24 18:40:10 +0200 |
commit | a31e6819447626cd7b6967665001ea89bf6a0298 (patch) | |
tree | 990b29701465f18e7141cfe091d5d31d2664a469 /src | |
parent | 51299ab88620a56bd3c7f3e38a9b28844252aae7 (diff) |
Core/Spells: Rename SpellAttr0 to use official attribute names
Diffstat (limited to 'src')
20 files changed, 212 insertions, 206 deletions
diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 8647a1d43b5..416804aaf64 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -187,7 +187,7 @@ void UnitAI::FillAISpellInfo() { AISpellInfoType* AIInfo = &AISpellInfo[{ spellInfo->Id, spellInfo->Difficulty }]; - 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 8fe52f0226c..217d12fc2e0 100644 --- a/src/server/game/AI/PlayerAI/PlayerAI.cpp +++ b/src/server/game/AI/PlayerAI/PlayerAI.cpp @@ -652,7 +652,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 00bb9245c19..a00d39ccba0 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -500,7 +500,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/HyperlinkTags.cpp b/src/server/game/Chat/HyperlinkTags.cpp index 83c037d23cc..49965411986 100644 --- a/src/server/game/Chat/HyperlinkTags.cpp +++ b/src/server/game/Chat/HyperlinkTags.cpp @@ -162,7 +162,7 @@ bool Trinity::Hyperlinks::LinkTags::enchant::StoreTo(SpellInfo const*& val, std: uint32 spellId; if (!(t.TryConsumeTo(spellId) && t.IsEmpty())) return false; - return !!(val = sSpellMgr->GetSpellInfo(spellId, DIFFICULTY_NONE)) && val->HasAttribute(SPELL_ATTR0_TRADESPELL); + return !!(val = sSpellMgr->GetSpellInfo(spellId, DIFFICULTY_NONE)) && val->HasAttribute(SPELL_ATTR0_IS_TRADESKILL); } bool Trinity::Hyperlinks::LinkTags::garrfollower::StoreTo(GarrisonFollowerLinkData& val, std::string_view text) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 59b82508f79..e8ada623675 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2361,10 +2361,10 @@ void WorldObject::ModSpellCastTime(SpellInfo const* spellInfo, int32& castTime, if (!unitCaster) return; - 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 = unitCaster->CanInstantCast() ? 0 : int32(float(castTime) * unitCaster->m_unitData->ModCastingSpeed); - 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) * unitCaster->m_modAttackSpeedPct[RANGED_ATTACK]); else if (IsPartOfSkillLine(SKILL_COOKING, spellInfo->Id) && unitCaster->HasAura(67556)) // cooking with Chef Hat. castTime = 500; @@ -2386,10 +2386,10 @@ void WorldObject::ModSpellDurationTime(SpellInfo const* spellInfo, int32& durati if (!unitCaster) return; - 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) * unitCaster->m_unitData->ModCastingSpeed); - 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) * unitCaster->m_modAttackSpeedPct[RANGED_ATTACK]); } @@ -3142,7 +3142,7 @@ bool WorldObject::IsValidAssistTarget(WorldObject const* target, SpellInfo const Unit* WorldObject::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); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 7c7af68751d..a19f835c649 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6188,8 +6188,8 @@ void Player::CheckAreaExploreAndOutdoor() if (IsInFlight()) return; - if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && !IsOutdoors()) - RemoveAurasWithAttribute(SPELL_ATTR0_OUTDOORS_ONLY); + if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK)) + RemoveAurasWithAttribute(IsOutdoors() ? SPELL_ATTR0_ONLY_INDOORS : SPELL_ATTR0_ONLY_OUTDOORS); uint32 const areaId = GetAreaId(); if (!areaId) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1b780a027be..30577190507 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -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_IMPOSSIBLE_DODGE_PARRY_BLOCK) || spellProto->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT))) + if (spellProto && (spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE) || spellProto->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT))) return false; // Can't block when casting/controlled @@ -2405,7 +2405,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_NO_ATTACK_DODGE); @@ -7146,7 +7146,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)) @@ -7184,7 +7184,7 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo, WorldObject const* caste 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) @@ -7277,7 +7277,7 @@ bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, SpellEffectInfo co if (!spellInfo) 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. @@ -8337,7 +8337,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); @@ -8572,7 +8572,7 @@ bool Unit::IsInDisallowedMountForm() const bool Unit::IsDisallowedMountForm(uint32 spellId, ShapeshiftForm form, uint32 displayId) const { if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID())) - if (transformSpellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_MOUNTED)) + if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED)) return false; if (form) diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h index 161c38161bc..7eeb58b540b 100644 --- a/src/server/game/Entities/Unit/UnitDefines.h +++ b/src/server/game/Entities/Unit/UnitDefines.h @@ -161,9 +161,9 @@ enum UnitFlags : uint32 UNIT_FLAG_SILENCED | UNIT_FLAG_NON_ATTACKABLE_2 | UNIT_FLAG_PACIFIED | UNIT_FLAG_STUNNED | UNIT_FLAG_IN_COMBAT | UNIT_FLAG_ON_TAXI | UNIT_FLAG_DISARMED | UNIT_FLAG_CONFUSED | UNIT_FLAG_FLEEING | UNIT_FLAG_POSSESSED | UNIT_FLAG_SKINNABLE | UNIT_FLAG_MOUNT | UNIT_FLAG_UNK_28 | - UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT | UNIT_FLAG_SHEATHE | UNIT_FLAG_IMMUNE), + UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT | UNIT_FLAG_SHEATHE | UNIT_FLAG_IMMUNE), // SKIP - UNIT_FLAG_ALLOWED = (0xFFFFFFFF & ~UNIT_FLAG_DISALLOWED) + UNIT_FLAG_ALLOWED = (0xFFFFFFFF & ~UNIT_FLAG_DISALLOWED) // SKIP }; DEFINE_ENUM_FLAG(UnitFlags); @@ -213,9 +213,9 @@ enum UnitFlags2 : uint32 /* UNIT_FLAG2_PLAY_DEATH_ANIM | */ UNIT_FLAG2_ALLOW_CHEAT_SPELLS | UNIT_FLAG2_SUPPRESS_HIGHLIGHT_WHEN_TARGETED_OR_MOUSED_OVER | UNIT_FLAG2_TREAT_AS_RAID_UNIT_FOR_HELPFUL_SPELLS | UNIT_FLAG2_LARGE_AOI | UNIT_FLAG2_GIGANTIC_AOI | UNIT_FLAG2_NO_ACTIONS | UNIT_FLAG2_AI_WILL_ONLY_SWIM_IF_TARGET_SWIMS | UNIT_FLAG2_DONT_GENERATE_COMBAT_LOG_WHEN_ENGAGED_WITH_NPCS | UNIT_FLAG2_UNTARGETABLE_BY_CLIENT | UNIT_FLAG2_ATTACKER_IGNORES_MINIMUM_RANGES | - UNIT_FLAG2_UNINTERACTIBLE_IF_HOSTILE | UNIT_FLAG2_UNUSED_11 | UNIT_FLAG2_INFINITE_AOI | UNIT_FLAG2_UNUSED_13), + UNIT_FLAG2_UNINTERACTIBLE_IF_HOSTILE | UNIT_FLAG2_UNUSED_11 | UNIT_FLAG2_INFINITE_AOI | UNIT_FLAG2_UNUSED_13), // SKIP - UNIT_FLAG2_ALLOWED = (0xFFFFFFFF & ~UNIT_FLAG2_DISALLOWED) + UNIT_FLAG2_ALLOWED = (0xFFFFFFFF & ~UNIT_FLAG2_DISALLOWED) // SKIP }; DEFINE_ENUM_FLAG(UnitFlags2); @@ -226,8 +226,8 @@ enum UnitFlags3 : uint32 { UNIT_FLAG3_UNK1 = 0x00000001, - UNIT_FLAG3_DISALLOWED = 0xFFFFFFFF, - UNIT_FLAG3_ALLOWED = (0xFFFFFFFF & ~UNIT_FLAG3_DISALLOWED) + UNIT_FLAG3_DISALLOWED = 0xFFFFFFFF, // SKIP + UNIT_FLAG3_ALLOWED = (0xFFFFFFFF & ~UNIT_FLAG3_DISALLOWED) // SKIP }; DEFINE_ENUM_FLAG(UnitFlags3); diff --git a/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp b/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp index 1520ded89a5..90a130308a0 100644 --- a/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp +++ b/src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp @@ -189,13 +189,15 @@ TC_API_EXPORT EnumText EnumUtils<UnitFlags2>::ToString(UnitFlags2 value) case UNIT_FLAG2_UNTARGETABLE_BY_CLIENT: return { "UNIT_FLAG2_UNTARGETABLE_BY_CLIENT", "Untargetable By Client", "" }; case UNIT_FLAG2_ATTACKER_IGNORES_MINIMUM_RANGES: return { "UNIT_FLAG2_ATTACKER_IGNORES_MINIMUM_RANGES", "Attacker Ignores Minimum Ranges", "" }; case UNIT_FLAG2_UNINTERACTIBLE_IF_HOSTILE: return { "UNIT_FLAG2_UNINTERACTIBLE_IF_HOSTILE", "Uninteractible If Hostile", "" }; + case UNIT_FLAG2_UNUSED_11: return { "UNIT_FLAG2_UNUSED_11", "UNIT_FLAG2_UNUSED_11", "" }; case UNIT_FLAG2_INFINITE_AOI: return { "UNIT_FLAG2_INFINITE_AOI", "Infinite (AOI)", "" }; + case UNIT_FLAG2_UNUSED_13: return { "UNIT_FLAG2_UNUSED_13", "UNIT_FLAG2_UNUSED_13", "" }; default: throw std::out_of_range("value"); } } template <> -TC_API_EXPORT size_t EnumUtils<UnitFlags2>::Count() { return 30; } +TC_API_EXPORT size_t EnumUtils<UnitFlags2>::Count() { return 32; } template <> TC_API_EXPORT UnitFlags2 EnumUtils<UnitFlags2>::FromIndex(size_t index) @@ -231,7 +233,9 @@ TC_API_EXPORT UnitFlags2 EnumUtils<UnitFlags2>::FromIndex(size_t index) case 26: return UNIT_FLAG2_UNTARGETABLE_BY_CLIENT; case 27: return UNIT_FLAG2_ATTACKER_IGNORES_MINIMUM_RANGES; case 28: return UNIT_FLAG2_UNINTERACTIBLE_IF_HOSTILE; - case 29: return UNIT_FLAG2_INFINITE_AOI; + case 29: return UNIT_FLAG2_UNUSED_11; + case 30: return UNIT_FLAG2_INFINITE_AOI; + case 31: return UNIT_FLAG2_UNUSED_13; default: throw std::out_of_range("index"); } } @@ -270,7 +274,9 @@ TC_API_EXPORT size_t EnumUtils<UnitFlags2>::ToIndex(UnitFlags2 value) case UNIT_FLAG2_UNTARGETABLE_BY_CLIENT: return 26; case UNIT_FLAG2_ATTACKER_IGNORES_MINIMUM_RANGES: return 27; case UNIT_FLAG2_UNINTERACTIBLE_IF_HOSTILE: return 28; - case UNIT_FLAG2_INFINITE_AOI: return 29; + case UNIT_FLAG2_UNUSED_11: return 29; + case UNIT_FLAG2_INFINITE_AOI: return 30; + case UNIT_FLAG2_UNUSED_13: return 31; default: throw std::out_of_range("value"); } } diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 3af6e4125c9..cbd2a6bfab9 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -89,7 +89,7 @@ void WorldSession::HandlePetAction(WorldPackets::Pet::PetAction& packet) SpellInfo const* spell = (flag == ACT_ENABLED || flag == ACT_PASSIVE) ? sSpellMgr->GetSpellInfo(spellid, pet->GetMap()->GetDifficultyID()) : 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 daa1cda6c88..1de96660fc5 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -380,7 +380,7 @@ void WorldSession::HandleCancelAuraOpcode(WorldPackets::Spells::CancelAura& canc return; // not allow remove spells with attr SPELL_ATTR0_CANT_CANCEL - if (spellInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL)) + if (spellInfo->HasAttribute(SPELL_ATTR0_NO_AURA_CANCEL)) return; // channeled spell case (it currently cast then) @@ -437,7 +437,7 @@ void WorldSession::HandleCancelGrowthAuraOpcode(WorldPackets::Spells::CancelGrow _player->RemoveAurasByType(SPELL_AURA_MOD_SCALE, [](AuraApplication const* aurApp) { SpellInfo const* spellInfo = aurApp->GetBase()->GetSpellInfo(); - return !spellInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL) && spellInfo->IsPositive() && !spellInfo->IsPassive(); + return !spellInfo->HasAttribute(SPELL_ATTR0_NO_AURA_CANCEL) && spellInfo->IsPositive() && !spellInfo->IsPassive(); }); } @@ -446,7 +446,7 @@ void WorldSession::HandleCancelMountAuraOpcode(WorldPackets::Spells::CancelMount _player->RemoveAurasByType(SPELL_AURA_MOUNTED, [](AuraApplication const* aurApp) { SpellInfo const* spellInfo = aurApp->GetBase()->GetSpellInfo(); - return !spellInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL) && spellInfo->IsPositive() && !spellInfo->IsPassive(); + return !spellInfo->HasAttribute(SPELL_ATTR0_NO_AURA_CANCEL) && spellInfo->IsPositive() && !spellInfo->IsPassive(); }); } @@ -469,7 +469,7 @@ void WorldSession::HandleCancelChanneling(WorldPackets::Spells::CancelChannellin return; // not allow remove spells with attr SPELL_ATTR0_CANT_CANCEL - if (spellInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL)) + if (spellInfo->HasAttribute(SPELL_ATTR0_NO_AURA_CANCEL)) return; Spell* spell = mover->GetCurrentSpell(CURRENT_CHANNELED_SPELL); diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index c5faff0305b..9247d2efdc6 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -1104,7 +1104,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(spellInfo->Id, "Spell", spellInfo->Id); } else diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 06f16134272..9f02b54393c 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -404,38 +404,38 @@ uint32 constexpr QuestDifficultyColors[MAX_QUEST_DIFFICULTY] = // EnumUtils: DESCRIBE THIS enum SpellAttr0 : uint32 { - SPELL_ATTR0_UNK0 = 0x00000001, // TITLE Unknown attribute 0@Attr0 - SPELL_ATTR0_REQ_AMMO = 0x00000002, // TITLE Treat as ranged attack DESCRIPTION Use ammo, ranged attack range modifiers, ranged haste, etc. - SPELL_ATTR0_ON_NEXT_SWING = 0x00000004, // TITLE On next melee (type 1) DESCRIPTION Both "on next swing" attributes have identical handling in server & client - SPELL_ATTR0_IS_REPLENISHMENT = 0x00000008, // TITLE Replenishment (client only) - SPELL_ATTR0_ABILITY = 0x00000010, // TITLE Treat as ability DESCRIPTION Cannot be reflected, not affected by cast speed modifiers, etc. - SPELL_ATTR0_TRADESPELL = 0x00000020, // TITLE Trade skill recipe DESCRIPTION Displayed in recipe list, not affected by cast speed modifiers - SPELL_ATTR0_PASSIVE = 0x00000040, // TITLE Passive spell DESCRIPTION Spell is automatically cast on self by core - SPELL_ATTR0_HIDDEN_CLIENTSIDE = 0x00000080, // TITLE Hidden in UI (client only) DESCRIPTION Not visible in spellbook or aura bar - SPELL_ATTR0_HIDE_IN_COMBAT_LOG = 0x00000100, // TITLE Hidden in combat log (client only) DESCRIPTION Spell will not appear in combat logs - SPELL_ATTR0_TARGET_MAINHAND_ITEM = 0x00000200, // TITLE Auto-target mainhand item (client only) DESCRIPTION Client will automatically select main-hand item as cast target - SPELL_ATTR0_ON_NEXT_SWING_2 = 0x00000400, // TITLE On next melee (type 2) DESCRIPTION Both "on next swing" attributes have identical handling in server & client - SPELL_ATTR0_UNK11 = 0x00000800, // TITLE Unknown attribute 11@Attr0 - SPELL_ATTR0_DAYTIME_ONLY = 0x00001000, // TITLE Only usable during daytime (unused) - SPELL_ATTR0_NIGHT_ONLY = 0x00002000, // TITLE Only usable during nighttime (unused) - SPELL_ATTR0_INDOORS_ONLY = 0x00004000, // TITLE Only usable indoors - SPELL_ATTR0_OUTDOORS_ONLY = 0x00008000, // TITLE Only usable outdoors - SPELL_ATTR0_NOT_SHAPESHIFT = 0x00010000, // TITLE Not usable while shapeshifted - SPELL_ATTR0_ONLY_STEALTHED = 0x00020000, // TITLE Only usable in stealth - SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE = 0x00040000, // TITLE Don't shealthe weapons (client only) - SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION = 0x00080000, // TITLE Scale with caster level DESCRIPTION For non-player casts, scale impact and power cost with caster's level - SPELL_ATTR0_STOP_ATTACK_TARGET = 0x00100000, // TITLE Stop attacking after cast DESCRIPTION After casting this, the current auto-attack will be interrupted - SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK = 0x00200000, // TITLE Prevent physical avoidance DESCRIPTION Spell cannot be dodged, parried or blocked - SPELL_ATTR0_CAST_TRACK_TARGET = 0x00400000, // TITLE Automatically face target during cast (client only) - SPELL_ATTR0_CASTABLE_WHILE_DEAD = 0x00800000, // TITLE Can be cast while dead DESCRIPTION Spells without this flag cannot be cast by dead units in non-triggered contexts - SPELL_ATTR0_CASTABLE_WHILE_MOUNTED = 0x01000000, // TITLE Can be cast while mounted - SPELL_ATTR0_DISABLED_WHILE_ACTIVE = 0x02000000, // TITLE Cooldown starts on expiry DESCRIPTION Spell is unusable while already active, and cooldown does not begin until the effects have worn off - SPELL_ATTR0_NEGATIVE_1 = 0x04000000, // TITLE Is negative spell DESCRIPTION Forces the spell to be treated as a negative spell - SPELL_ATTR0_CASTABLE_WHILE_SITTING = 0x08000000, // TITLE Can be cast while sitting - SPELL_ATTR0_CANT_USED_IN_COMBAT = 0x10000000, // TITLE Cannot be used in combat - SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY = 0x20000000, // TITLE Pierce invulnerability DESCRIPTION Allows spell to pierce invulnerability, unless the invulnerability spell also has this attribute - SPELL_ATTR0_HEARTBEAT_RESIST_CHECK = 0x40000000, // TITLE Periodic resistance checks DESCRIPTION Periodically re-rolls against resistance to potentially expire aura early - SPELL_ATTR0_CANT_CANCEL = 0x80000000 // TITLE Aura cannot be cancelled DESCRIPTION Prevents the player from voluntarily canceling a positive aura + SPELL_ATTR0_PROC_FAILURE_BURNS_CHARGE = 0x00000001, /*NYI*/ // 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) + SPELL_ATTR0_IS_ABILITY = 0x00000010, // TITLE Is Ability DESCRIPTION Cannot be reflected, not affected by cast speed modifiers, etc. + SPELL_ATTR0_IS_TRADESKILL = 0x00000020, // TITLE Is Tradeskill DESCRIPTION Displayed in recipe list, not affected by cast speed modifiers + SPELL_ATTR0_PASSIVE = 0x00000040, // TITLE Passive DESCRIPTION Spell is automatically cast on self by core + SPELL_ATTR0_DO_NOT_DISPLAY_SPELLBOOK_AURA_ICON_COMBAT_LOG = 0x00000080, // TITLE Do Not Display (Spellbook, Aura Icon, Combat Log) (client only) DESCRIPTION Not visible in spellbook or aura bar + SPELL_ATTR0_DO_NOT_LOG = 0x00000100, // TITLE Do Not Log (client only) DESCRIPTION Spell will not appear in combat logs + SPELL_ATTR0_HELD_ITEM_ONLY = 0x00000200, // TITLE Held Item Only (client only) DESCRIPTION Client will automatically select main-hand item as cast target + SPELL_ATTR0_ON_NEXT_SWING = 0x00000400, // TITLE On Next Swing DESCRIPTION Both "on next swing" attributes have identical handling in server & client + SPELL_ATTR0_WEARER_CASTS_PROC_TRIGGER = 0x00000800, /*NYI*/ // TITLE Wearer Casts Proc Trigger + SPELL_ATTR0_SERVER_ONLY = 0x00001000, // TITLE Server Only + SPELL_ATTR0_ALLOW_ITEM_SPELL_IN_PVP = 0x00002000, // TITLE Allow Item Spell In PvP + SPELL_ATTR0_ONLY_INDOORS = 0x00004000, // TITLE Only Indoors + SPELL_ATTR0_ONLY_OUTDOORS = 0x00008000, // TITLE Only Outdoors + SPELL_ATTR0_NOT_SHAPESHIFTED = 0x00010000, // TITLE Not Shapeshifted + SPELL_ATTR0_ONLY_STEALTHED = 0x00020000, // TITLE Only Stealthed + SPELL_ATTR0_DO_NOT_SHEATH = 0x00040000, // TITLE Do Not Sheath (client only) + SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL = 0x00080000, // TITLE 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, // TITLE Cancels Auto Attack Combat DESCRIPTION After casting this, the current auto-attack will be interrupted + SPELL_ATTR0_NO_ACTIVE_DEFENSE = 0x00200000, // TITLE No Active Defense DESCRIPTION Spell cannot be dodged, parried or blocked + SPELL_ATTR0_TRACK_TARGET_IN_CAST_PLAYER_ONLY = 0x00400000, // TITLE Track Target in Cast (Player Only) (client only) + SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD = 0x00800000, // TITLE 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, // TITLE Allow While Mounted + SPELL_ATTR0_COOLDOWN_ON_EVENT = 0x02000000, // TITLE 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, // TITLE Aura Is Debuff DESCRIPTION Forces the spell to be treated as a negative spell + SPELL_ATTR0_ALLOW_WHILE_SITTING = 0x08000000, // TITLE Allow While Sitting + SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL = 0x10000000, // TITLE Not In Combat (Only Peaceful) + SPELL_ATTR0_NO_IMMUNITIES = 0x20000000, // TITLE No Immunities DESCRIPTION Allows spell to pierce invulnerability, unless the invulnerability spell also has this attribute + SPELL_ATTR0_HEARTBEAT_RESIST = 0x40000000, // TITLE Heartbeat Resist DESCRIPTION Periodically re-rolls against resistance to potentially expire aura early + SPELL_ATTR0_NO_AURA_CANCEL = 0x80000000 // TITLE No Aura Cancel DESCRIPTION Prevents the player from voluntarily canceling a positive aura }; // EnumUtils: DESCRIBE THIS diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp index 4fa916a49f0..eb95f10bf93 100644 --- a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp +++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp @@ -247,38 +247,38 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr0>::ToString(SpellAttr0 value) { switch (value) { - case SPELL_ATTR0_UNK0: return { "SPELL_ATTR0_UNK0", "Unknown attribute 0@Attr0", "" }; - case SPELL_ATTR0_REQ_AMMO: return { "SPELL_ATTR0_REQ_AMMO", "Treat as ranged attack", "Use ammo, ranged attack range modifiers, ranged haste, etc." }; - case SPELL_ATTR0_ON_NEXT_SWING: return { "SPELL_ATTR0_ON_NEXT_SWING", "On next melee (type 1)", "Both \042on next swing\042 attributes have identical handling in server & client" }; - case SPELL_ATTR0_IS_REPLENISHMENT: return { "SPELL_ATTR0_IS_REPLENISHMENT", "Replenishment (client only)", "" }; - case SPELL_ATTR0_ABILITY: return { "SPELL_ATTR0_ABILITY", "Treat as ability", "Cannot be reflected, not affected by cast speed modifiers, etc." }; - case SPELL_ATTR0_TRADESPELL: return { "SPELL_ATTR0_TRADESPELL", "Trade skill recipe", "Displayed in recipe list, not affected by cast speed modifiers" }; - case SPELL_ATTR0_PASSIVE: return { "SPELL_ATTR0_PASSIVE", "Passive spell", "Spell is automatically cast on self by core" }; - case SPELL_ATTR0_HIDDEN_CLIENTSIDE: return { "SPELL_ATTR0_HIDDEN_CLIENTSIDE", "Hidden in UI (client only)", "Not visible in spellbook or aura bar" }; - case SPELL_ATTR0_HIDE_IN_COMBAT_LOG: return { "SPELL_ATTR0_HIDE_IN_COMBAT_LOG", "Hidden in combat log (client only)", "Spell will not appear in combat logs" }; - case SPELL_ATTR0_TARGET_MAINHAND_ITEM: return { "SPELL_ATTR0_TARGET_MAINHAND_ITEM", "Auto-target mainhand item (client only)", "Client will automatically select main-hand item as cast target" }; - case SPELL_ATTR0_ON_NEXT_SWING_2: return { "SPELL_ATTR0_ON_NEXT_SWING_2", "On next melee (type 2)", "Both \042on next swing\042 attributes have identical handling in server & client" }; - case SPELL_ATTR0_UNK11: return { "SPELL_ATTR0_UNK11", "Unknown attribute 11@Attr0", "" }; - case SPELL_ATTR0_DAYTIME_ONLY: return { "SPELL_ATTR0_DAYTIME_ONLY", "Only usable during daytime (unused)", "" }; - case SPELL_ATTR0_NIGHT_ONLY: return { "SPELL_ATTR0_NIGHT_ONLY", "Only usable during nighttime (unused)", "" }; - case SPELL_ATTR0_INDOORS_ONLY: return { "SPELL_ATTR0_INDOORS_ONLY", "Only usable indoors", "" }; - case SPELL_ATTR0_OUTDOORS_ONLY: return { "SPELL_ATTR0_OUTDOORS_ONLY", "Only usable outdoors", "" }; - case SPELL_ATTR0_NOT_SHAPESHIFT: return { "SPELL_ATTR0_NOT_SHAPESHIFT", "Not usable while shapeshifted", "" }; - case SPELL_ATTR0_ONLY_STEALTHED: return { "SPELL_ATTR0_ONLY_STEALTHED", "Only usable in stealth", "" }; - case SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE: return { "SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE", "Don't shealthe weapons (client only)", "" }; - case SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION: return { "SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION", "Scale with caster level", "For non-player casts, scale impact and power cost with caster's level" }; - case SPELL_ATTR0_STOP_ATTACK_TARGET: return { "SPELL_ATTR0_STOP_ATTACK_TARGET", "Stop attacking after cast", "After casting this, the current auto-attack will be interrupted" }; - case SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK: return { "SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK", "Prevent physical avoidance", "Spell cannot be dodged, parried or blocked" }; - case SPELL_ATTR0_CAST_TRACK_TARGET: return { "SPELL_ATTR0_CAST_TRACK_TARGET", "Automatically face target during cast (client only)", "" }; - case SPELL_ATTR0_CASTABLE_WHILE_DEAD: return { "SPELL_ATTR0_CASTABLE_WHILE_DEAD", "Can be cast while dead", "Spells without this flag cannot be cast by dead units in non-triggered contexts" }; - case SPELL_ATTR0_CASTABLE_WHILE_MOUNTED: return { "SPELL_ATTR0_CASTABLE_WHILE_MOUNTED", "Can be cast while mounted", "" }; - case SPELL_ATTR0_DISABLED_WHILE_ACTIVE: return { "SPELL_ATTR0_DISABLED_WHILE_ACTIVE", "Cooldown starts on expiry", "Spell is unusable while already active, and cooldown does not begin until the effects have worn off" }; - case SPELL_ATTR0_NEGATIVE_1: return { "SPELL_ATTR0_NEGATIVE_1", "Is negative spell", "Forces the spell to be treated as a negative spell" }; - case SPELL_ATTR0_CASTABLE_WHILE_SITTING: return { "SPELL_ATTR0_CASTABLE_WHILE_SITTING", "Can be cast while sitting", "" }; - case SPELL_ATTR0_CANT_USED_IN_COMBAT: return { "SPELL_ATTR0_CANT_USED_IN_COMBAT", "Cannot be used in combat", "" }; - case SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY: return { "SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY", "Pierce invulnerability", "Allows spell to pierce invulnerability, unless the invulnerability spell also has this attribute" }; - case SPELL_ATTR0_HEARTBEAT_RESIST_CHECK: return { "SPELL_ATTR0_HEARTBEAT_RESIST_CHECK", "Periodic resistance checks", "Periodically re-rolls against resistance to potentially expire aura early" }; - case SPELL_ATTR0_CANT_CANCEL: return { "SPELL_ATTR0_CANT_CANCEL", "Aura cannot be cancelled", "Prevents the player from voluntarily canceling a positive aura" }; + case SPELL_ATTR0_PROC_FAILURE_BURNS_CHARGE: return { "SPELL_ATTR0_PROC_FAILURE_BURNS_CHARGE", "Proc Failure Burns Charge", "" }; + case SPELL_ATTR0_USES_RANGED_SLOT: return { "SPELL_ATTR0_USES_RANGED_SLOT", "Uses Ranged Slot", "Use ammo, ranged attack range modifiers, ranged haste, etc." }; + case SPELL_ATTR0_ON_NEXT_SWING_NO_DAMAGE: return { "SPELL_ATTR0_ON_NEXT_SWING_NO_DAMAGE", "On Next Swing (No Damage)", "Both \042on next swing\042 attributes have identical handling in server & client" }; + case SPELL_ATTR0_DO_NOT_LOG_IMMUNE_MISSES: return { "SPELL_ATTR0_DO_NOT_LOG_IMMUNE_MISSES", "Do Not Log Immune Misses (client only)", "" }; + case SPELL_ATTR0_IS_ABILITY: return { "SPELL_ATTR0_IS_ABILITY", "Is Ability", "Cannot be reflected, not affected by cast speed modifiers, etc." }; + case SPELL_ATTR0_IS_TRADESKILL: return { "SPELL_ATTR0_IS_TRADESKILL", "Is Tradeskill", "Displayed in recipe list, not affected by cast speed modifiers" }; + case SPELL_ATTR0_PASSIVE: return { "SPELL_ATTR0_PASSIVE", "Passive", "Spell is automatically cast on self by core" }; + case SPELL_ATTR0_DO_NOT_DISPLAY_SPELLBOOK_AURA_ICON_COMBAT_LOG: return { "SPELL_ATTR0_DO_NOT_DISPLAY_SPELLBOOK_AURA_ICON_COMBAT_LOG", "Do Not Display (Spellbook, Aura Icon, Combat Log) (client only)", "Not visible in spellbook or aura bar" }; + case SPELL_ATTR0_DO_NOT_LOG: return { "SPELL_ATTR0_DO_NOT_LOG", "Do Not Log (client only)", "Spell will not appear in combat logs" }; + case SPELL_ATTR0_HELD_ITEM_ONLY: return { "SPELL_ATTR0_HELD_ITEM_ONLY", "Held Item Only (client only)", "Client will automatically select main-hand item as cast target" }; + case SPELL_ATTR0_ON_NEXT_SWING: return { "SPELL_ATTR0_ON_NEXT_SWING", "On Next Swing", "Both \042on next swing\042 attributes have identical handling in server & client" }; + case SPELL_ATTR0_WEARER_CASTS_PROC_TRIGGER: return { "SPELL_ATTR0_WEARER_CASTS_PROC_TRIGGER", "Wearer Casts Proc Trigger", "" }; + case SPELL_ATTR0_SERVER_ONLY: return { "SPELL_ATTR0_SERVER_ONLY", "Server Only", "" }; + case SPELL_ATTR0_ALLOW_ITEM_SPELL_IN_PVP: return { "SPELL_ATTR0_ALLOW_ITEM_SPELL_IN_PVP", "Allow Item Spell In PvP", "" }; + case SPELL_ATTR0_ONLY_INDOORS: return { "SPELL_ATTR0_ONLY_INDOORS", "Only Indoors", "" }; + case SPELL_ATTR0_ONLY_OUTDOORS: return { "SPELL_ATTR0_ONLY_OUTDOORS", "Only Outdoors", "" }; + case SPELL_ATTR0_NOT_SHAPESHIFTED: return { "SPELL_ATTR0_NOT_SHAPESHIFTED", "Not Shapeshifted", "" }; + case SPELL_ATTR0_ONLY_STEALTHED: return { "SPELL_ATTR0_ONLY_STEALTHED", "Only Stealthed", "" }; + case SPELL_ATTR0_DO_NOT_SHEATH: return { "SPELL_ATTR0_DO_NOT_SHEATH", "Do Not Sheath (client only)", "" }; + case SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL: return { "SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL", "Scales w/ Creature Level", "For non-player casts, scale impact and power cost with caster's level" }; + case SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT: return { "SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT", "Cancels Auto Attack Combat", "After casting this, the current auto-attack will be interrupted" }; + case SPELL_ATTR0_NO_ACTIVE_DEFENSE: return { "SPELL_ATTR0_NO_ACTIVE_DEFENSE", "No Active Defense", "Spell cannot be dodged, parried or blocked" }; + case SPELL_ATTR0_TRACK_TARGET_IN_CAST_PLAYER_ONLY: return { "SPELL_ATTR0_TRACK_TARGET_IN_CAST_PLAYER_ONLY", "Track Target in Cast (Player Only) (client only)", "" }; + case SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD: return { "SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD", "Allow Cast While Dead", "Spells without this flag cannot be cast by dead units in non-triggered contexts" }; + case SPELL_ATTR0_ALLOW_WHILE_MOUNTED: return { "SPELL_ATTR0_ALLOW_WHILE_MOUNTED", "Allow While Mounted", "" }; + case SPELL_ATTR0_COOLDOWN_ON_EVENT: return { "SPELL_ATTR0_COOLDOWN_ON_EVENT", "Cooldown On Event", "Spell is unusable while already active, and cooldown does not begin until the effects have worn off" }; + case SPELL_ATTR0_AURA_IS_DEBUFF: return { "SPELL_ATTR0_AURA_IS_DEBUFF", "Aura Is Debuff", "Forces the spell to be treated as a negative spell" }; + case SPELL_ATTR0_ALLOW_WHILE_SITTING: return { "SPELL_ATTR0_ALLOW_WHILE_SITTING", "Allow While Sitting", "" }; + case SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL: return { "SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL", "Not In Combat (Only Peaceful)", "" }; + case SPELL_ATTR0_NO_IMMUNITIES: return { "SPELL_ATTR0_NO_IMMUNITIES", "No Immunities", "Allows spell to pierce invulnerability, unless the invulnerability spell also has this attribute" }; + case SPELL_ATTR0_HEARTBEAT_RESIST: return { "SPELL_ATTR0_HEARTBEAT_RESIST", "Heartbeat Resist", "Periodically re-rolls against resistance to potentially expire aura early" }; + case SPELL_ATTR0_NO_AURA_CANCEL: return { "SPELL_ATTR0_NO_AURA_CANCEL", "No Aura Cancel", "Prevents the player from voluntarily canceling a positive aura" }; default: throw std::out_of_range("value"); } } @@ -291,38 +291,38 @@ TC_API_EXPORT SpellAttr0 EnumUtils<SpellAttr0>::FromIndex(size_t index) { switch (index) { - case 0: return SPELL_ATTR0_UNK0; - case 1: return SPELL_ATTR0_REQ_AMMO; - case 2: return SPELL_ATTR0_ON_NEXT_SWING; - case 3: return SPELL_ATTR0_IS_REPLENISHMENT; - case 4: return SPELL_ATTR0_ABILITY; - case 5: return SPELL_ATTR0_TRADESPELL; + case 0: return SPELL_ATTR0_PROC_FAILURE_BURNS_CHARGE; + case 1: return SPELL_ATTR0_USES_RANGED_SLOT; + case 2: return SPELL_ATTR0_ON_NEXT_SWING_NO_DAMAGE; + case 3: return SPELL_ATTR0_DO_NOT_LOG_IMMUNE_MISSES; + case 4: return SPELL_ATTR0_IS_ABILITY; + case 5: return SPELL_ATTR0_IS_TRADESKILL; case 6: return SPELL_ATTR0_PASSIVE; - case 7: return SPELL_ATTR0_HIDDEN_CLIENTSIDE; - case 8: return SPELL_ATTR0_HIDE_IN_COMBAT_LOG; - case 9: return SPELL_ATTR0_TARGET_MAINHAND_ITEM; - case 10: return SPELL_ATTR0_ON_NEXT_SWING_2; - case 11: return SPELL_ATTR0_UNK11; - case 12: return SPELL_ATTR0_DAYTIME_ONLY; - case 13: return SPELL_ATTR0_NIGHT_ONLY; - case 14: return SPELL_ATTR0_INDOORS_ONLY; - case 15: return SPELL_ATTR0_OUTDOORS_ONLY; - case 16: return SPELL_ATTR0_NOT_SHAPESHIFT; + case 7: return SPELL_ATTR0_DO_NOT_DISPLAY_SPELLBOOK_AURA_ICON_COMBAT_LOG; + case 8: return SPELL_ATTR0_DO_NOT_LOG; + case 9: return SPELL_ATTR0_HELD_ITEM_ONLY; + case 10: return SPELL_ATTR0_ON_NEXT_SWING; + case 11: return SPELL_ATTR0_WEARER_CASTS_PROC_TRIGGER; + case 12: return SPELL_ATTR0_SERVER_ONLY; + case 13: return SPELL_ATTR0_ALLOW_ITEM_SPELL_IN_PVP; + case 14: return SPELL_ATTR0_ONLY_INDOORS; + case 15: return SPELL_ATTR0_ONLY_OUTDOORS; + case 16: return SPELL_ATTR0_NOT_SHAPESHIFTED; case 17: return SPELL_ATTR0_ONLY_STEALTHED; - case 18: return SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE; - case 19: return SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION; - case 20: return SPELL_ATTR0_STOP_ATTACK_TARGET; - case 21: return SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK; - case 22: return SPELL_ATTR0_CAST_TRACK_TARGET; - case 23: return SPELL_ATTR0_CASTABLE_WHILE_DEAD; - case 24: return SPELL_ATTR0_CASTABLE_WHILE_MOUNTED; - case 25: return SPELL_ATTR0_DISABLED_WHILE_ACTIVE; - case 26: return SPELL_ATTR0_NEGATIVE_1; - case 27: return SPELL_ATTR0_CASTABLE_WHILE_SITTING; - case 28: return SPELL_ATTR0_CANT_USED_IN_COMBAT; - case 29: return SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY; - case 30: return SPELL_ATTR0_HEARTBEAT_RESIST_CHECK; - case 31: return SPELL_ATTR0_CANT_CANCEL; + case 18: return SPELL_ATTR0_DO_NOT_SHEATH; + case 19: return SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL; + case 20: return SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT; + case 21: return SPELL_ATTR0_NO_ACTIVE_DEFENSE; + case 22: return SPELL_ATTR0_TRACK_TARGET_IN_CAST_PLAYER_ONLY; + case 23: return SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD; + case 24: return SPELL_ATTR0_ALLOW_WHILE_MOUNTED; + case 25: return SPELL_ATTR0_COOLDOWN_ON_EVENT; + case 26: return SPELL_ATTR0_AURA_IS_DEBUFF; + case 27: return SPELL_ATTR0_ALLOW_WHILE_SITTING; + case 28: return SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL; + case 29: return SPELL_ATTR0_NO_IMMUNITIES; + case 30: return SPELL_ATTR0_HEARTBEAT_RESIST; + case 31: return SPELL_ATTR0_NO_AURA_CANCEL; default: throw std::out_of_range("index"); } } @@ -332,38 +332,38 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr0>::ToIndex(SpellAttr0 value) { switch (value) { - case SPELL_ATTR0_UNK0: return 0; - case SPELL_ATTR0_REQ_AMMO: return 1; - case SPELL_ATTR0_ON_NEXT_SWING: return 2; - case SPELL_ATTR0_IS_REPLENISHMENT: return 3; - case SPELL_ATTR0_ABILITY: return 4; - case SPELL_ATTR0_TRADESPELL: return 5; + case SPELL_ATTR0_PROC_FAILURE_BURNS_CHARGE: return 0; + case SPELL_ATTR0_USES_RANGED_SLOT: return 1; + case SPELL_ATTR0_ON_NEXT_SWING_NO_DAMAGE: return 2; + case SPELL_ATTR0_DO_NOT_LOG_IMMUNE_MISSES: return 3; + case SPELL_ATTR0_IS_ABILITY: return 4; + case SPELL_ATTR0_IS_TRADESKILL: return 5; case SPELL_ATTR0_PASSIVE: return 6; - case SPELL_ATTR0_HIDDEN_CLIENTSIDE: return 7; - case SPELL_ATTR0_HIDE_IN_COMBAT_LOG: return 8; - case SPELL_ATTR0_TARGET_MAINHAND_ITEM: return 9; - case SPELL_ATTR0_ON_NEXT_SWING_2: return 10; - case SPELL_ATTR0_UNK11: return 11; - case SPELL_ATTR0_DAYTIME_ONLY: return 12; - case SPELL_ATTR0_NIGHT_ONLY: return 13; - case SPELL_ATTR0_INDOORS_ONLY: return 14; - case SPELL_ATTR0_OUTDOORS_ONLY: return 15; - case SPELL_ATTR0_NOT_SHAPESHIFT: return 16; + case SPELL_ATTR0_DO_NOT_DISPLAY_SPELLBOOK_AURA_ICON_COMBAT_LOG: return 7; + case SPELL_ATTR0_DO_NOT_LOG: return 8; + case SPELL_ATTR0_HELD_ITEM_ONLY: return 9; + case SPELL_ATTR0_ON_NEXT_SWING: return 10; + case SPELL_ATTR0_WEARER_CASTS_PROC_TRIGGER: return 11; + case SPELL_ATTR0_SERVER_ONLY: return 12; + case SPELL_ATTR0_ALLOW_ITEM_SPELL_IN_PVP: return 13; + case SPELL_ATTR0_ONLY_INDOORS: return 14; + case SPELL_ATTR0_ONLY_OUTDOORS: return 15; + case SPELL_ATTR0_NOT_SHAPESHIFTED: return 16; case SPELL_ATTR0_ONLY_STEALTHED: return 17; - case SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE: return 18; - case SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION: return 19; - case SPELL_ATTR0_STOP_ATTACK_TARGET: return 20; - case SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK: return 21; - case SPELL_ATTR0_CAST_TRACK_TARGET: return 22; - case SPELL_ATTR0_CASTABLE_WHILE_DEAD: return 23; - case SPELL_ATTR0_CASTABLE_WHILE_MOUNTED: return 24; - case SPELL_ATTR0_DISABLED_WHILE_ACTIVE: return 25; - case SPELL_ATTR0_NEGATIVE_1: return 26; - case SPELL_ATTR0_CASTABLE_WHILE_SITTING: return 27; - case SPELL_ATTR0_CANT_USED_IN_COMBAT: return 28; - case SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY: return 29; - case SPELL_ATTR0_HEARTBEAT_RESIST_CHECK: return 30; - case SPELL_ATTR0_CANT_CANCEL: return 31; + case SPELL_ATTR0_DO_NOT_SHEATH: return 18; + case SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL: return 19; + case SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT: return 20; + case SPELL_ATTR0_NO_ACTIVE_DEFENSE: return 21; + case SPELL_ATTR0_TRACK_TARGET_IN_CAST_PLAYER_ONLY: return 22; + case SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD: return 23; + case SPELL_ATTR0_ALLOW_WHILE_MOUNTED: return 24; + case SPELL_ATTR0_COOLDOWN_ON_EVENT: return 25; + case SPELL_ATTR0_AURA_IS_DEBUFF: return 26; + case SPELL_ATTR0_ALLOW_WHILE_SITTING: return 27; + case SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL: return 28; + case SPELL_ATTR0_NO_IMMUNITIES: return 29; + case SPELL_ATTR0_HEARTBEAT_RESIST: return 30; + case SPELL_ATTR0_NO_AURA_CANCEL: return 31; default: throw std::out_of_range("value"); } } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index af2736b9061..43782937122 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1348,7 +1348,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const continue; SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first, DIFFICULTY_NONE); - 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->Stances & (UI64LIT(1) << (GetMiscValue() - 1))) @@ -3557,7 +3557,7 @@ void AuraEffect::HandleModTotalPercentStat(AuraApplication const* aurApp, uint8 // recalculate current HP/MP after applying aura modifications (only for spells with SPELL_ATTR0_ABILITY 0x00000010 flag) // this check is total bullshit i think - if ((GetMiscValueB() & 1 << STAT_STAMINA || !GetMiscValueB()) && (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY))) + if ((GetMiscValueB() & 1 << STAT_STAMINA || !GetMiscValueB()) && (m_spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY))) target->SetHealth(std::max<uint32>(CalculatePct(target->GetMaxHealth(), healthPct), (zeroHealth ? 0 : 1))); } diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index bad0f922967..98c849ccee6 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1115,7 +1115,7 @@ bool Aura::IsRemovedOnShapeLost(Unit* target) const 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 Aura::CanBeSaved() const diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index c2ab808cfe7..ab0e2a95894 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -588,8 +588,8 @@ m_spellValue(new SpellValue(m_spellInfo, caster)), _spellEvent(nullptr) // Determine if spell can be reflected back to the caster // Patch 1.2 notes: Spell Reflection no longer reflects abilities - m_canReflect = caster->IsUnit() && 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 = caster->IsUnit() && 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(); @@ -2602,7 +2602,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) procVictim |= PROC_FLAG_TAKE_HARMFUL_PERIODIC; } } - else if (spell->m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)) + else if (spell->m_spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY)) { if (positive) { @@ -2730,7 +2730,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) if (caster->GetTypeId() == TYPEID_PLAYER && (procSpellType & (PROC_SPELL_TYPE_DAMAGE | PROC_SPELL_TYPE_NO_DMG_HEAL))) { if (spell->m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE || spell->m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED) - if (!spell->m_spellInfo->HasAttribute(SPELL_ATTR0_STOP_ATTACK_TARGET) && !spell->m_spellInfo->HasAttribute(SPELL_ATTR4_SUPPRESS_WEAPON_PROCS)) + if (!spell->m_spellInfo->HasAttribute(SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT) && !spell->m_spellInfo->HasAttribute(SPELL_ATTR4_SUPPRESS_WEAPON_PROCS)) caster->ToPlayer()->CastItemCombatSpell(*spellDamageInfo); } } @@ -3685,7 +3685,7 @@ void Spell::_cast(bool skipCheck) else procAttacker |= PROC_FLAG_DEAL_HARMFUL_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; @@ -3958,7 +3958,7 @@ void Spell::_handle_finish_phase() else procAttacker |= PROC_FLAG_DEAL_HARMFUL_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; @@ -4154,7 +4154,7 @@ void Spell::finish(bool ok) } // Stop Attack for some spells - if (m_spellInfo->HasAttribute(SPELL_ATTR0_STOP_ATTACK_TARGET)) + if (m_spellInfo->HasAttribute(SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT)) unitCaster->AttackStop(); } @@ -4459,7 +4459,7 @@ void Spell::SendSpellStart() if (((IsTriggered() && !m_spellInfo->IsAutoRepeatRangedSpell()) || m_triggeredByAuraSpell) && !m_fromClient) castFlags |= CAST_FLAG_PENDING; - if (m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) || m_spellInfo->HasAttribute(SPELL_ATTR10_USES_RANGED_SLOT_COSMETIC_ONLY) || m_spellInfo->HasAttribute(SPELL_ATTR0_CU_NEEDS_AMMO_DATA)) + if (m_spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT) || m_spellInfo->HasAttribute(SPELL_ATTR10_USES_RANGED_SLOT_COSMETIC_ONLY) || m_spellInfo->HasAttribute(SPELL_ATTR0_CU_NEEDS_AMMO_DATA)) castFlags |= CAST_FLAG_PROJECTILE; if ((m_caster->GetTypeId() == TYPEID_PLAYER || @@ -4560,7 +4560,7 @@ void Spell::SendSpellGo() if (((IsTriggered() && !m_spellInfo->IsAutoRepeatRangedSpell()) || m_triggeredByAuraSpell) && !m_fromClient) castFlags |= CAST_FLAG_PENDING; - if (m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) || m_spellInfo->HasAttribute(SPELL_ATTR10_USES_RANGED_SLOT_COSMETIC_ONLY) || m_spellInfo->HasAttribute(SPELL_ATTR0_CU_NEEDS_AMMO_DATA)) + if (m_spellInfo->HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT) || m_spellInfo->HasAttribute(SPELL_ATTR10_USES_RANGED_SLOT_COSMETIC_ONLY) || m_spellInfo->HasAttribute(SPELL_ATTR0_CU_NEEDS_AMMO_DATA)) castFlags |= CAST_FLAG_PROJECTILE; // arrows/bullets visual if ((m_caster->GetTypeId() == TYPEID_PLAYER || @@ -5312,7 +5312,7 @@ void Spell::HandleEffects(Unit* pUnitTarget, Item* pItemTarget, GameObject* pGoT SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32* param2 /*= nullptr*/) { // check death state - if (m_caster->ToUnit() && !m_caster->ToUnit()->IsAlive() && !m_spellInfo->IsPassive() && !(m_spellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_DEAD) || (IsTriggered() && !m_triggeredByAuraSpell))) + if (m_caster->ToUnit() && !m_caster->ToUnit()->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 @@ -5332,7 +5332,7 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 { // These two auras check SpellFamilyName defined by db2 class data instead of current spell SpellFamilyName if (playerCaster->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_spellInfo->HasAttribute(SPELL_ATTR12_IGNORE_CASTING_DISABLED) && !playerCaster->HasAuraTypeWithFamilyFlags(SPELL_AURA_DISABLE_CASTING_EXCEPT_ABILITIES, sChrClassesStore.AssertEntry(playerCaster->GetClass())->SpellClassSet, m_spellInfo->SpellFamilyFlags)) @@ -5342,7 +5342,7 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 { if (!playerCaster->HasAuraTypeWithFamilyFlags(SPELL_AURA_DISABLE_ATTACKING_EXCEPT_ABILITIES, sChrClassesStore.AssertEntry(playerCaster->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_UNK20) @@ -5378,7 +5378,7 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 // 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) @@ -5388,11 +5388,11 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 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; } @@ -5622,7 +5622,7 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 // not let players cast spells at mount (and let do it to creatures) if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE)) { - if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->ToPlayer()->IsMounted() && !m_spellInfo->IsPassive() && !m_spellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_MOUNTED)) + if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->ToPlayer()->IsMounted() && !m_spellInfo->IsPassive() && !m_spellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED)) { if (m_caster->ToPlayer()->IsInFlight()) return SPELL_FAILED_NOT_ON_TAXI; @@ -6906,7 +6906,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; @@ -8551,8 +8551,8 @@ void Spell::TriggerGlobalCooldown() bool isMeleeOrRangedSpell = 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); // Apply haste rating if (gcd > MinGCD && ((m_spellInfo->StartRecoveryCategory == 133 && !isMeleeOrRangedSpell))) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 496801f9265..dc528083a0f 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1333,7 +1333,7 @@ void Spell::EffectCreateItem() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - DoCreateItem(effectInfo->ItemType, m_spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL) ? ItemContext::Trade_Skill : ItemContext::NONE); + DoCreateItem(effectInfo->ItemType, m_spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) ? ItemContext::Trade_Skill : ItemContext::NONE); ExecuteLogEffectCreateItem(SpellEffectName(effectInfo->Effect), effectInfo->ItemType); } @@ -1347,7 +1347,7 @@ void Spell::EffectCreateItem2() Player* player = unitTarget->ToPlayer(); - ItemContext context = m_spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL) ? ItemContext::Trade_Skill : ItemContext::NONE; + ItemContext context = m_spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) ? ItemContext::Trade_Skill : ItemContext::NONE; // Pick a random item from spell_loot_template if (m_spellInfo->IsLootCrafting()) @@ -1376,7 +1376,7 @@ void Spell::EffectCreateRandomItem() Player* player = unitTarget->ToPlayer(); // create some random items - player->AutoStoreLoot(m_spellInfo->Id, LootTemplates_Spell, m_spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL) ? ItemContext::Trade_Skill : ItemContext::NONE); + player->AutoStoreLoot(m_spellInfo->Id, LootTemplates_Spell, m_spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) ? ItemContext::Trade_Skill : ItemContext::NONE); /// @todo ExecuteLogEffectCreateItem(i, m_spellInfo->Effects[i].ItemType); } @@ -2346,7 +2346,7 @@ void Spell::EffectEnchantItemPerm() unitTarget = player; // and add a scroll damage = 1; - DoCreateItem(effectInfo->ItemType, m_spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL) ? ItemContext::Trade_Skill : ItemContext::NONE); + DoCreateItem(effectInfo->ItemType, m_spellInfo->HasAttribute(SPELL_ATTR0_IS_TRADESKILL) ? ItemContext::Trade_Skill : ItemContext::NONE); itemTarget = nullptr; m_targets.SetItemTarget(nullptr); } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index c6ad525b658..8bee05dbeb1 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -602,7 +602,7 @@ int32 SpellEffectInfo::CalcBaseValue(WorldObject const* caster, Unit const* targ ExpectedStatType stat = GetScalingExpectedStat(); if (stat != ExpectedStatType::None) { - if (_spellInfo->HasAttribute(SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION)) + if (_spellInfo->HasAttribute(SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL)) stat = ExpectedStatType::CreatureAutoAttackDps; // TODO - add expansion and content tuning id args? @@ -1574,7 +1574,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; SpellCategoryEntry const* category = sSpellCategoryStore.LookupEntry(CategoryId); @@ -1628,7 +1628,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 @@ -1658,7 +1658,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 @@ -1670,7 +1670,7 @@ bool SpellInfo::IsRangedWeaponSpell() const { return (SpellFamilyName == SPELLFAMILY_HUNTER && !(SpellFamilyFlags[1] & 0x10000000)) // for 53352, cannot find better way || (EquippedItemSubClassMask & ITEM_SUBCLASS_MASK_WEAPON_RANGED) - || (Attributes & SPELL_ATTR0_REQ_AMMO); + || (Attributes & SPELL_ATTR0_USES_RANGED_SLOT); } bool SpellInfo::IsAutoRepeatRangedSpell() const @@ -1776,11 +1776,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... @@ -1803,11 +1803,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 @@ -1921,7 +1921,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; @@ -2324,7 +2324,7 @@ SpellCastResult SpellInfo::CheckVehicle(Unit const* caster) const checkMask = VEHICLE_SEAT_FLAG_CAN_ATTACK; VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(caster); - 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; @@ -3675,7 +3675,7 @@ bool SpellInfo::SpellCancelsAuraEffect(AuraEffect const* aurEff) const if (!HasAttribute(SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY)) return false; - if (aurEff->GetSpellInfo()->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)) + if (aurEff->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES)) return false; for (SpellEffectInfo const& effect : GetEffects()) @@ -3794,7 +3794,7 @@ uint32 SpellInfo::CalcCastTime(Spell* spell /*= nullptr*/) const if (spell) spell->GetCaster()->ModSpellCastTime(this, castTime, spell); - if (HasAttribute(SPELL_ATTR0_REQ_AMMO) && !IsAutoRepeatRangedSpell() && !HasAttribute(SPELL_ATTR9_AIMED_SHOT)) + if (HasAttribute(SPELL_ATTR0_USES_RANGED_SLOT) && !IsAutoRepeatRangedSpell() && !HasAttribute(SPELL_ATTR9_AIMED_SHOT)) castTime += 500; return (castTime > 0) ? uint32(castTime) : 0; @@ -4031,7 +4031,7 @@ Optional<SpellPowerCost> SpellInfo::CalcPowerCost(SpellPowerEntry const* power, if (!unitCaster->IsControlledByPlayer() && G3D::fuzzyEq(power->PowerCostPct, 0.0f) && SpellLevel && power->PowerType == POWER_MANA) { - if (HasAttribute(SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION)) + if (HasAttribute(SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL)) { GtNpcManaCostScalerEntry const* spellScaler = sNpcManaCostScalerGameTable.GetRow(SpellLevel); GtNpcManaCostScalerEntry const* casterScaler = sNpcManaCostScalerGameTable.GetRow(unitCaster->GetLevel()); @@ -4268,7 +4268,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) || HasAttribute(SPELL_ATTR3_DRAIN_SOUL)) + if (HasAttribute(SPELL_ATTR0_AURA_IS_DEBUFF) || HasAttribute(SPELL_ATTR2_UNK3) || HasAttribute(SPELL_ATTR3_DRAIN_SOUL)) return this; bool needRankSelection = false; @@ -4409,7 +4409,7 @@ bool _isPositiveEffectImpl(SpellInfo const* spellInfo, SpellEffectInfo const& ef return true; // not found a single positive spell with this attribute - if (spellInfo->HasAttribute(SPELL_ATTR0_NEGATIVE_1)) + if (spellInfo->HasAttribute(SPELL_ATTR0_AURA_IS_DEBUFF)) return false; visited.insert({ spellInfo, effect.EffectIndex }); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index c6d34d035ec..56e9c85da22 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2270,7 +2270,7 @@ void SpellMgr::LoadSpellAreas() if (SpellInfo const* spellInfo = GetSpellInfo(spell, DIFFICULTY_NONE)) { 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 { @@ -3097,7 +3097,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes() default: { // No value and not interrupt cast or crowd control without SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY flag - if (!spellEffectInfo.CalcValue() && !((spellEffectInfo.Effect == SPELL_EFFECT_INTERRUPT_CAST || spellInfoMutable->HasAttribute(SPELL_ATTR0_CU_AURA_CC)) && !spellInfoMutable->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))) + if (!spellEffectInfo.CalcValue() && !((spellEffectInfo.Effect == SPELL_EFFECT_INTERRUPT_CAST || spellInfoMutable->HasAttribute(SPELL_ATTR0_CU_AURA_CC)) && !spellInfoMutable->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))) break; // Sindragosa Frost Breath @@ -4332,7 +4332,7 @@ void SpellMgr::LoadSpellInfoCorrections() // Val'kyr Target Search ApplySpellFix({ 69030 }, [](SpellInfo* spellInfo) { - spellInfo->Attributes |= SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY; + spellInfo->Attributes |= SPELL_ATTR0_NO_IMMUNITIES; }); // Raging Spirit Visual @@ -4461,7 +4461,7 @@ void SpellMgr::LoadSpellInfoCorrections() 40167, // Introspection }, [](SpellInfo* spellInfo) { - spellInfo->Attributes |= SPELL_ATTR0_NEGATIVE_1; + spellInfo->Attributes |= SPELL_ATTR0_AURA_IS_DEBUFF; }); // @@ -4505,7 +4505,7 @@ void SpellMgr::LoadSpellInfoCorrections() // Travel Form (dummy) - cannot be cast indoors. ApplySpellFix({ 783 }, [](SpellInfo* spellInfo) { - spellInfo->Attributes |= SPELL_ATTR0_OUTDOORS_ONLY; + spellInfo->Attributes |= SPELL_ATTR0_ONLY_OUTDOORS; }); // Tree of Life (Passive) @@ -4608,7 +4608,7 @@ void SpellMgr::LoadSpellInfoCorrections() // Torment Damage ApplySpellFix({ 99256 }, [](SpellInfo* spellInfo) { - spellInfo->Attributes |= SPELL_ATTR0_NEGATIVE_1; + spellInfo->Attributes |= SPELL_ATTR0_AURA_IS_DEBUFF; }); // Blaze of Glory @@ -4655,7 +4655,7 @@ void SpellMgr::LoadSpellInfoCorrections() // Headless Horseman Climax - Head Is Dead ApplySpellFix({ 42401, 43105, 42428 }, [](SpellInfo* spellInfo) { - spellInfo->Attributes |= SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY; + spellInfo->Attributes |= SPELL_ATTR0_NO_IMMUNITIES; }); // Horde / Alliance switch (BG mercenary system) |