AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
SpellMgr.cpp File Reference
#include "SpellMgr.h"
#include "BattlefieldMgr.h"
#include "BattlegroundIC.h"
#include "Chat.h"
#include "DBCStores.h"
#include "InstanceScript.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "SharedDefines.h"
#include "Spell.h"
#include "SpellAuraDefines.h"
#include "SpellInfo.h"
#include "World.h"

Go to the source code of this file.

Functions

bool IsPrimaryProfessionSkill (uint32 skill)
 
bool IsPartOfSkillLine (uint32 skillId, uint32 spellId)
 
DiminishingGroup GetDiminishingReturnsGroupForSpell (SpellInfo const *spellproto, bool triggered)
 
DiminishingReturnsType GetDiminishingReturnsGroupType (DiminishingGroup group)
 
DiminishingLevels GetDiminishingReturnsMaxLevel (DiminishingGroup group)
 
int32 GetDiminishingReturnsLimitDuration (DiminishingGroup group, SpellInfo const *spellproto)
 
bool IsDiminishingReturnsGroupDurationLimited (DiminishingGroup group)
 
void DeleteSpellFromAllPlayers (uint32 spellId)
 
static bool LoadPetDefaultSpells_helper (CreatureTemplate const *cInfo, PetDefaultSpellsEntry &petDefSpells)
 

Function Documentation

◆ DeleteSpellFromAllPlayers()

void DeleteSpellFromAllPlayers ( uint32  spellId)
446{
448 for (uint8 i = 0; i < 2; i++)
449 {
450 CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(stmts[i]);
451 stmt->SetData(0, spellId);
452 CharacterDatabase.Execute(stmt);
453 }
454}
CharacterDatabaseStatements
Definition CharacterDatabase.h:24
@ CHAR_DEL_INVALID_SPELL_TALENTS
Definition CharacterDatabase.h:293
@ CHAR_DEL_INVALID_SPELL_SPELLS
Definition CharacterDatabase.h:292
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
std::uint8_t uint8
Definition Define.h:109
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157

References CHAR_DEL_INVALID_SPELL_SPELLS, CHAR_DEL_INVALID_SPELL_TALENTS, CharacterDatabase, and PreparedStatementBase::SetData().

Referenced by SpellMgr::CheckSpellValid().

◆ GetDiminishingReturnsGroupForSpell()

