aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.cpp2
-rw-r--r--src/server/game/AI/PlayerAI/PlayerAI.cpp2
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp2
-rw-r--r--src/server/game/Chat/HyperlinkTags.cpp2
-rw-r--r--src/server/game/Entities/Object/Object.cpp10
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp14
-rw-r--r--src/server/game/Entities/Unit/UnitDefines.h12
-rw-r--r--src/server/game/Entities/Unit/enuminfo_UnitDefines.cpp12
-rw-r--r--src/server/game/Handlers/PetHandler.cpp2
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp8
-rw-r--r--src/server/game/Loot/LootMgr.cpp2
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h64
-rw-r--r--src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp184
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp4
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp2
-rw-r--r--src/server/game/Spells/Spell.cpp38
-rw-r--r--src/server/game/Spells/SpellEffects.cpp8
-rw-r--r--src/server/game/Spells/SpellInfo.cpp32
-rw-r--r--src/server/game/Spells/SpellMgr.cpp14
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)