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 "BattlegroundMgr.h"
#include "Chat.h"
#include "DBCStores.h"
#include "GameGraveyard.h"
#include "InstanceScript.h"
#include "MapMgr.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "SharedDefines.h"
#include "Spell.h"
#include "SpellAuraDefines.h"
#include "SpellAuras.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)
 
bool LoadPetDefaultSpells_helper (CreatureTemplate const *cInfo, PetDefaultSpellsEntry &petDefSpells)
 

Function Documentation

◆ DeleteSpellFromAllPlayers()

void DeleteSpellFromAllPlayers ( uint32  spellId)
450{
452 for (uint8 i = 0; i < 2; i++)
453 {
454 CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(stmts[i]);
455 stmt->SetData(0, spellId);
456 CharacterDatabase.Execute(stmt);
457 }
458}
std::uint8_t uint8
Definition: Define.h:110
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
CharacterDatabaseStatements
Definition: CharacterDatabase.h:24
@ CHAR_DEL_INVALID_SPELL_TALENTS
Definition: CharacterDatabase.h:291
@ CHAR_DEL_INVALID_SPELL_SPELLS
Definition: CharacterDatabase.h:290
Definition: PreparedStatement.h:158
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition: PreparedStatement.h:78

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 
)
60{
61 if (spellproto->IsPositive())
62 return DIMINISHING_NONE;
63
64 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
65 {
66 if (spellproto->Effects[i].ApplyAuraName == SPELL_AURA_MOD_TAUNT)
67 return DIMINISHING_TAUNT;
68 }
69
70 // Explicit Diminishing Groups
71 switch (spellproto->SpellFamilyName)
72 {
74 {
75 // Pet charge effects (Infernal Awakening, Demon Charge)
76 if (spellproto->SpellVisual[0] == 2816 && spellproto->SpellIconID == 15)
78 // Gnaw
79 else if (spellproto->Id == 47481)
81 // Screams of the Past
82 else if (spellproto->Id == 7074)
83 return DIMINISHING_NONE;
84 break;
85 }
86 // Event spells
88 return DIMINISHING_NONE;
90 {
91 // Frostbite
92 if (spellproto->Id == 12494)
93 return DIMINISHING_ROOT;
94 // Shattered Barrier
95 else if (spellproto->Id == 55080)
96 return DIMINISHING_ROOT;
97 // Deep Freeze
98 else if (spellproto->SpellIconID == 2939 && spellproto->SpellVisual[0] == 9963)
100 // Frost Nova / Freeze (Water Elemental)
101 else if (spellproto->SpellIconID == 193)
103 // Dragon's Breath
104 else if (spellproto->SpellFamilyFlags[0] & 0x800000)
106 break;
107 }
109 {
110 // Hamstring - limit duration to 10s in PvP
111 if (spellproto->SpellFamilyFlags[0] & 0x2)
113 // Improved Hamstring
114 else if (spellproto->Id == 23694)
115 return DIMINISHING_ROOT;
116 // Charge Stun (own diminishing)
117 else if (spellproto->SpellFamilyFlags[0] & 0x01000000)
118 return DIMINISHING_CHARGE;
119 break;
120 }
122 {
123 // Curses/etc
124 if ((spellproto->SpellFamilyFlags[0] & 0x80000000) || (spellproto->SpellFamilyFlags[1] & 0x200))
126 // Seduction
127 else if (spellproto->SpellFamilyFlags[1] & 0x10000000)
128 return DIMINISHING_FEAR;
129 break;
130 }
132 {
133 // Pounce
134 if (spellproto->SpellFamilyFlags[0] & 0x20000)
136 // Cyclone
137 else if (spellproto->SpellFamilyFlags[1] & 0x20)
138 return DIMINISHING_CYCLONE;
139 // Entangling Roots
140 // Nature's Grasp
141 else if (spellproto->SpellFamilyFlags[0] & 0x00000200)
143 // Faerie Fire
144 else if (spellproto->SpellFamilyFlags[0] & 0x400)
146 // Feral Charge Root Effect
147 else if (spellproto->Id == 45334)
148 return DIMINISHING_NONE;
149 break;
150 }
152 {
153 // Gouge
154 if (spellproto->SpellFamilyFlags[0] & 0x8)
156 // Blind
157 else if (spellproto->SpellFamilyFlags[0] & 0x1000000)
158 return DIMINISHING_FEAR;
159 // Cheap Shot
160 else if (spellproto->SpellFamilyFlags[0] & 0x400)
162 // Crippling poison - Limit to 10 seconds in PvP (No SpellFamilyFlags)
163 else if (spellproto->SpellIconID == 163)
165 break;
166 }
168 {
169 // Hunter's Mark
170 if ((spellproto->SpellFamilyFlags[0] & 0x400) && spellproto->SpellIconID == 538)
172 // Scatter Shot (own diminishing)
173 else if ((spellproto->SpellFamilyFlags[0] & 0x40000) && spellproto->SpellIconID == 132)
175 // Entrapment (own diminishing)
176 else if (spellproto->SpellVisual[0] == 7484 && spellproto->SpellIconID == 20)
178 // Wyvern Sting mechanic is MECHANIC_SLEEP but the diminishing is DIMINISHING_DISORIENT
179 else if ((spellproto->SpellFamilyFlags[1] & 0x1000) && spellproto->SpellIconID == 1721)
181 // Freezing Arrow
182 else if (spellproto->SpellFamilyFlags[0] & 0x8)
184 break;
185 }
187 {
188 // Judgement of Justice - limit duration to 10s in PvP
189 if (spellproto->SpellFamilyFlags[0] & 0x100000)
191 // Turn Evil
192 else if ((spellproto->SpellFamilyFlags[1] & 0x804000) && spellproto->SpellIconID == 309)
193 return DIMINISHING_FEAR;
194 break;
195 }
197 {
198 // Storm, Earth and Fire - Earthgrab
199 if (spellproto->SpellFamilyFlags[2] & 0x4000)
200 return DIMINISHING_NONE;
201 break;
202 }
204 {
205 // Hungering Cold (no flags)
206 if (spellproto->SpellIconID == 2797)
208 // Mark of Blood
209 else if ((spellproto->SpellFamilyFlags[0] & 0x10000000) && spellproto->SpellIconID == 2285)
211 break;
212 }
213 default:
214 break;
215 }
216
217 // Lastly - Set diminishing depending on mechanic
218 uint32 mechanic = spellproto->GetAllEffectsMechanicMask();
219 if (mechanic & (1 << MECHANIC_CHARM))
221 if (mechanic & (1 << MECHANIC_SILENCE))
222 return DIMINISHING_SILENCE;
223 if (mechanic & (1 << MECHANIC_SLEEP))
224 return DIMINISHING_SLEEP;
225 if (mechanic & ((1 << MECHANIC_SAPPED) | (1 << MECHANIC_POLYMORPH) | (1 << MECHANIC_SHACKLE)))
227 // Mechanic Knockout, except Blast Wave
228 if (mechanic & (1 << MECHANIC_KNOCKOUT) && spellproto->SpellIconID != 292)
230 if (mechanic & (1 << MECHANIC_DISARM))
231 return DIMINISHING_DISARM;
232 if (mechanic & (1 << MECHANIC_FEAR))
233 return DIMINISHING_FEAR;
234 if (mechanic & (1 << MECHANIC_STUN))
236 if (mechanic & (1 << MECHANIC_BANISH))
237 return DIMINISHING_BANISH;
238 if (mechanic & (1 << MECHANIC_ROOT))
240 if (mechanic & (1 << MECHANIC_HORROR))
241 return DIMINISHING_HORROR;
242
243 return DIMINISHING_NONE;
244}
std::uint32_t uint32
Definition: Define.h:108
@ SPELL_AURA_MOD_TAUNT
Definition: SpellAuraDefines.h:74
#define MAX_SPELL_EFFECTS
Definition: DBCStructure.h:1635
@ DIMINISHING_MIND_CONTROL
Definition: SharedDefines.h:3270
@ DIMINISHING_HORROR
Definition: SharedDefines.h:3269
@ DIMINISHING_DRAGONS_BREATH
Definition: SharedDefines.h:3278
@ DIMINISHING_CONTROLLED_STUN
Definition: SharedDefines.h:3262
@ DIMINISHING_CYCLONE
Definition: SharedDefines.h:3264
@ DIMINISHING_BANISH
Definition: SharedDefines.h:3259
@ DIMINISHING_CONTROLLED_ROOT
Definition: SharedDefines.h:3263
@ DIMINISHING_NONE
Definition: SharedDefines.h:3258
@ DIMINISHING_SLEEP
Definition: SharedDefines.h:3275
@ DIMINISHING_STUN
Definition: SharedDefines.h:3272
@ DIMINISHING_DISARM
Definition: SharedDefines.h:3265
@ DIMINISHING_ENTRAPMENT
Definition: SharedDefines.h:3267
@ DIMINISHING_FEAR
Definition: SharedDefines.h:3268
@ DIMINISHING_SCATTER_SHOT
Definition: SharedDefines.h:3273
@ DIMINISHING_LIMITONLY
Definition: SharedDefines.h:3277
@ DIMINISHING_OPENING_STUN
Definition: SharedDefines.h:3261
@ DIMINISHING_DISORIENT
Definition: SharedDefines.h:3266
@ DIMINISHING_ROOT
Definition: SharedDefines.h:3271
@ DIMINISHING_TAUNT
Definition: SharedDefines.h:3276
@ DIMINISHING_CHARGE
Definition: SharedDefines.h:3260
@ DIMINISHING_SILENCE
Definition: SharedDefines.h:3274
@ MECHANIC_DISARM
Definition: SharedDefines.h:1328
@ MECHANIC_FEAR
Definition: SharedDefines.h:1330
@ MECHANIC_KNOCKOUT
Definition: SharedDefines.h:1339
@ MECHANIC_CHARM
Definition: SharedDefines.h:1326
@ MECHANIC_STUN
Definition: SharedDefines.h:1337
@ MECHANIC_ROOT
Definition: SharedDefines.h:1332
@ MECHANIC_SLEEP
Definition: SharedDefines.h:1335
@ MECHANIC_POLYMORPH
Definition: SharedDefines.h:1342
@ MECHANIC_BANISH
Definition: SharedDefines.h:1343
@ MECHANIC_SILENCE
Definition: SharedDefines.h:1334
@ MECHANIC_SHACKLE
Definition: SharedDefines.h:1345
@ MECHANIC_SAPPED
Definition: SharedDefines.h:1355
@ MECHANIC_HORROR
Definition: SharedDefines.h:1349
@ SPELLFAMILY_WARLOCK
Definition: SharedDefines.h:3533
@ SPELLFAMILY_MAGE
Definition: SharedDefines.h:3531
@ SPELLFAMILY_GENERIC
Definition: SharedDefines.h:3528
@ SPELLFAMILY_WARRIOR
Definition: SharedDefines.h:3532
@ SPELLFAMILY_PALADIN
Definition: SharedDefines.h:3538
@ SPELLFAMILY_HUNTER
Definition: SharedDefines.h:3537
@ SPELLFAMILY_ROGUE
Definition: SharedDefines.h:3536
@ SPELLFAMILY_SHAMAN
Definition: SharedDefines.h:3539
@ SPELLFAMILY_DRUID
Definition: SharedDefines.h:3535
@ SPELLFAMILY_DEATHKNIGHT
Definition: SharedDefines.h:3543
@ SPELLFAMILY_UNK1
Definition: SharedDefines.h:3529

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)
247{
248 switch (group)
249 {
252 case DIMINISHING_STUN:
256 return DRTYPE_ALL;
258 case DIMINISHING_NONE:
259 return DRTYPE_NONE;
260 default:
261 return DRTYPE_PLAYER;
262 }
263}
@ DRTYPE_NONE
Definition: SharedDefines.h:3250
@ DRTYPE_PLAYER
Definition: SharedDefines.h:3251
@ DRTYPE_ALL
Definition: SharedDefines.h:3252

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 
)
277{
279 return 0;
280
281 // Explicit diminishing duration
282 switch (spellproto->SpellFamilyName)
283 {
285 {
286 // Faerie Fire - limit to 40 seconds in PvP (3.1)
287 if (spellproto->SpellFamilyFlags[0] & 0x400)
288 return 40 * IN_MILLISECONDS;
289 break;
290 }
292 {
293 // Wyvern Sting
294 if (spellproto->SpellFamilyFlags[1] & 0x1000)
295 return 6 * IN_MILLISECONDS;
296 // Hunter's Mark
297 if (spellproto->SpellFamilyFlags[0] & 0x400)
298 return 120 * IN_MILLISECONDS;
299 break;
300 }
302 {
303 // Repentance - limit to 6 seconds in PvP
304 if (spellproto->SpellFamilyFlags[0] & 0x4)
305 return 6 * IN_MILLISECONDS;
306 break;
307 }
309 {
310 // Banish - limit to 6 seconds in PvP
311 if (spellproto->SpellFamilyFlags[1] & 0x8000000)
312 return 6 * IN_MILLISECONDS;
313 // Curse of Tongues - limit to 12 seconds in PvP
314 else if (spellproto->SpellFamilyFlags[2] & 0x800)
315 return 12 * IN_MILLISECONDS;
316 // Curse of Elements - limit to 120 seconds in PvP
317 else if (spellproto->SpellFamilyFlags[1] & 0x200)
318 return 120 * IN_MILLISECONDS;
319 // Curse of Exhaustion
320 else if (spellproto->SpellFamilyFlags[0] & 0x400000)
321 return 12 * IN_MILLISECONDS;
322 break;
323 }
324 default:
325 break;
326 }
327
328 return 10 * IN_MILLISECONDS;
329}
constexpr auto IN_MILLISECONDS
Definition: Common.h:55
bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group)
Definition: SpellMgr.cpp:331

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)
266{
267 switch (group)
268 {
271 default:
273 }
274}
@ DIMINISHING_LEVEL_IMMUNE
Definition: Unit.h:697
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition: Unit.h:699

References DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, and DIMINISHING_TAUNT.

Referenced by Unit::IncrDiminishing().

◆ IsDiminishingReturnsGroupDurationLimited()

◆ IsPartOfSkillLine()

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

References sSpellMgr.

Referenced by SpellMgr::LoadSpellInfoCustomAttributes().

◆ IsPrimaryProfessionSkill()

bool IsPrimaryProfessionSkill ( uint32  skill)
38{
39 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(skill);
40 if (!pSkill)
41 return false;
42
44 return false;
45
46 return true;
47}
DBCStorage< SkillLineEntry > sSkillLineStore(SkillLinefmt)
@ SKILL_CATEGORY_PROFESSION
Definition: SharedDefines.h:3078
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()

bool LoadPetDefaultSpells_helper ( CreatureTemplate const *  cInfo,
PetDefaultSpellsEntry petDefSpells 
)
2364{
2365 // skip empty list;
2366 bool have_spell = false;
2367 for (uint8 j = 0; j < MAX_CREATURE_SPELL_DATA_SLOT; ++j)
2368 {
2369 if (petDefSpells.spellid[j])
2370 {
2371 have_spell = true;
2372 break;
2373 }
2374 }
2375 if (!have_spell)
2376 return false;
2377
2378 // remove duplicates with levelupSpells if any
2379 if (PetLevelupSpellSet const* levelupSpells = cInfo->family ? sSpellMgr->GetPetLevelupSpellList(cInfo->family) : nullptr)
2380 {
2381 for (uint8 j = 0; j < MAX_CREATURE_SPELL_DATA_SLOT; ++j)
2382 {
2383 if (!petDefSpells.spellid[j])
2384 continue;
2385
2386 for (PetLevelupSpellSet::const_iterator itr = levelupSpells->begin(); itr != levelupSpells->end(); ++itr)
2387 {
2388 if (itr->second == petDefSpells.spellid[j])
2389 {
2390 petDefSpells.spellid[j] = 0;
2391 break;
2392 }
2393 }
2394 }
2395 }
2396
2397 // skip empty list;
2398 have_spell = false;
2399 for (uint8 j = 0; j < MAX_CREATURE_SPELL_DATA_SLOT; ++j)
2400 {
2401 if (petDefSpells.spellid[j])
2402 {
2403 have_spell = true;
2404 break;
2405 }
2406 }
2407
2408 return have_spell;
2409}
std::multimap< uint32, uint32 > PetLevelupSpellSet
Definition: SpellMgr.h:586
#define MAX_CREATURE_SPELL_DATA_SLOT
Definition: DBCStructure.h:798
uint32 spellid[MAX_CREATURE_SPELL_DATA_SLOT]
Definition: SpellMgr.h:593

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

Referenced by SpellMgr::LoadPetDefaultSpells().