DiminishingGroup GetDiminishingReturnsGroupForSpell ( SpellInfo const *  spellproto,
bool  triggered 
)
56{
57 if (spellproto->IsPositive())
58 return DIMINISHING_NONE;
59
60 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
61 {
62 if (spellproto->Effects[i].ApplyAuraName == SPELL_AURA_MOD_TAUNT)
63 return DIMINISHING_TAUNT;
64 }
65
66 // Explicit Diminishing Groups
67 switch (spellproto->SpellFamilyName)
68 {
70 {
71 // Pet charge effects (Infernal Awakening, Demon Charge)
72 if (spellproto->SpellVisual[0] == 2816 && spellproto->SpellIconID == 15)
74 // Gnaw
75 else if (spellproto->Id == 47481)
77 // Screams of the Past
78 else if (spellproto->Id == 7074)
79 return DIMINISHING_NONE;
80 break;
81 }
82 // Event spells
84 return DIMINISHING_NONE;
86 {
87 // Frostbite
88 if (spellproto->Id == 12494)
89 return DIMINISHING_ROOT;
90 // Shattered Barrier
91 else if (spellproto->Id == 55080)
92 return DIMINISHING_ROOT;
93 // Deep Freeze
94 else if (spellproto->SpellIconID == 2939 && spellproto->SpellVisual[0] == 9963)
96 // Frost Nova / Freeze (Water Elemental)
97 else if (spellproto->SpellIconID == 193)
99 // Dragon's Breath
100 else if (spellproto->SpellFamilyFlags[0] & 0x800000)
102 break;
103 }
105 {
106 // Hamstring - limit duration to 10s in PvP
107 if (spellproto->SpellFamilyFlags[0] & 0x2)
109 // Improved Hamstring
110 else if (spellproto->Id == 23694)
111 return DIMINISHING_ROOT;
112 // Charge Stun (own diminishing)
113 else if (spellproto->SpellFamilyFlags[0] & 0x01000000)
114 return DIMINISHING_CHARGE;
115 break;
116 }
118 {
119 // Curses/etc
120 if ((spellproto->SpellFamilyFlags[0] & 0x80000000) || (spellproto->SpellFamilyFlags[1] & 0x200))
122 // Seduction
123 else if (spellproto->SpellFamilyFlags[1] & 0x10000000)
124 return DIMINISHING_FEAR;
125 break;
126 }
128 {
129 // Pounce
130 if (spellproto->SpellFamilyFlags[0] & 0x20000)
132 // Cyclone
133 else if (spellproto->SpellFamilyFlags[1] & 0x20)
134 return DIMINISHING_CYCLONE;
135 // Entangling Roots
136 // Nature's Grasp
137 else if (spellproto->SpellFamilyFlags[0] & 0x00000200)
139 // Faerie Fire
140 else if (spellproto->SpellFamilyFlags[0] & 0x400)
142 // Feral Charge Root Effect
143 else if (spellproto->Id == 45334)
144 return DIMINISHING_NONE;
145 break;
146 }
148 {
149 // Gouge
150 if (spellproto->SpellFamilyFlags[0] & 0x8)
152 // Blind
153 else if (spellproto->SpellFamilyFlags[0] & 0x1000000)
154 return DIMINISHING_FEAR;
155 // Cheap Shot
156 else if (spellproto->SpellFamilyFlags[0] & 0x400)
158 // Crippling poison - Limit to 10 seconds in PvP (No SpellFamilyFlags)
159 else if (spellproto->SpellIconID == 163)
161 break;
162 }
164 {
165 // Hunter's Mark
166 if ((spellproto->SpellFamilyFlags[0] & 0x400) && spellproto->SpellIconID == 538)
168 // Scatter Shot (own diminishing)
169 else if ((spellproto->SpellFamilyFlags[0] & 0x40000) && spellproto->SpellIconID == 132)
171 // Entrapment (own diminishing)
172 else if (spellproto->SpellVisual[0] == 7484 && spellproto->SpellIconID == 20)
174 // Wyvern Sting mechanic is MECHANIC_SLEEP but the diminishing is DIMINISHING_DISORIENT
175 else if ((spellproto->SpellFamilyFlags[1] & 0x1000) && spellproto->SpellIconID == 1721)
177 // Freezing Arrow
178 else if (spellproto->SpellFamilyFlags[0] & 0x8)
180 break;
181 }
183 {
184 // Judgement of Justice - limit duration to 10s in PvP
185 if (spellproto->SpellFamilyFlags[0] & 0x100000)
187 // Turn Evil
188 else if ((spellproto->SpellFamilyFlags[1] & 0x804000) && spellproto->SpellIconID == 309)
189 return DIMINISHING_FEAR;
190 break;
191 }
193 {
194 // Storm, Earth and Fire - Earthgrab
195 if (spellproto->SpellFamilyFlags[2] & 0x4000)
197 break;
198 }
200 {
201 // Hungering Cold (no flags)
202 if (spellproto->SpellIconID == 2797)
204 // Mark of Blood
205 else if ((spellproto->SpellFamilyFlags[0] & 0x10000000) && spellproto->SpellIconID == 2285)
207 break;
208 }
209 default:
210 break;
211 }
212
213 // Lastly - Set diminishing depending on mechanic
214 uint32 mechanic = spellproto->GetAllEffectsMechanicMask();
215 if (mechanic & (1 << MECHANIC_CHARM))
217 if (mechanic & (1 << MECHANIC_SILENCE))
218 return DIMINISHING_SILENCE;
219 if (mechanic & (1 << MECHANIC_SLEEP))
220 return DIMINISHING_SLEEP;
221 if (mechanic & ((1 << MECHANIC_SAPPED) | (1 << MECHANIC_POLYMORPH) | (1 << MECHANIC_SHACKLE)))
223 // Mechanic Knockout, except Blast Wave
224 if (mechanic & (1 << MECHANIC_KNOCKOUT) && spellproto->SpellIconID != 292)
226 if (mechanic & (1 << MECHANIC_DISARM))
227 return DIMINISHING_DISARM;
228 if (mechanic & (1 << MECHANIC_FEAR))
229 return DIMINISHING_FEAR;
230 if (mechanic & (1 << MECHANIC_STUN))
232 if (mechanic & (1 << MECHANIC_BANISH))
233 return DIMINISHING_BANISH;
234 if (mechanic & (1 << MECHANIC_ROOT))
236 if (mechanic & (1 << MECHANIC_HORROR))
237 return DIMINISHING_HORROR;
238
239 return DIMINISHING_NONE;
240}
#define MAX_SPELL_EFFECTS
Definition DBCStructure.h:1635
std::uint32_t uint32
Definition Define.h:107
@ DIMINISHING_MIND_CONTROL
Definition SharedDefines.h:3520
@ DIMINISHING_HORROR
Definition SharedDefines.h:3519
@ DIMINISHING_DRAGONS_BREATH
Definition SharedDefines.h:3528
@ DIMINISHING_CONTROLLED_STUN
Definition SharedDefines.h:3512
@ DIMINISHING_CYCLONE
Definition SharedDefines.h:3514
@ DIMINISHING_BANISH
Definition SharedDefines.h:3509
@ DIMINISHING_CONTROLLED_ROOT
Definition SharedDefines.h:3513
@ DIMINISHING_NONE
Definition SharedDefines.h:3508
@ DIMINISHING_SLEEP
Definition SharedDefines.h:3525
@ DIMINISHING_STUN
Definition SharedDefines.h:3522
@ DIMINISHING_DISARM
Definition SharedDefines.h:3515
@ DIMINISHING_ENTRAPMENT
Definition SharedDefines.h:3517
@ DIMINISHING_FEAR
Definition SharedDefines.h:3518
@ DIMINISHING_SCATTER_SHOT
Definition SharedDefines.h:3523
@ DIMINISHING_LIMITONLY
Definition SharedDefines.h:3527
@ DIMINISHING_OPENING_STUN
Definition SharedDefines.h:3511
@ DIMINISHING_DISORIENT
Definition SharedDefines.h:3516
@ DIMINISHING_ROOT
Definition SharedDefines.h:3521
@ DIMINISHING_TAUNT
Definition SharedDefines.h:3526
@ DIMINISHING_CHARGE
Definition SharedDefines.h:3510
@ DIMINISHING_SILENCE
Definition SharedDefines.h:3524
@ MECHANIC_DISARM
Definition SharedDefines.h:1339
@ MECHANIC_FEAR
Definition SharedDefines.h:1341
@ MECHANIC_KNOCKOUT
Definition SharedDefines.h:1350
@ MECHANIC_CHARM
Definition SharedDefines.h:1337
@ MECHANIC_STUN
Definition SharedDefines.h:1348
@ MECHANIC_ROOT
Definition SharedDefines.h:1343
@ MECHANIC_SLEEP
Definition SharedDefines.h:1346
@ MECHANIC_POLYMORPH
Definition SharedDefines.h:1353
@ MECHANIC_BANISH
Definition SharedDefines.h:1354
@ MECHANIC_SILENCE
Definition SharedDefines.h:1345
@ MECHANIC_SHACKLE
Definition SharedDefines.h:1356
@ MECHANIC_SAPPED
Definition SharedDefines.h:1366
@ MECHANIC_HORROR
Definition SharedDefines.h:1360
@ SPELLFAMILY_WARLOCK
Definition SharedDefines.h:3799
@ SPELLFAMILY_MAGE
Definition SharedDefines.h:3797
@ SPELLFAMILY_GENERIC
Definition SharedDefines.h:3794
@ SPELLFAMILY_WARRIOR
Definition SharedDefines.h:3798
@ SPELLFAMILY_PALADIN
Definition SharedDefines.h:3804
@ SPELLFAMILY_HUNTER
Definition SharedDefines.h:3803
@ SPELLFAMILY_ROGUE
Definition SharedDefines.h:3802
@ SPELLFAMILY_SHAMAN
Definition SharedDefines.h:3805
@ SPELLFAMILY_DRUID
Definition SharedDefines.h:3801
@ SPELLFAMILY_DEATHKNIGHT
Definition SharedDefines.h:3809
@ SPELLFAMILY_UNK1
Definition SharedDefines.h:3795
@ SPELL_AURA_MOD_TAUNT
Definition SpellAuraDefines.h:74

References DIMINISHING_BANISH, DIMINISHING_CHARGE, DIMINISHING_CONTROLLED_ROOT, DIMINISHING_CONTROLLED_STUN, DIMINISHING_CYCLONE, DIMINISHING_DISARM, DIMINISHING_DISORIENT, DIMINISHING_DRAGONS_BREATH, DIMINISHING_ENTRAPMENT, DIMINISHING_FEAR, DIMINISHING_HORROR, DIMINISHING_LIMITONLY, DIMINISHING_MIND_CONTROL, DIMINISHING_NONE, DIMINISHING_OPENING_STUN, DIMINISHING_ROOT, DIMINISHING_SCATTER_SHOT, DIMINISHING_SILENCE, DIMINISHING_SLEEP, DIMINISHING_STUN, DIMINISHING_TAUNT, SpellInfo::Effects, SpellInfo::GetAllEffectsMechanicMask(), SpellInfo::Id, SpellInfo::IsPositive(), MAX_SPELL_EFFECTS, MECHANIC_BANISH, MECHANIC_CHARM, MECHANIC_DISARM, MECHANIC_FEAR, MECHANIC_HORROR, MECHANIC_KNOCKOUT, MECHANIC_POLYMORPH, MECHANIC_ROOT, MECHANIC_SAPPED, MECHANIC_SHACKLE, MECHANIC_SILENCE, MECHANIC_SLEEP, MECHANIC_STUN, SPELL_AURA_MOD_TAUNT, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_UNK1, SPELLFAMILY_WARLOCK, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, and SpellInfo::SpellVisual.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDiminishingReturnsGroupType()

DiminishingReturnsType GetDiminishingReturnsGroupType ( DiminishingGroup  group)
243{
244 switch (group)
245 {
248 case DIMINISHING_STUN:
252 return DRTYPE_ALL;
254 case DIMINISHING_NONE:
255 return DRTYPE_NONE;
256 default:
257 return DRTYPE_PLAYER;
258 }
259}
@ DRTYPE_NONE
Definition SharedDefines.h:3500
@ DRTYPE_PLAYER
Definition SharedDefines.h:3501
@ DRTYPE_ALL
Definition SharedDefines.h:3502

References DIMINISHING_CHARGE, DIMINISHING_CONTROLLED_STUN, DIMINISHING_CYCLONE, DIMINISHING_LIMITONLY, DIMINISHING_NONE, DIMINISHING_OPENING_STUN, DIMINISHING_STUN, DIMINISHING_TAUNT, DRTYPE_ALL, DRTYPE_NONE, and DRTYPE_PLAYER.

Referenced by Unit::ApplyDiminishingToDuration(), and Spell::DoSpellHitOnUnit().

◆ GetDiminishingReturnsLimitDuration()

int32 GetDiminishingReturnsLimitDuration ( DiminishingGroup  group,
SpellInfo const *  spellproto 
)
273{
275 return 0;
276
277 // Explicit diminishing duration
278 switch (spellproto->SpellFamilyName)
279 {
281 {
282 // Faerie Fire - limit to 40 seconds in PvP (3.1)
283 if (spellproto->SpellFamilyFlags[0] & 0x400)
284 return 40 * IN_MILLISECONDS;
285 break;
286 }
288 {
289 // Wyvern Sting
290 if (spellproto->SpellFamilyFlags[1] & 0x1000)
291 return 6 * IN_MILLISECONDS;
292 // Hunter's Mark
293 if (spellproto->SpellFamilyFlags[0] & 0x400)
294 return 120 * IN_MILLISECONDS;
295 break;
296 }
298 {
299 // Repentance - limit to 6 seconds in PvP
300 if (spellproto->SpellFamilyFlags[0] & 0x4)
301 return 6 * IN_MILLISECONDS;
302 break;
303 }
305 {
306 // Banish - limit to 6 seconds in PvP
307 if (spellproto->SpellFamilyFlags[1] & 0x8000000)
308 return 6 * IN_MILLISECONDS;
309 // Curse of Tongues - limit to 12 seconds in PvP
310 else if (spellproto->SpellFamilyFlags[2] & 0x800)
311 return 12 * IN_MILLISECONDS;
312 // Curse of Elements - limit to 120 seconds in PvP
313 else if (spellproto->SpellFamilyFlags[1] & 0x200)
314 return 120 * IN_MILLISECONDS;
315 // Curse of Exhaustion
316 else if (spellproto->SpellFamilyFlags[0] & 0x400000)
317 return 12 * IN_MILLISECONDS;
318 break;
319 }
320 default:
321 break;
322 }
323
324 return 10 * IN_MILLISECONDS;
325}
constexpr auto IN_MILLISECONDS
Definition Common.h:53
bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group)
Definition SpellMgr.cpp:327

References IN_MILLISECONDS, IsDiminishingReturnsGroupDurationLimited(), SPELLFAMILY_DRUID, SPELLFAMILY_HUNTER, SPELLFAMILY_PALADIN, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDiminishingReturnsMaxLevel()

DiminishingLevels GetDiminishingReturnsMaxLevel ( DiminishingGroup  group)
262{
263 switch (group)
264 {
267 default:
269 }
270}
@ DIMINISHING_LEVEL_IMMUNE
Definition Unit.h:273
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition Unit.h:275

References DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, and DIMINISHING_TAUNT.

Referenced by Unit::IncrDiminishing().

◆ IsDiminishingReturnsGroupDurationLimited()

◆ IsPartOfSkillLine()

bool IsPartOfSkillLine ( uint32  skillId,
uint32  spellId 
)
46{
47 SkillLineAbilityMapBounds skillBounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellId);
48 for (SkillLineAbilityMap::const_iterator itr = skillBounds.first; itr != skillBounds.second; ++itr)
49 if (itr->second->SkillLine == skillId)
50 return true;
51
52 return false;
53}
#define sSpellMgr
Definition SpellMgr.h:825
std::pair< SkillLineAbilityMap::const_iterator, SkillLineAbilityMap::const_iterator > SkillLineAbilityMapBounds
Definition SpellMgr.h:576

References sSpellMgr.

Referenced by SpellMgr::LoadSpellInfoCustomAttributes().

◆ IsPrimaryProfessionSkill()

bool IsPrimaryProfessionSkill ( uint32  skill)
34{
35 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(skill);
36 if (!pSkill)
37 return false;
38
40 return false;
41
42 return true;
43}
DBCStorage< SkillLineEntry > sSkillLineStore(SkillLinefmt)
@ SKILL_CATEGORY_PROFESSION
Definition SharedDefines.h:3328
Definition DBCStructure.h:1581
int32 categoryId
Definition DBCStructure.h:1583

References SkillLineEntry::categoryId, SKILL_CATEGORY_PROFESSION, and sSkillLineStore.

Referenced by WorldSession::HandleUnlearnSkillOpcode(), SpellInfo::IsPrimaryProfession(), and IsProfessionSkill().

◆ LoadPetDefaultSpells_helper()

static bool LoadPetDefaultSpells_helper ( CreatureTemplate const *  cInfo,
PetDefaultSpellsEntry petDefSpells 
)
static
2534{
2535 // skip empty list;
2536 bool have_spell = false;
2537 for (uint8 j = 0; j < MAX_CREATURE_SPELL_DATA_SLOT; ++j)
2538 {
2539 if (petDefSpells.spellid[j])
2540 {
2541 have_spell = true;
2542 break;
2543 }
2544 }
2545 if (!have_spell)
2546 return false;
2547
2548 // remove duplicates with levelupSpells if any
2549 if (PetLevelupSpellSet const* levelupSpells = cInfo->family ? sSpellMgr->GetPetLevelupSpellList(cInfo->family) : nullptr)
2550 {
2551 for (uint8 j = 0; j < MAX_CREATURE_SPELL_DATA_SLOT; ++j)
2552 {
2553 if (!petDefSpells.spellid[j])
2554 continue;
2555
2556 for (PetLevelupSpellSet::const_iterator itr = levelupSpells->begin(); itr != levelupSpells->end(); ++itr)
2557 {
2558 if (itr->second == petDefSpells.spellid[j])
2559 {
2560 petDefSpells.spellid[j] = 0;
2561 break;
2562 }
2563 }
2564 }
2565 }
2566
2567 // skip empty list;
2568 have_spell = false;
2569 for (uint8 j = 0; j < MAX_CREATURE_SPELL_DATA_SLOT; ++j)
2570 {
2571 if (petDefSpells.spellid[j])
2572 {
2573 have_spell = true;
2574 break;
2575 }
2576 }
2577
2578 return have_spell;
2579}
#define MAX_CREATURE_SPELL_DATA_SLOT
Definition DBCStructure.h:807
std::multimap< uint32, uint32 > PetLevelupSpellSet
Definition SpellMgr.h:578
uint32 spellid[MAX_CREATURE_SPELL_DATA_SLOT]
Definition SpellMgr.h:585

References CreatureTemplate::family, MAX_CREATURE_SPELL_DATA_SLOT, PetDefaultSpellsEntry::spellid, and sSpellMgr.

Referenced by SpellMgr::LoadPetDefaultSpells().