Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
SpellInfo.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "Battleground.h"
7#include "ConditionMgr.h"
8#include "DBCStores.h"
9#include "Player.h"
10#include "Spell.h"
11#include "SpellAuraDefines.h"
12#include "SpellCalculations.h"
13#include "SpellInfo.h"
14#include "SpellMgr.h"
15#include "SpellValidation.h"
16#include "Vehicle.h"
17
18SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* _effect) : _spellInfo(spellInfo), _effIndex(effIndex),
22{
23 if (_effect)
24 {
25 _effIndex = _effect->EffectIndex;
26 Effect = _effect->Effect;
29 DieSides = _effect->EffectDieSides;
36 MiscValue = _effect->EffectMiscValue;
41 RadiusEntry = _effect->EffectRadiusIndex ? sSpellRadiusStore.LookupEntry(_effect->EffectRadiusIndex) : NULL;
42 MaxRadiusEntry = _effect->EffectRadiusMaxIndex ? sSpellRadiusStore.LookupEntry(_effect->EffectRadiusMaxIndex) : NULL;
44 ItemType = _effect->EffectItemType;
47 }
48
49 uint32 _effectScalingId = _effect ? sSpellEffectScallingByEffectId.find(_effect->Id) != sSpellEffectScallingByEffectId.end() ? sSpellEffectScallingByEffectId[_effect->Id] : 0 : 0;
50 SpellEffectScalingEntry const* _effectScalingEntry = sSpellEffectScalingStore.LookupEntry(_effectScalingId);
51 if (!_effectScalingEntry)
52 return;
53
54 ScalingMultiplier = _effectScalingEntry->Multiplier;
55 DeltaScalingMultiplier = _effectScalingEntry->RandomPointsMultiplier;
56 ComboScalingMultiplier = _effectScalingEntry->OtherMultiplier;
57}
58
60{
61 return Effect != 0;
62}
63
65{
66 return Effect == uint32(effectName);
67}
68
73
75{
76 return IsAura() && ApplyAuraName == uint32(aura);
77}
78
80{
81 return TargetA.IsArea() || TargetB.IsArea();
82}
83
95
104
109
114
115int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const* target) const
116{
117 float basePointsPerLevel = RealPointsPerLevel;
118 int32 basePoints = bp ? *bp : BasePoints;
119 float comboDamage = PointsPerComboPoint;
120
121 // base amount modification based on spell lvl vs caster lvl
122 if (ScalingMultiplier != 0.0f)
123 {
124 if (caster)
125 {
126 int32 level = caster->getLevel();
127 if (target && _spellInfo->IsPositiveEffect(_effIndex) && (Effect == SPELL_EFFECT_APPLY_AURA))
128 level = target->getLevel();
129
130 if (GtSpellScalingEntry const* gtScaling = sGtSpellScalingStore.LookupEntry((_spellInfo->ScalingClass != -1 ? _spellInfo->ScalingClass - 1 : MAX_CLASSES - 1) * 100 + level - 1))
131 {
132 float multiplier = gtScaling->value;
133 if (_spellInfo->CastTimeMax > 0 && _spellInfo->CastTimeMaxLevel > level)
134 multiplier *= float(_spellInfo->CastTimeMin + (level - 1) * (_spellInfo->CastTimeMax - _spellInfo->CastTimeMin) / (_spellInfo->CastTimeMaxLevel - 1)) / float(_spellInfo->CastTimeMax);
135 if (_spellInfo->CoefLevelBase > level)
136 multiplier *= (1.0f - _spellInfo->CoefBase) * (float)(level - 1) / (float)(_spellInfo->CoefLevelBase - 1) + _spellInfo->CoefBase;
137
138 float preciseBasePoints = ScalingMultiplier * multiplier;
140 {
141 float delta = DeltaScalingMultiplier * ScalingMultiplier * multiplier * 0.5f;
142 preciseBasePoints += frand(-delta, delta);
143 }
144
145 basePoints = int32(preciseBasePoints);
146
148 comboDamage = ComboScalingMultiplier * multiplier;
149 }
150 }
151 }
152 else
153 {
154 if (caster)
155 {
156 int32 level = int32(caster->getLevel());
157 if (level > int32(_spellInfo->MaxLevel) && _spellInfo->MaxLevel > 0)
158 level = int32(_spellInfo->MaxLevel);
159 else if (level < int32(_spellInfo->BaseLevel))
160 level = int32(_spellInfo->BaseLevel);
161 level -= int32(_spellInfo->SpellLevel);
162 basePoints += int32(level * basePointsPerLevel);
163 }
164
165 // roll in a range <1;EffectDieSides> as of patch 3.3.3
166 int32 randomPoints = int32(DieSides);
167 switch (randomPoints)
168 {
169 case 0: break;
170 case 1: basePoints += 1; break; // range 1..1
171 default:
172 {
173 // range can have positive (1..rand) and negative (rand..1) values, so order its for irand
174 int32 randvalue = (randomPoints >= 1)
175 ? std::rand() % randomPoints + 1
176 : std::rand() % 1 + randomPoints;
177
178 basePoints += randvalue;
179 break;
180 }
181 }
182 }
183
184 float value = float(basePoints);
185
186 // random damage
187 if (caster)
188 {
189 // bonus amount from combo points
190 if (caster->m_movedPlayer && comboDamage)
191 if (uint8 comboPoints = caster->m_movedPlayer->GetComboPoints())
192 value += comboDamage * comboPoints;
193
194 value = caster->ApplyEffectModifiers(_spellInfo, _effIndex, value);
195
196 // amount multiplication based on caster's level
197/* REVIEW - MERGE <<<<<<< HEAD
198 if (!_spellInfo->GetSpellScaling() && !basePointsPerLevel && (_spellInfo->Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION && _spellInfo->SpellLevel) &&
199 Effect != SPELL_EFFECT_WEAPON_PERCENT_DAMAGE &&
200 Effect != SPELL_EFFECT_KNOCK_BACK &&
201 Effect != SPELL_EFFECT_ADD_EXTRA_ATTACKS &&
202 ApplyAuraName != SPELL_AURA_MOD_SPEED_ALWAYS &&
203 ApplyAuraName != SPELL_AURA_MOD_SPEED_NOT_STACK &&
204 ApplyAuraName != SPELL_AURA_MOD_INCREASE_SPEED &&
205 ApplyAuraName != SPELL_AURA_MOD_DECREASE_SPEED)
206 //there are many more: slow speed, -healing pct
207 value *= 0.25f * exp(caster->getLevel() * (70 - _spellInfo->SpellLevel) / 1000.0f);
208 //value = int32(value * (int32)getLevel() / (int32)(_spellInfo->spellLevel ? _spellInfo->spellLevel : 1));
209======= */
210 if (!caster->IsControlledByPlayer() &&
211 _spellInfo->SpellLevel && _spellInfo->SpellLevel != caster->getLevel() &&
212 !basePointsPerLevel && (_spellInfo->Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION))
213 {
214 bool canEffectScale = false;
215 switch (Effect)
216 {
229 canEffectScale = true;
230 break;
231 default:
232 break;
233 }
234
235 switch (ApplyAuraName)
236 {
238 case SPELL_AURA_DUMMY:
246 canEffectScale = true;
247 break;
248 default:
249 break;
250 }
251
252 if (canEffectScale)
253 value *= 0.25f * exp(caster->getLevel() * (100 - _spellInfo->SpellLevel) / 1000.0f);
254 }
255 // REVIEW - MERGE >>>>>>> master
256 }
257
258 return int32(value);
259}
260
265
267{
268 float multiplier = BonusMultiplier;
269 if (Player* modOwner = (caster ? caster->GetSpellModOwner() : NULL))
270 modOwner->ApplySpellMod(_spellInfo->Id, SPELLMOD_BONUS_MULTIPLIER, multiplier, spell);
271 return multiplier;
272}
273
275{
276 float multiplier = ValueMultiplier;
277 if (Player* modOwner = (caster ? caster->GetSpellModOwner() : NULL))
278 modOwner->ApplySpellMod(_spellInfo->Id, SPELLMOD_VALUE_MULTIPLIER, multiplier, spell);
279 return multiplier;
280}
281
283{
284 float multiplier = DamageMultiplier;
285 if (Player* modOwner = (caster ? caster->GetSpellModOwner() : NULL))
286 modOwner->ApplySpellMod(_spellInfo->Id, SPELLMOD_DAMAGE_MULTIPLIER, multiplier, spell);
287 return multiplier;
288}
289
291{
292 return RadiusEntry != NULL;
293}
294
296{
297 return MaxRadiusEntry != NULL;
298}
299
300float SpellEffectInfo::CalcRadius(Unit* caster, Spell* spell) const
301{
303 {
304 HasRadius(),
305 RadiusEntry ? RadiusEntry->RadiusMin : 0.0f,
306 RadiusEntry ? RadiusEntry->RadiusPerLevel : 0.0f,
307 RadiusEntry ? RadiusEntry->RadiusMax : 0.0f,
308 HasMaxRadius(),
309 MaxRadiusEntry ? MaxRadiusEntry->RadiusMin : 0.0f,
310 caster != NULL,
311 caster ? uint8(caster->getLevel()) : uint8(0)
312 };
313
314 float radius = Skyfire::Spells::CalculateRadius(data);
315 if (HasRadius() && caster)
316 if (Player* modOwner = caster->GetSpellModOwner())
317 modOwner->ApplySpellMod(_spellInfo->Id, SPELLMOD_RADIUS, radius, spell);
318
319 return radius;
320}
321
323{
324 return GetTargetFlagMask(TargetA.GetObjectType()) | GetTargetFlagMask(TargetB.GetObjectType());
325}
326
327uint32 SpellEffectInfo::GetMissingTargetMask(bool srcSet /*= false*/, bool dstSet /*= false*/, uint32 mask /*=0*/) const
328{
329 uint32 effImplicitTargetMask = GetTargetFlagMask(GetUsedTargetObjectType());
330 uint32 providedTargetMask = GetTargetFlagMask(TargetA.GetObjectType()) | GetTargetFlagMask(TargetB.GetObjectType()) | mask;
331
332 // remove all flags covered by effect target mask
333 if (providedTargetMask & TARGET_FLAG_UNIT_MASK)
334 effImplicitTargetMask &= ~(TARGET_FLAG_UNIT_MASK);
335 if (providedTargetMask & TARGET_FLAG_CORPSE_MASK)
336 effImplicitTargetMask &= ~(TARGET_FLAG_UNIT_MASK | TARGET_FLAG_CORPSE_MASK);
337 if (providedTargetMask & TARGET_FLAG_GAMEOBJECT_ITEM)
339 if (providedTargetMask & TARGET_FLAG_GAMEOBJECT)
340 effImplicitTargetMask &= ~(TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_GAMEOBJECT_ITEM);
341 if (providedTargetMask & TARGET_FLAG_ITEM)
342 effImplicitTargetMask &= ~(TARGET_FLAG_ITEM | TARGET_FLAG_GAMEOBJECT_ITEM);
343 if (dstSet || providedTargetMask & TARGET_FLAG_DEST_LOCATION)
344 effImplicitTargetMask &= ~(TARGET_FLAG_DEST_LOCATION);
345 if (srcSet || providedTargetMask & TARGET_FLAG_SOURCE_LOCATION)
346 effImplicitTargetMask &= ~(TARGET_FLAG_SOURCE_LOCATION);
347
348 return effImplicitTargetMask;
349}
350
355
357{
358 return _data[Effect].UsedTargetObjectType;
359}
360
362{
363 // implicit target type used target object type
365 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 1 SPELL_EFFECT_INSTAKILL
366 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 2 SPELL_EFFECT_SCHOOL_DAMAGE
367 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 3 SPELL_EFFECT_DUMMY
368 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 4 SPELL_EFFECT_PORTAL_TELEPORT
369 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT_AND_DEST}, // 5 SPELL_EFFECT_TELEPORT_UNITS
370 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 6 SPELL_EFFECT_APPLY_AURA
371 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 7 SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
372 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 8 SPELL_EFFECT_POWER_DRAIN
373 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 9 SPELL_EFFECT_HEALTH_LEECH
376 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 12 SPELL_EFFECT_PORTAL
377 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 13 SPELL_EFFECT_RITUAL_BASE
378 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 14 SPELL_EFFECT_RITUAL_SPECIALIZE
379 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 15 SPELL_EFFECT_RITUAL_ACTIVATE_PORTAL
380 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 16 SPELL_EFFECT_QUEST_COMPLETE
381 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 17 SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL
383 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 19 SPELL_EFFECT_ADD_EXTRA_ATTACKS
384 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 20 SPELL_EFFECT_DODGE
385 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 21 SPELL_EFFECT_EVADE
386 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 22 SPELL_EFFECT_PARRY
387 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 23 SPELL_EFFECT_BLOCK
388 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 24 SPELL_EFFECT_CREATE_ITEM
389 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 25 SPELL_EFFECT_WEAPON
390 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 26 SPELL_EFFECT_DEFENSE
391 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 27 SPELL_EFFECT_PERSISTENT_AREA_AURA
392 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 28 SPELL_EFFECT_SUMMON
394 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 30 SPELL_EFFECT_ENERGIZE
395 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 31 SPELL_EFFECT_WEAPON_PERCENT_DAMAGE
396 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 32 SPELL_EFFECT_TRIGGER_MISSILE
398 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 34 SPELL_EFFECT_SUMMON_CHANGE_ITEM
399 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 35 SPELL_EFFECT_APPLY_AREA_AURA_PARTY
400 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 36 SPELL_EFFECT_LEARN_SPELL
401 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 37 SPELL_EFFECT_SPELL_DEFENSE
402 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 38 SPELL_EFFECT_DISPEL
403 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 39 SPELL_EFFECT_LANGUAGE
404 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 40 SPELL_EFFECT_DUAL_WIELD
406 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 42 SPELL_EFFECT_JUMP_DEST
407 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT_AND_DEST}, // 43 SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER
408 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 44 SPELL_EFFECT_SKILL_STEP
409 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 45 SPELL_EFFECT_ADD_HONOR
410 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 46 SPELL_EFFECT_SPAWN
411 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 47 SPELL_EFFECT_TRADE_SKILL
412 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 48 SPELL_EFFECT_STEALTH
413 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 49 SPELL_EFFECT_DETECT
414 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 50 SPELL_EFFECT_TRANS_DOOR
415 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 51 SPELL_EFFECT_FORCE_CRITICAL_HIT
416 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 52 SPELL_EFFECT_GUARANTEE_HIT
417 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 53 SPELL_EFFECT_ENCHANT_ITEM
418 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 54 SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY
419 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 55 SPELL_EFFECT_TAMECREATURE
420 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 56 SPELL_EFFECT_SUMMON_PET
421 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 57 SPELL_EFFECT_LEARN_PET_SPELL
422 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 58 SPELL_EFFECT_WEAPON_DAMAGE
423 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 59 SPELL_EFFECT_CREATE_RANDOM_ITEM
424 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 60 SPELL_EFFECT_PROFICIENCY
425 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 61 SPELL_EFFECT_SEND_EVENT
426 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 62 SPELL_EFFECT_POWER_BURN
427 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 63 SPELL_EFFECT_THREAT
428 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 64 SPELL_EFFECT_TRIGGER_SPELL
429 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 65 SPELL_EFFECT_APPLY_AREA_AURA_RAID
430 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 66 SPELL_EFFECT_CREATE_MANA_GEM
431 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 67 SPELL_EFFECT_HEAL_MAX_HEALTH
432 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 68 SPELL_EFFECT_INTERRUPT_CAST
435 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 71 SPELL_EFFECT_PICKPOCKET
436 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 72 SPELL_EFFECT_ADD_FARSIGHT
437 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 73 SPELL_EFFECT_UNTRAIN_TALENTS
438 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 74 SPELL_EFFECT_APPLY_GLYPH
439 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 75 SPELL_EFFECT_HEAL_MECHANICAL
440 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 76 SPELL_EFFECT_SUMMON_OBJECT_WILD
441 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 77 SPELL_EFFECT_SCRIPT_EFFECT
442 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 78 SPELL_EFFECT_ATTACK
443 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 79 SPELL_EFFECT_SANCTUARY
444 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 80 SPELL_EFFECT_ADD_COMBO_POINTS
445 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 81 SPELL_EFFECT_CREATE_HOUSE
446 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 82 SPELL_EFFECT_BIND_SIGHT
448 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 84 SPELL_EFFECT_STUCK
449 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 85 SPELL_EFFECT_SUMMON_PLAYER
450 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_GOBJ}, // 86 SPELL_EFFECT_ACTIVATE_OBJECT
451 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_GOBJ}, // 87 SPELL_EFFECT_GAMEOBJECT_DAMAGE
452 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_GOBJ}, // 88 SPELL_EFFECT_GAMEOBJECT_REPAIR
453 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_GOBJ}, // 89 SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE
454 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 90 SPELL_EFFECT_KILL_CREDIT
455 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 91 SPELL_EFFECT_THREAT_ALL
456 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 92 SPELL_EFFECT_ENCHANT_HELD_ITEM
457 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 93 SPELL_EFFECT_FORCE_DESELECT
458 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 94 SPELL_EFFECT_SELF_RESURRECT
459 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 95 SPELL_EFFECT_SKINNING
460 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 96 SPELL_EFFECT_CHARGE
461 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 97 SPELL_EFFECT_CAST_BUTTON
462 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 98 SPELL_EFFECT_KNOCK_BACK
463 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 99 SPELL_EFFECT_DISENCHANT
464 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 100 SPELL_EFFECT_INEBRIATE
465 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 101 SPELL_EFFECT_FEED_PET
466 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 102 SPELL_EFFECT_DISMISS_PET
467 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 103 SPELL_EFFECT_REPUTATION
468 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 104 SPELL_EFFECT_SUMMON_OBJECT_SLOT1
469 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 105 SPELL_EFFECT_SUMMON_OBJECT_SLOT2
470 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 106 SPELL_EFFECT_SUMMON_OBJECT_SLOT3
471 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 107 SPELL_EFFECT_SUMMON_OBJECT_SLOT4
472 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 108 SPELL_EFFECT_DISPEL_MECHANIC
473 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 109 SPELL_EFFECT_SUMMON_DEAD_PET
474 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 110 SPELL_EFFECT_DESTROY_ALL_TOTEMS
475 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 111 SPELL_EFFECT_DURABILITY_DAMAGE
477 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_CORPSE_ALLY}, // 113 SPELL_EFFECT_RESURRECT_NEW
478 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 114 SPELL_EFFECT_ATTACK_ME
479 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 115 SPELL_EFFECT_DURABILITY_DAMAGE_PCT
480 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_CORPSE_ENEMY}, // 116 SPELL_EFFECT_SKIN_PLAYER_CORPSE
481 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 117 SPELL_EFFECT_SPIRIT_HEAL
482 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 118 SPELL_EFFECT_SKILL
483 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 119 SPELL_EFFECT_APPLY_AREA_AURA_PET
484 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 120 SPELL_EFFECT_TELEPORT_GRAVEYARD
485 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 121 SPELL_EFFECT_NORMALIZED_WEAPON_DMG
486 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 122 SPELL_EFFECT_122
487 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 123 SPELL_EFFECT_SEND_TAXI
488 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 124 SPELL_EFFECT_PULL_TOWARDS
489 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 125 SPELL_EFFECT_MODIFY_THREAT_PERCENT
490 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 126 SPELL_EFFECT_STEAL_BENEFICIAL_BUFF
491 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 127 SPELL_EFFECT_PROSPECTING
492 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 128 SPELL_EFFECT_APPLY_AREA_AURA_FRIEND
493 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 129 SPELL_EFFECT_APPLY_AREA_AURA_ENEMY
494 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 130 SPELL_EFFECT_REDIRECT_THREAT
495 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 131 SPELL_EFFECT_PLAY_SOUND
496 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 132 SPELL_EFFECT_PLAY_MUSIC
497 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 133 SPELL_EFFECT_UNLEARN_SPECIALIZATION
498 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 134 SPELL_EFFECT_KILL_CREDIT2
499 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 135 SPELL_EFFECT_CALL_PET
500 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 136 SPELL_EFFECT_HEAL_PCT
501 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 137 SPELL_EFFECT_ENERGIZE_PCT
502 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 138 SPELL_EFFECT_LEAP_BACK
503 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 139 SPELL_EFFECT_CLEAR_QUEST
504 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 140 SPELL_EFFECT_FORCE_CAST
505 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 141 SPELL_EFFECT_FORCE_CAST_WITH_VALUE
506 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 142 SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE
507 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 143 SPELL_EFFECT_APPLY_AREA_AURA_OWNER
508 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT_AND_DEST}, // 144 SPELL_EFFECT_KNOCK_BACK_DEST
509 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT_AND_DEST}, // 145 SPELL_EFFECT_PULL_TOWARDS_DEST
510 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 146 SPELL_EFFECT_ACTIVATE_RUNE
511 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 147 SPELL_EFFECT_QUEST_FAIL
512 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 148 SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE
513 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 149 SPELL_EFFECT_CHARGE_DEST
514 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 150 SPELL_EFFECT_QUEST_START
515 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 151 SPELL_EFFECT_TRIGGER_SPELL_2
516 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 152 SPELL_EFFECT_SUMMON_RAF_FRIEND
517 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 153 SPELL_EFFECT_CREATE_TAMED_PET
518 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 154 SPELL_EFFECT_DISCOVER_TAXI
519 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 155 SPELL_EFFECT_TITAN_GRIP
520 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 156 SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC
521 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 157 SPELL_EFFECT_CREATE_ITEM_2
522 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 158 SPELL_EFFECT_MILLING
523 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 159 SPELL_EFFECT_ALLOW_RENAME_PET
525 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 161 SPELL_EFFECT_TALENT_SPEC_COUNT
526 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 162 SPELL_EFFECT_TALENT_SPEC_SELECT
528 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 164 SPELL_EFFECT_REMOVE_AURA
530 {EFFECT_IMPLICIT_TARGET_CASTER, TARGET_OBJECT_TYPE_UNIT}, // 166 SPELL_EFFECT_GIVE_CURRENCY
533 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_ITEM}, // 169 SPELL_EFFECT_DESTROY_ITEM
535 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 171 SPELL_EFFECT_171
537 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 173 SPELL_EFFECT_UNLOCK_GUILD_VAULT_TAB
539 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 175 SPELL_EFFECT_175
542 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 178 SPELL_EFFECT_178
543 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 179 SPELL_EFFECT_CREATE_AREATRIGGER
544 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 180 SPELL_EFFECT_180
545 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 181 SPELL_EFFECT_181
546 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 182 SPELL_EFFECT_182
547};
548
549SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntry const** effects)
550{
551 Id = spellEntry->Id;
552
553 SpellMiscEntry const* spellMisc = sSpellMiscStore.LookupEntry(spellEntry->SpellMiscId);
554
555 Attributes = spellMisc ? spellMisc->Attributes : 0;
556 AttributesEx = spellMisc ? spellMisc->AttributesEx : 0;
557 AttributesEx2 = spellMisc ? spellMisc->AttributesEx2 : 0;
558 AttributesEx3 = spellMisc ? spellMisc->AttributesEx3 : 0;
559 AttributesEx4 = spellMisc ? spellMisc->AttributesEx4 : 0;
560 AttributesEx5 = spellMisc ? spellMisc->AttributesEx5 : 0;
561 AttributesEx6 = spellMisc ? spellMisc->AttributesEx6 : 0;
562 AttributesEx7 = spellMisc ? spellMisc->AttributesEx7 : 0;
563 AttributesEx8 = spellMisc ? spellMisc->AttributesEx8 : 0;
564 AttributesEx9 = spellMisc ? spellMisc->AttributesEx9 : 0;
565 //AttributesEx10 = spellMisc ? spellMisc->AttributesEx10 : 0;
566 //AttributesEx11 = spellMisc ? spellMisc->AttributesEx11 : 0;
567 //AttributesEx12 = spellMisc ? spellMisc->AttributesEx12 : 0;
568 //AttributesEx13 = spellMisc ? spellMisc->AttributesEx13 : 0;
569 AttributesCu = 0;
570
571 uint32 _castingTimeIndex = spellMisc ? spellMisc->CastingTimeIndex : 0;
572 uint32 _durationIndex = spellMisc ? spellMisc->DurationIndex : 0;
573 uint32 _rangeEntry = spellMisc ? spellMisc->rangeIndex : 0;
574
575 CastTimeEntry = _castingTimeIndex ? sSpellCastTimesStore.LookupEntry(_castingTimeIndex) : NULL;
576 DurationEntry = _durationIndex ? sSpellDurationStore.LookupEntry(_durationIndex) : NULL;
577 RangeEntry = _rangeEntry ? sSpellRangeStore.LookupEntry(_rangeEntry) : NULL;
578
579 Speed = spellMisc ? spellMisc->speed : 0;
580
581 for (uint8 i = 0; i < 2; ++i)
582 SpellVisual[i] = spellMisc ? spellMisc->SpellVisual[i] : 0;
583
584 SpellIconID = spellMisc ? spellMisc->SpellIconID : 0;
585 ActiveIconID = spellMisc ? spellMisc->activeIconID : 0;
586 SpellName = spellEntry->SpellName;
587 //Rank = spellEntry->Rank;
588 SchoolMask = spellMisc ? spellMisc->SchoolMask : 0;
589 RuneCostID = spellEntry->runeCostID;
590 //SpellDifficultyId = spellMisc ? spellMisc->SpellDifficultyID : 0;
591 SpellScalingId = spellEntry->SpellScalingId;
600 SpellLevelsId = spellEntry->SpellLevelsId;
601 SpellReagentsId = spellEntry->SpellReagentsId;
604 SpellTotemsId = spellEntry->SpellTotemsId;
605 ResearchProject = spellEntry->ResearchProject;
606
607 // SpellDifficultyEntry
608 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
609 Effects[i] = SpellEffectInfo(spellEntry, this, i, effects[i]);
610
611 // SpellScalingEntry
612 SpellScalingEntry const* _scaling = GetSpellScaling();
613 CastTimeMin = _scaling ? _scaling->CastTimeMin : 0;
614 CastTimeMax = _scaling ? _scaling->CastTimeMax : 0;
615 CastTimeMaxLevel = _scaling ? _scaling->CastTimeMaxLevel : 0;
616 ScalingClass = _scaling ? _scaling->ScalingClass : 0;
617 CoefBase = _scaling ? _scaling->CoefBase : 0;
618 CoefLevelBase = _scaling ? _scaling->CoefLevelBase : 0;
619
620 // SpellAuraOptionsEntry
621 SpellAuraOptionsEntry const* _options = GetSpellAuraOptions();
622 ProcFlags = _options ? _options->procFlags : 0;
623 ProcChance = _options ? _options->procChance : 0;
624 ProcCharges = _options ? _options->procCharges : 0;
625 StackAmount = _options ? _options->StackAmount : 0;
626
627 // SpellAuraRestrictionsEntry
629 CasterAuraState = _aura ? _aura->CasterAuraState : 0;
630 TargetAuraState = _aura ? _aura->TargetAuraState : 0;
631 CasterAuraStateNot = _aura ? _aura->CasterAuraStateNot : 0;
632 TargetAuraStateNot = _aura ? _aura->TargetAuraStateNot : 0;
633 CasterAuraSpell = _aura ? _aura->casterAuraSpell : 0;
634 TargetAuraSpell = _aura ? _aura->targetAuraSpell : 0;
637
638 // SpellCastingRequirementsEntry
640 RequiresSpellFocus = _castreq ? _castreq->RequiresSpellFocus : 0;
641 FacingCasterFlags = _castreq ? _castreq->FacingCasterFlags : 0;
642 AreaGroupId = _castreq ? _castreq->AreaGroupId : -1;
643
644 // SpellCategoriesEntry
645 SpellCategoriesEntry const* _categorie = GetSpellCategories();
646 CategoryEntry = _categorie ? sSpellCategoryStore.LookupEntry(_categorie->Category) : NULL;
647 Dispel = _categorie ? _categorie->Dispel : 0;
648 Mechanic = _categorie ? _categorie->Mechanic : 0;
649 StartRecoveryCategory = _categorie ? _categorie->StartRecoveryCategory : 0;
650 DmgClass = _categorie ? _categorie->DmgClass : 0;
651 PreventionType = _categorie ? _categorie->PreventionType : 0;
652
653 // SpellClassOptionsEntry
655 SpellFamilyName = _class ? _class->SpellFamilyName : 0;
656 SpellFamilyFlags = _class ? _class->SpellFamilyFlags : flag128(0);
657
658 // SpellCooldownsEntry
659 SpellCooldownsEntry const* _cooldowns = GetSpellCooldowns();
660 RecoveryTime = _cooldowns ? _cooldowns->RecoveryTime : 0;
661 CategoryRecoveryTime = _cooldowns ? _cooldowns->CategoryRecoveryTime : 0;
662 StartRecoveryTime = _cooldowns ? _cooldowns->StartRecoveryTime : 0;
663
664 // SpellEquippedItemsEntry
666 EquippedItemClass = _equipped ? _equipped->EquippedItemClass : -1;
667 EquippedItemSubClassMask = _equipped ? _equipped->EquippedItemSubClassMask : -1;
669
670 // SpellInterruptsEntry
671 SpellInterruptsEntry const* _interrupt = GetSpellInterrupts();
672 InterruptFlags = _interrupt ? _interrupt->InterruptFlags : 0;
673 AuraInterruptFlags = _interrupt ? _interrupt->AuraInterruptFlags : 0;
674 ChannelInterruptFlags = _interrupt ? _interrupt->ChannelInterruptFlags : 0;
675
676 // SpellLevelsEntry
677 SpellLevelsEntry const* _levels = GetSpellLevels();
678 MaxLevel = _levels ? _levels->maxLevel : 0;
679 BaseLevel = _levels ? _levels->baseLevel : 0;
680 SpellLevel = _levels ? _levels->spellLevel : 0;
681
682 // SpellReagentsEntry
683 SpellReagentsEntry const* _reagents = GetSpellReagents();
684 for (uint8 i = 0; i < MAX_SPELL_REAGENTS; ++i)
685 Reagent[i] = _reagents ? _reagents->Reagent[i] : 0;
686 for (uint8 i = 0; i < MAX_SPELL_REAGENTS; ++i)
687 ReagentCount[i] = _reagents ? _reagents->ReagentCount[i] : 0;
688
689 // SpellShapeshiftEntry
690 SpellShapeshiftEntry const* _shapeshift = GetSpellShapeshift();
691 Stances = _shapeshift ? _shapeshift->Stances : 0;
692 StancesNot = _shapeshift ? _shapeshift->StancesNot : 0;
693
694 // SpellTargetRestrictionsEntry
696 Targets = _target ? _target->Targets : 0;
697 TargetCreatureType = _target ? _target->TargetCreatureType : 0;
698 MaxAffectedTargets = _target ? _target->MaxAffectedTargets : 0;
699
700 // SpellTotemsEntry
701 SpellTotemsEntry const* _totem = GetSpellTotems();
702 for (uint8 i = 0; i < 2; ++i)
703 TotemCategory[i] = _totem ? _totem->TotemCategory[i] : 0;
704 for (uint8 i = 0; i < 2; ++i)
705 Totem[i] = _totem ? _totem->Totem[i] : 0;
706
707 /*
708 // SpecializationSpellsEntry
709 SpecializationSpellsEntry const* specializationInfo = NULL;
710 for (uint32 i = 0; i < sSpecializationSpellsStore.GetNumRows(); i++)
711 {
712 specializationInfo = sSpecializationSpellsStore.LookupEntry(i);
713 if (!specializationInfo)
714 continue;
715
716 if (specializationInfo->SpellId == Id)
717 SpecializationIdList.push_back(specializationInfo->SpecializationId);
718
719 if (specializationInfo->RemovesSpellId == Id)
720 OverrideSpellList.push_back(specializationInfo->SpellId);
721 }
722
723 switch (Id)
724 {
725 case 31801:
726 SpecializationIdList.push_back(70);
727 SpecializationIdList.push_back(66);
728 case 105361:
729 OverrideSpellList.push_back(31801);
730 break;
731 }
732 */
733 ChainEntry = NULL;
734}
735
740
742{
743 return CategoryEntry ? CategoryEntry->Id : 0;
744}
745
747{
748 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
749 if (Effects[i].IsEffect(effect))
750 return true;
751 return false;
752}
753
755{
756 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
757 if (Effects[i].IsAura(aura))
758 return true;
759 return false;
760}
761
763{
764 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
765 if (Effects[i].IsAreaAuraEffect())
766 return true;
767 return false;
768}
769
771{
772 return ((Effects[0].Effect == SPELL_EFFECT_CREATE_RANDOM_ITEM
773 || Effects[0].Effect == SPELL_EFFECT_CREATE_ITEM_2)
774 && Effects[1].Effect == SPELL_EFFECT_SCRIPT_EFFECT)
775 || Id == 64323;
776}
777
779{
780 return (Effects[0].Effect == SPELL_EFFECT_CREATE_RANDOM_ITEM ||
781 // different random cards from Inscription (121==Virtuoso Inking Set category) r without explicit item
782 (Effects[0].Effect == SPELL_EFFECT_CREATE_ITEM_2 &&
783 ((TotemCategory[0] != 0 || (Totem[0] != 0 && SpellIconID == 1)) || Effects[0].ItemType == 0)));
784}
785
787{
788 return Effects[0].Effect == SPELL_EFFECT_THREAT && Effects[1].Effect == SPELL_EFFECT_APPLY_AURA && Effects[1].ApplyAuraName == SPELL_AURA_DUMMY;
789}
790
792{
793 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
794 {
795 if (Effects[i].Effect == SPELL_EFFECT_SKILL)
796 {
797 uint32 skill = Effects[i].MiscValue;
798
799 if (IsProfessionOrRidingSkill(skill))
800 return true;
801 }
802 }
803 return false;
804}
805
807{
808 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
809 {
810 if (Effects[i].Effect == SPELL_EFFECT_SKILL)
811 {
812 uint32 skill = Effects[i].MiscValue;
813
814 if (IsProfessionSkill(skill))
815 return true;
816 }
817 }
818 return false;
819}
820
822{
823 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
824 {
825 if (Effects[i].Effect == SPELL_EFFECT_SKILL)
826 {
827 uint32 skill = Effects[i].MiscValue;
828
829 if (IsPrimaryProfessionSkill(skill))
830 return true;
831 }
832 }
833 return false;
834}
835
837{
838 return IsPrimaryProfession() && GetRank() == 1;
839}
840
842{
843 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(Id);
844
845 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
846 {
847 SkillLineAbilityEntry const* pAbility = _spell_idx->second;
848 if (!pAbility || pAbility->learnOnGetSkill != ABILITY_LEARNED_ON_GET_PROFESSION_SKILL)
849 continue;
850
851 if (pAbility->req_skill_value > 0)
852 return true;
853 }
854
855 return false;
856}
857
859{
860 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(Id);
861
862 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
863 if (_spell_idx->second->skillId == uint32(skillType))
864 return true;
865
866 return false;
867}
868
870{
871 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
872 if (Effects[i].IsEffect() && (Effects[i].IsTargetingArea() || Effects[i].IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA) || Effects[i].IsAreaAuraEffect()))
873 return true;
874 return false;
875}
876
877// checks if spell targets are selected from area, doesn't include spell effects in check (like area wide auras for example)
879{
880 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
881 if (Effects[i].IsEffect() && Effects[i].IsTargetingArea())
882 return true;
883 return false;
884}
885
890
891bool SpellInfo::NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) const
892{
894 return true;
895
896 /*
897 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
898 {
899 if (Effects[i].IsEffect())
900 {
901 if (Effects[i].TargetA.GetSelectionCategory() == TARGET_SELECT_CATEGORY_CHANNEL
902 || Effects[i].TargetB.GetSelectionCategory() == TARGET_SELECT_CATEGORY_CHANNEL)
903 return true;
904 }
905 }
906 */
907
908 if (triggeringSpell->IsChanneled())
909 {
910 uint32 mask = 0;
911 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
912 {
913 if (Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER && Effects[i].TargetA.GetTarget() != TARGET_DEST_CASTER
914 && Effects[i].TargetB.GetTarget() != TARGET_UNIT_CASTER && Effects[i].TargetB.GetTarget() != TARGET_DEST_CASTER)
915 {
916 mask |= Effects[i].GetProvidedTargetMask();
917 }
918 }
919
920 if (mask & TARGET_FLAG_UNIT_MASK)
921 return true;
922 }
923
924 return false;
925}
926
928{
930}
931
933{
935 return false;
937 return false;
938 return true;
939}
940
942{
943 if (IsPassive())
944 return false;
945 //if (m_powerType != POWER_MANA && PowerType != POWER_HEALTH)
946 // return false;
948 return false;
949
951 return false;
952
953 // All stance spells. if any better way, change it.
954 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
955 {
956 switch (SpellFamilyName)
957 {
959 // Paladin aura Spell
961 return false;
962 break;
964 // Druid form Spell
965 if (Effects[i].Effect == SPELL_EFFECT_APPLY_AURA &&
966 Effects[i].ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT)
967 return false;
968 break;
969 }
970 }
971 return true;
972}
973
978
980{
981 return IsPassive() || Id == 55849 || Id == 40075 || Id == 44413; // Power Spark, Fel Flak Fire, Incanter's Absorption
982}
983
989
994
999
1004
1009
1014
1016{
1018}
1019
1021{
1022 switch (effIndex)
1023 {
1024 default:
1025 case 0:
1027 case 1:
1029 case 2:
1031 }
1032}
1033
1038
1043
1048
1050{
1051 return (SpellFamilyName == SPELLFAMILY_HUNTER && !(SpellFamilyFlags[1] & 0x10000000)) // for 53352, cannot find better way
1053}
1054
1059
1064
1066{
1067 if (!IsAffectedBySpellMods())
1068 return false;
1069
1070 SpellInfo const* affectSpell = sSpellMgr->GetSpellInfo(mod->spellId);
1071 // False if affect_spell == NULL or spellFamily not equal
1072 if (!affectSpell || affectSpell->SpellFamilyName != SpellFamilyName)
1073 return false;
1074
1075 // true
1076 if (mod->mask & SpellFamilyFlags)
1077 return true;
1078
1079 return false;
1080}
1081
1083{
1084 // these spells pierce all avalible spells (Resurrection Sickness for example)
1086 return true;
1087
1088 // these spells (Cyclone for example) can pierce all...
1090 // ...but not these (Divine shield for example)
1091 && !(aura && (aura->Mechanic == MECHANIC_IMMUNE_SHIELD || aura->Mechanic == MECHANIC_INVULNERABILITY)))
1092 return true;
1093
1094 return false;
1095}
1096
1098{
1099 // These spells (like Mass Dispel) can dispell all auras
1101 return true;
1102
1103 // These auras (like Divine Shield) can't be dispelled
1105 return false;
1106
1107 // These auras (Cyclone for example) are not dispelable
1109 return false;
1110
1111 return true;
1112}
1113
1115{
1116 // all other single target spells have if it has AttributesEx5
1118 return true;
1119
1120 switch (GetSpellSpecific())
1121 {
1123 return true;
1124 default:
1125 break;
1126 }
1127
1128 return false;
1129}
1130
1132{
1133 SpellSpecificType spellSpec1 = GetSpellSpecific();
1134 SpellSpecificType spellSpec2 = spellInfo->GetSpellSpecific();
1135 switch (spellSpec1)
1136 {
1147 return spellSpec1 == spellSpec2;
1149 return spellSpec2 == SPELL_SPECIFIC_FOOD
1150 || spellSpec2 == SPELL_SPECIFIC_FOOD_AND_DRINK;
1152 return spellSpec2 == SPELL_SPECIFIC_DRINK
1153 || spellSpec2 == SPELL_SPECIFIC_FOOD_AND_DRINK;
1155 return spellSpec2 == SPELL_SPECIFIC_FOOD
1156 || spellSpec2 == SPELL_SPECIFIC_DRINK
1157 || spellSpec2 == SPELL_SPECIFIC_FOOD_AND_DRINK;
1158 default:
1159 return false;
1160 }
1161}
1162
1164{
1165 SpellSpecificType spellSpec = GetSpellSpecific();
1166 switch (spellSpec)
1167 {
1177 return spellSpec == spellInfo->GetSpellSpecific();
1178 default:
1179 return false;
1180 }
1181}
1182
1184{
1185 // talents that learn spells can have stance requirements that need ignore
1186 // (this requirement only for client-side stance show in talent description)
1187 if (GetTalentSpellCost(Id) > 0 &&
1190
1191 uint32 stanceMask = (form ? 1 << (form - 1) : 0);
1192
1193 if (stanceMask & StancesNot) // can explicitly not be casted in this stance
1195
1196 if (stanceMask & Stances) // can explicitly be casted in this stance
1198
1199 bool actAsShifted = false;
1200 SpellShapeshiftFormEntry const* shapeInfo = NULL;
1201 if (form > 0)
1202 {
1203 shapeInfo = sSpellShapeshiftFormStore.LookupEntry(form);
1204 if (!shapeInfo)
1205 {
1206 SF_LOG_ERROR("spells", "GetErrorAtShapeshiftedCast: unknown shapeshift %u", form);
1208 }
1209 actAsShifted = !(shapeInfo->flags1 & 1); // shapeshift acts as normal form for spells
1210 }
1211
1212 if (actAsShifted)
1213 {
1214 if (Attributes & SPELL_ATTR0_NOT_SHAPESHIFT) // not while shapeshifted
1216 else if (Stances != 0) // needs other shapeshift
1218 }
1219 else
1220 {
1221 // needs shapeshift
1224 }
1225
1226 // Check if stance disables cast of not-stance spells
1227 // Example: cannot cast any other spells in zombie or ghoul form
1229 if (shapeInfo && shapeInfo->flags1 & 0x400)
1230 {
1231 if (!(stanceMask & Stances))
1233 }
1234
1236}
1237
1239{
1240 // normal case
1241 if (AreaGroupId > 0)
1242 {
1243 bool found = false;
1244 AreaGroupEntry const* groupEntry = sAreaGroupStore.LookupEntry(AreaGroupId);
1245 while (groupEntry)
1246 {
1247 for (uint8 i = 0; i < MAX_GROUP_AREA_IDS; ++i)
1248 if (groupEntry->AreaId[i] == zone_id || groupEntry->AreaId[i] == area_id)
1249 found = true;
1250 if (found || !groupEntry->nextGroup)
1251 break;
1252 // Try search in next group
1253 groupEntry = sAreaGroupStore.LookupEntry(groupEntry->nextGroup);
1254 }
1255
1256 if (!found)
1258 }
1259
1260 // continent limitation (virtual continent)
1262 {
1263 uint32 v_map = GetVirtualMapForMapAndZone(map_id, zone_id);
1264 MapEntry const* mapEntry = sMapStore.LookupEntry(v_map);
1265 if (!mapEntry || mapEntry->addon < 1 || !mapEntry->IsContinent())
1267 }
1268
1269 // raid instance limitation
1271 {
1272 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
1273 if (!mapEntry || mapEntry->IsRaid())
1275 }
1276
1277 // DB base check (if non empty then must fit at least single for allow)
1278 SpellAreaMapBounds saBounds = sSpellMgr->GetSpellAreaMapBounds(Id);
1279 if (saBounds.first != saBounds.second)
1280 {
1281 for (SpellAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1282 {
1283 if (itr->second.IsFitToRequirements(player, zone_id, area_id))
1285 }
1287 }
1288
1289 // bg spell checks
1290 switch (Id)
1291 {
1292 case 23333: // Warsong Flag
1293 case 23335: // Silverwing Flag
1294 return ((map_id == 489 || map_id == 726) && player && player->InBattleground()) ? SpellCastResult::SPELL_CAST_OK : SpellCastResult::SPELL_FAILED_REQUIRES_AREA;
1295 case 34976: // Netherstorm Flag
1297 case 2584: // Waiting to Resurrect
1298 case 22011: // Spirit Heal Channel
1299 case 22012: // Spirit Heal
1300 case 24171: // Resurrection Impact Visual
1301 case 42792: // Recently Dropped Flag
1302 case 43681: // Inactive
1303 case 44535: // Spirit Heal (mana)
1304 {
1305 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
1306 if (!mapEntry)
1308
1309 return zone_id == 4197 || (mapEntry->IsBattleground() && player && player->InBattleground()) ? SpellCastResult::SPELL_CAST_OK : SpellCastResult::SPELL_FAILED_REQUIRES_AREA;
1310 }
1311 case 44521: // Preparation
1312 {
1313 if (!player)
1315
1316 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
1317 if (!mapEntry)
1319
1320 if (!mapEntry->IsBattleground())
1322
1323 Battleground* bg = player->GetBattleground();
1325 }
1326 case 32724: // Gold Team (Alliance)
1327 case 32725: // Green Team (Alliance)
1328 case 35774: // Gold Team (Horde)
1329 case 35775: // Green Team (Horde)
1330 {
1331 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
1332 if (!mapEntry)
1334
1336 }
1337 case 32727: // Arena Preparation
1338 {
1339 if (!player)
1341
1342 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
1343 if (!mapEntry)
1345
1346 if (!mapEntry->IsBattleArena())
1348
1349 Battleground* bg = player->GetBattleground();
1351 }
1352 }
1353
1354 // aura limitations
1355 if (player)
1356 {
1357 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
1358 {
1359 if (!Effects[i].IsAura())
1360 continue;
1361
1362 switch (Effects[i].ApplyAuraName)
1363 {
1364 case SPELL_AURA_FLY:
1365 {
1366 if (!player->IsKnowHowFlyIn(map_id, zone_id))
1368 break;
1369 }
1371 {
1372 if (SpellShapeshiftFormEntry const* spellShapeshiftForm = sSpellShapeshiftFormStore.LookupEntry(Effects[i].MiscValue))
1373 if (uint32 mountType = spellShapeshiftForm->mount_type)
1374 if (!player->GetMountCapability(mountType))
1376 break;
1377 }
1378 case SPELL_AURA_MOUNTED:
1379 {
1380 if (Effects[i].MiscValueB && !player->GetMountCapability(Effects[i].MiscValueB))
1382 break;
1383 }
1384 }
1385 }
1386 }
1387
1389}
1390
1391SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* target, bool implicit) const
1392{
1393 if (AttributesEx & SPELL_ATTR1_CANT_TARGET_SELF && caster == target)
1395
1396 // check visibility - ignore stealth for implicit (area) targets
1397 if (!(AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE) && !caster->CanSeeOrDetect(target, implicit))
1399
1400 Unit const* unitTarget = target->ToUnit();
1401
1402 // creature/player specific target checks
1403 if (unitTarget)
1404 {
1407
1408 // only spells with SPELL_ATTR3_ONLY_TARGET_GHOSTS can target ghosts
1410 {
1413 else
1415 }
1416
1417 if (caster != unitTarget)
1418 {
1419 if (caster->GetTypeId() == TypeID::TYPEID_PLAYER)
1420 {
1421 // Do not allow these spells to target creatures not tapped by us (Banish, Polymorph, many quest spells)
1423 if (Creature const* targetCreature = unitTarget->ToCreature())
1424 if (targetCreature->hasLootRecipient() && !targetCreature->isTappedBy(caster->ToPlayer()))
1426
1428 {
1429 if (unitTarget->GetTypeId() == TypeID::TYPEID_PLAYER)
1431 else if ((unitTarget->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD) == 0)
1433 }
1434
1435 // Not allow disarm unarmed player
1437 {
1438 if (unitTarget->GetTypeId() == TypeID::TYPEID_PLAYER)
1439 {
1440 Player const* player = unitTarget->ToPlayer();
1443 }
1444 else if (!unitTarget->GetUInt32Value(UNIT_FIELD_VIRTUAL_ITEM_ID))
1446 }
1447 }
1448 }
1449 }
1450 // corpse specific target checks
1451 else if (Corpse const* corpseTarget = target->ToCorpse())
1452 {
1453 // cannot target bare bones
1454 if (corpseTarget->GetType() == CorpseType::CORPSE_BONES)
1456 // we have to use owner for some checks (aura preventing resurrection for example)
1457 if (Player* owner = ObjectAccessor::FindPlayer(corpseTarget->GetOwnerGUID()))
1458 unitTarget = owner;
1459 // we're not interested in corpses without owner
1460 else
1462 }
1463 // other types of objects - always valid
1465
1466 // corpseOwner and unit specific target checks
1469
1470 if (!IsAllowingDeadTarget() && !unitTarget->IsAlive())
1472
1473 // check this flag only for implicit targets (chain and area), allow to explicitly target units for spells like Shield of Righteousness
1474 if (implicit && AttributesEx6 & SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED && !unitTarget->CanFreeMove())
1476
1477 // checked in Unit::IsValidAttack/AssistTarget, shouldn't be checked for ENTRY targets
1478 //if (!(AttributesEx6 & SPELL_ATTR6_CAN_TARGET_UNTARGETABLE) && target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
1479 // return SPELL_FAILED_BAD_TARGETS;
1480
1481 //if (!(AttributesEx6 & SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS)
1482
1483 if (!CheckTargetCreatureType(unitTarget))
1484 {
1485 if (target->GetTypeId() == TypeID::TYPEID_PLAYER)
1487 else
1489 }
1490
1491 // check GM mode and GM invisibility - only for player casts (npc casts are controlled by AI) and negative spells
1492 if (unitTarget != caster && (caster->IsControlledByPlayer() || !IsPositive()) && unitTarget->GetTypeId() == TypeID::TYPEID_PLAYER)
1493 {
1494 if (!unitTarget->ToPlayer()->IsVisible())
1496
1497 if (unitTarget->ToPlayer()->IsGameMaster())
1499 }
1500
1501 // not allow casting on flying player
1502 if (unitTarget->HasUnitState(UNIT_STATE_IN_FLIGHT))
1504
1505 /* TARGET_UNIT_MASTER gets blocked here for passengers, because the whole idea of this check is to
1506 not allow passengers to be implicitly hit by spells, however this target type should be an exception,
1507 if this is left it kills spells that award kill credit from vehicle to master (few spells),
1508 the use of these 2 covers passenger target check, logically, if vehicle cast this to master it should always hit
1509 him, because it would be it's passenger, there's no such case where this gets to fail legitimacy, this problem
1510 cannot be solved from within the check in other way since target type cannot be called for the spell currently
1511 Spell examples: [ID - 52864 Devour Water, ID - 52862 Devour Wind, ID - 49370 Wyrmrest Defender: Destabilize Azure Dragonshrine Effect] */
1512 if (!caster->IsVehicle() && !(caster->GetCharmerOrOwner() == target))
1513 {
1514 if (TargetAuraState && !unitTarget->HasAuraState(AuraStateType(TargetAuraState), this, caster))
1516
1517 if (TargetAuraStateNot && unitTarget->HasAuraState(AuraStateType(TargetAuraStateNot), this, caster))
1519 }
1520
1521 if (TargetAuraSpell && !unitTarget->HasAura(sSpellMgr->GetSpellIdForDifficulty(TargetAuraSpell, caster)))
1523
1524 if (ExcludeTargetAuraSpell && unitTarget->HasAura(sSpellMgr->GetSpellIdForDifficulty(ExcludeTargetAuraSpell, caster)))
1526
1530
1532}
1533
1534SpellCastResult SpellInfo::CheckExplicitTarget(Unit const* caster, WorldObject const* target, Item const* itemTarget) const
1535{
1536 uint32 neededTargets = GetExplicitTargetMask();
1537 if (!target)
1538 {
1540 if (!(neededTargets & TARGET_FLAG_GAMEOBJECT_ITEM) || !itemTarget)
1543 }
1544
1545 if (GameObject const* gameobjectTarget = target->ToGameObject())
1546 {
1547 if (neededTargets & (TARGET_FLAG_GAMEOBJECT))
1548 {
1549 if (caster->GetDistance(gameobjectTarget) > (GetMaxRange()))
1551
1553 }
1554 }
1555
1556 if (Unit const* unitTarget = target->ToUnit())
1557 {
1559 {
1560 if (neededTargets & TARGET_FLAG_UNIT_ENEMY)
1561 if (caster->_IsValidAttackTarget(unitTarget, this))
1563 if (neededTargets & TARGET_FLAG_UNIT_ALLY
1564 || (neededTargets & TARGET_FLAG_UNIT_PARTY && caster->IsInPartyWith(unitTarget))
1565 || (neededTargets & TARGET_FLAG_UNIT_RAID && caster->IsInRaidWith(unitTarget)))
1566 if (caster->_IsValidAssistTarget(unitTarget, this))
1568 if (neededTargets & TARGET_FLAG_UNIT_MINIPET)
1569 if (unitTarget->GetGUID() == caster->GetCritterGUID())
1571 if (neededTargets & TARGET_FLAG_UNIT_PASSENGER)
1572 if (unitTarget->IsOnVehicle(caster))
1575 }
1576 }
1578}
1579
1581{
1582 // All creatures should be able to cast as passengers freely, restriction and attribute are only for players
1583 if (caster->GetTypeId() != TypeID::TYPEID_PLAYER)
1585
1586 Vehicle* vehicle = caster->GetVehicle();
1587 if (vehicle)
1588 {
1589 uint16 checkMask = 0;
1590 for (uint8 effIndex = EFFECT_0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
1591 {
1592 if (Effects[effIndex].ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT)
1593 {
1594 SpellShapeshiftFormEntry const* shapeShiftFromEntry = sSpellShapeshiftFormStore.LookupEntry(Effects[effIndex].MiscValue);
1595 if (shapeShiftFromEntry && (shapeShiftFromEntry->flags1 & 1) == 0) // unk flag
1596 checkMask |= VEHICLE_SEAT_FLAG_UNCONTROLLED;
1597 break;
1598 }
1599 }
1600
1603
1604 if (!checkMask)
1605 checkMask = VEHICLE_SEAT_FLAG_CAN_ATTACK;
1606
1607 VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(caster);
1609 && (vehicleSeat->m_flags & checkMask) != checkMask)
1611
1612 // Can only summon uncontrolled minions/guardians when on controlled vehicle
1614 {
1615 for (uint32 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
1616 {
1617 if (Effects[i].Effect != SPELL_EFFECT_SUMMON)
1618 continue;
1619
1620 SummonPropertiesEntry const* props = sSummonPropertiesStore.LookupEntry(Effects[i].MiscValueB);
1621 if (props && props->Category != SUMMON_CATEGORY_WILD)
1623 }
1624 }
1625 }
1626
1628}
1629
1631{
1632 // Curse of Doom & Exorcism: not find another way to fix spell target check :/
1634 {
1635 // not allow cast at player
1636 if (target->GetTypeId() == TypeID::TYPEID_PLAYER)
1637 return false;
1638 else
1639 return true;
1640 }
1641 uint32 creatureType = target->GetCreatureTypeMask();
1642 return !TargetCreatureType || !creatureType || (creatureType & TargetCreatureType);
1643}
1644
1649
1651{
1652 uint32 mask = 0;
1654 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
1655 if (Effects[i].IsEffect() && Effects[i].Mechanic)
1657 return mask;
1658}
1659
1661{
1662 uint32 mask = 0;
1664 if (Effects[effIndex].IsEffect() && Effects[effIndex].Mechanic)
1666 return mask;
1667}
1668
1670{
1671 uint32 mask = 0;
1673 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
1674 if ((effectMask & Skyfire::Spells::GetEffectIndexMask(i)) && Effects[i].Mechanic)
1676 return mask;
1677}
1678
1680{
1681 if (Effects[effIndex].IsEffect() && Effects[effIndex].Mechanic)
1682 return Mechanics(Effects[effIndex].Mechanic);
1683 if (Mechanic)
1684 return Mechanics(Mechanic);
1685 return MECHANIC_NONE;
1686}
1687
1689{
1690 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
1691 if (Effects[i].Mechanic)
1692 return true;
1693 return false;
1694}
1695
1700
1705
1710
1712{
1713 // Seals
1715 return AURA_STATE_JUDGEMENT;
1716
1717 // Conflagrate aura state on Immolate and Shadowflame
1719 // Immolate
1720 ((SpellFamilyFlags[0] & 4) ||
1721 // Shadowflame
1722 (SpellFamilyFlags[2] & 2)))
1724
1725 // Faerie Fire (druid versions)
1728
1729 // Sting (hunter's pet ability)
1730 if (GetCategory() == 1133)
1732
1733 // Victorious
1734 if (SpellFamilyName == SPELLFAMILY_WARRIOR && SpellFamilyFlags[1] & 0x00040000)
1736
1737 // Swiftmend state on Regrowth & Rejuvenation
1739 return AURA_STATE_SWIFTMEND;
1740
1741 // Deadly poison aura state
1742 if (SpellFamilyName == SPELLFAMILY_ROGUE && SpellFamilyFlags[0] & 0x10000)
1744
1745 // Enrage aura state
1746 if (Dispel == DISPEL_ENRAGE)
1747 return AURA_STATE_ENRAGE;
1748
1749 // Bleeding aura state
1751 return AURA_STATE_BLEEDING;
1752
1754 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
1755 if (Effects[i].IsAura() && (Effects[i].ApplyAuraName == SPELL_AURA_MOD_STUN
1756 || Effects[i].ApplyAuraName == SPELL_AURA_MOD_ROOT))
1757 return AURA_STATE_FROZEN;
1758
1759 switch (Id)
1760 {
1761 case 71465: // Divine Surge
1762 case 50241: // Evasive Charges
1763 return AURA_STATE_UNKNOWN22;
1764 default:
1765 break;
1766 }
1767
1768 return AURA_STATE_NONE;
1769}
1770
1772{
1773 switch (SpellFamilyName)
1774 {
1776 {
1777 // Food / Drinks (mostly)
1779 {
1780 bool food = false;
1781 bool drink = false;
1782 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
1783 {
1784 if (!Effects[i].IsAura())
1785 continue;
1786 switch (Effects[i].ApplyAuraName)
1787 {
1788 // Food
1791 food = true;
1792 break;
1793 // Drink
1796 drink = true;
1797 break;
1798 default:
1799 break;
1800 }
1801 }
1802
1803 if (food && drink)
1805 else if (food)
1806 return SPELL_SPECIFIC_FOOD;
1807 else if (drink)
1808 return SPELL_SPECIFIC_DRINK;
1809 }
1810 // scrolls effects
1811 else
1812 {
1813 SpellInfo const* firstRankSpellInfo = GetFirstRankSpell();
1814 switch (firstRankSpellInfo->Id)
1815 {
1816 case 8118: // Strength
1817 case 8099: // Stamina
1818 case 8112: // Spirit
1819 case 8096: // Intellect
1820 case 8115: // Agility
1821 case 8091: // Armor
1822 return SPELL_SPECIFIC_SCROLL;
1823 case 12880: // Enrage (Enrage)
1824 case 57518: // Enrage (Wrecking Crew)
1826 }
1827 }
1828 break;
1829 }
1830 case SPELLFAMILY_MAGE:
1831 {
1832 // family flags 18(Molten), 25(Frost/Ice), 28(Mage)
1833 if (SpellFamilyFlags[0] & 0x12040000)
1835
1836 // Arcane brillance and Arcane intelect (normal check fails because of flags difference)
1837 if (SpellFamilyFlags[0] & 0x400)
1839
1840 if ((SpellFamilyFlags[0] & 0x1000000) && Effects[0].ApplyAuraName == SPELL_AURA_MOD_CONFUSE)
1842
1843 break;
1844 }
1846 {
1847 if (Id == 12292) // Death Wish
1849
1850 break;
1851 }
1853 {
1854 // Warlock (Bane of Doom | Bane of Agony | Bane of Havoc)
1855 if (Id == 603 || Id == 980 || Id == 80240)
1856 return SPELL_SPECIFIC_BANE;
1857
1858 // only warlock curses have this
1859 if (Dispel == DISPEL_CURSE)
1860 return SPELL_SPECIFIC_CURSE;
1861
1862 // Warlock (Demon Armor | Demon Skin | Fel Armor)
1863 if (SpellFamilyFlags[1] & 0x20000020 || SpellFamilyFlags[2] & 0x00000010)
1865
1866 //seed of corruption and corruption
1867 if (SpellFamilyFlags[1] & 0x10 || SpellFamilyFlags[0] & 0x2)
1869 break;
1870 }
1871 case SPELLFAMILY_HUNTER:
1872 {
1873 // only hunter stings have this
1874 if (Dispel == DISPEL_POISON)
1875 return SPELL_SPECIFIC_STING;
1876
1877 // only hunter aspects have this (but not all aspects in hunter family)
1878 if (SpellFamilyFlags.HasFlag(0x00380000, 0x00440000, 0x00001010))
1879 return SPELL_SPECIFIC_ASPECT;
1880
1881 break;
1882 }
1884 {
1885 // Collection of all the seal family flags. No other paladin spell has any of those.
1886 if (SpellFamilyFlags[1] & 0x26000C00
1887 || SpellFamilyFlags[0] & 0x0A000000)
1888 return SPELL_SPECIFIC_SEAL;
1889
1890 if (SpellFamilyFlags[0] & 0x00002190)
1891 return SPELL_SPECIFIC_HAND;
1892
1893 // Judgement of Wisdom, Judgement of Light, Judgement of Justice
1894 if (Id == 20184 || Id == 20185 || Id == 20186)
1896
1897 // only paladin auras have this (for palaldin class family)
1898 if (SpellFamilyFlags[2] & 0x00000020)
1899 return SPELL_SPECIFIC_AURA;
1900
1901 break;
1902 }
1903 case SPELLFAMILY_SHAMAN:
1904 {
1905 // family flags 10 (Lightning), 42 (Earth), 37 (Water), proc shield from T2 8 pieces bonus
1906 if (SpellFamilyFlags[1] & 0x420
1907 || SpellFamilyFlags[0] & 0x00000400
1908 || Id == 23552)
1910
1911 break;
1912 }
1914 if (Id == 48266 || Id == 48263 || Id == 48265)
1916 break;
1917 }
1918
1919 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
1920 {
1921 if (Effects[i].Effect == SPELL_EFFECT_APPLY_AURA)
1922 {
1923 switch (Effects[i].ApplyAuraName)
1924 {
1929 return SPELL_SPECIFIC_CHARM;
1932 if (Id == 30645) // Gas Cloud Tracking
1933 return SPELL_SPECIFIC_NORMAL;
1937 }
1938 }
1939 }
1940
1941 return SPELL_SPECIFIC_NORMAL;
1942}
1943
1944float SpellInfo::GetMinRange(bool positive) const
1945{
1947 RangeEntry != NULL,
1948 RangeEntry ? RangeEntry->minRangeFriend : 0.0f,
1949 RangeEntry ? RangeEntry->minRangeHostile : 0.0f,
1950 positive);
1951}
1952
1953float SpellInfo::GetMaxRange(bool positive, Unit* caster, Spell* spell) const
1954{
1956 RangeEntry != NULL,
1957 RangeEntry ? RangeEntry->maxRangeFriend : 0.0f,
1958 RangeEntry ? RangeEntry->maxRangeHostile : 0.0f,
1959 positive);
1960
1961 if (RangeEntry && caster)
1962 if (Player* modOwner = caster->GetSpellModOwner())
1963 modOwner->ApplySpellMod(Id, SPELLMOD_RANGE, range, spell);
1964 return range;
1965}
1966
1971
1976
1977uint32 SpellInfo::CalcCastTime(uint8 level, Spell* spell /*= NULL*/) const
1978{
1979 if (!level && spell)
1980 level = spell->GetCaster()->getLevel();
1981
1983 level,
1987 CastTimeEntry ? CastTimeEntry->CastTime : 0);
1988
1989 if (!castTime)
1990 return 0;
1991
1992 if (spell)
1993 spell->GetCaster()->ModSpellCastTime(this, castTime, spell);
1994
1996 return Skyfire::Spells::FinalizeCastTime(castTime, addRangedAmmoDelay);
1997}
1998
2000{
2002 for (uint8 x = 0; x < MAX_SPELL_EFFECTS; ++x)
2003 {
2004 effects[x].Effect = Effects[x].Effect;
2005 effects[x].ApplyAuraName = Effects[x].ApplyAuraName;
2006 effects[x].ApplyAuraTickCount = Effects[x].ApplyAuraTickCount;
2007 }
2008
2010}
2011
2016/*
2017int32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask) const
2018{
2019 // Spell drain all exist power on cast (Only paladin lay of Hands)
2020 if (AttributesEx & SPELL_ATTR1_DRAIN_ALL_POWER)
2021 {
2022 // If power type - health drain all
2023 if (PowerType == POWER_HEALTH)
2024 return caster->GetHealth();
2025 // Else drain all power
2026 if (PowerType < MAX_POWERS)
2027 return caster->GetPower(Powers(PowerType));
2028 SF_LOG_ERROR("spells", "SpellInfo::CalcPowerCost: Unknown power type '%d' in spell %d", PowerType, Id);
2029 return 0;
2030 }
2031
2032 // Base powerCost
2033 int32 powerCost = ManaCost;
2034 // PCT cost from total amount
2035 if (ManaCostPercentage)
2036 {
2037 switch (PowerType)
2038 {
2039 // health as power used
2040 case POWER_HEALTH:
2041 powerCost += int32(CalculatePct(caster->GetCreateHealth(), ManaCostPercentage));
2042 break;
2043 case POWER_MANA:
2044 powerCost += int32(CalculatePct(caster->GetCreateMana(), ManaCostPercentage));
2045 break;
2046 case POWER_RAGE:
2047 case POWER_FOCUS:
2048 case POWER_ENERGY:
2049 case POWER_DEMONIC_FURY:
2050 powerCost += int32(CalculatePct(caster->GetMaxPower(Powers(PowerType)), ManaCostPercentage));
2051 break;
2052 case POWER_RUNES:
2053 case POWER_RUNIC_POWER:
2054 SF_LOG_DEBUG("spells", "CalculateManaCost: Not implemented yet!");
2055 break;
2056 default:
2057 SF_LOG_ERROR("spells", "CalculateManaCost: Unknown power type '%d' in spell %d", PowerType, Id);
2058 return 0;
2059 }
2060 }
2061
2062 // Apply cost mod by spell
2063 if (Player* modOwner = caster->GetSpellModOwner())
2064 modOwner->ApplySpellMod(Id, SPELLMOD_COST, powerCost);
2065
2066 if (!caster->IsControlledByPlayer())
2067 {
2068 if (Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION)
2069 {
2070 GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.LookupEntry(SpellLevel - 1);
2071 GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.LookupEntry(caster->getLevel() - 1);
2072 if (spellScaler && casterScaler)
2073 powerCost *= casterScaler->ratio / spellScaler->ratio;
2074 }
2075 }
2076
2077 return powerCost;
2078}
2079*/
2081{
2082 return ChainEntry != NULL;
2083}
2084
2086{
2087 if (!ChainEntry)
2088 return 1;
2089 return ChainEntry->rank;
2090}
2091
2093{
2094 if (!ChainEntry)
2095 return this;
2096 return ChainEntry->first;
2097}
2099{
2100 if (!ChainEntry)
2101 return NULL;
2102 return ChainEntry->last;
2103}
2105{
2106 if (!ChainEntry)
2107 return NULL;
2108 return ChainEntry->next;
2109}
2111{
2112 if (!ChainEntry)
2113 return NULL;
2114 return ChainEntry->prev;
2115}
2116
2118{
2119 // ignore passive spells
2120 if (IsPassive())
2121 return this;
2122
2123 bool needRankSelection = false;
2124 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
2125 {
2126 if (IsPositiveEffect(i) &&
2127 (Effects[i].Effect == SPELL_EFFECT_APPLY_AURA ||
2130 !Effects[i].ScalingMultiplier)
2131 {
2132 needRankSelection = true;
2133 break;
2134 }
2135 }
2136
2137 // not required
2138 if (!needRankSelection)
2139 return this;
2140
2141 for (SpellInfo const* nextSpellInfo = this; nextSpellInfo != NULL; nextSpellInfo = nextSpellInfo->GetPrevRankSpell())
2142 {
2143 // if found appropriate level
2144 if (uint32(level + 10) >= nextSpellInfo->SpellLevel)
2145 return nextSpellInfo;
2146
2147 // one rank less then
2148 }
2149
2150 // not found
2151 return NULL;
2152}
2153
2154bool SpellInfo::IsRankOf(SpellInfo const* spellInfo) const
2155{
2156 return GetFirstRankSpell() == spellInfo->GetFirstRankSpell();
2157}
2158
2159bool SpellInfo::IsDifferentRankOf(SpellInfo const* spellInfo) const
2160{
2161 if (Id == spellInfo->Id)
2162 return false;
2163 return IsRankOf(spellInfo);
2164}
2165
2166bool SpellInfo::IsHighRankOf(SpellInfo const* spellInfo) const
2167{
2168 if (ChainEntry && spellInfo->ChainEntry)
2169 if (ChainEntry->first == spellInfo->ChainEntry->first)
2170 if (ChainEntry->rank > spellInfo->ChainEntry->rank)
2171 return true;
2172
2173 return false;
2174}
2175
2177{
2178 bool srcSet = false;
2179 bool dstSet = false;
2180 uint32 targetMask = Targets;
2181 // prepare target mask using effect target entries
2182 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
2183 {
2184 if (!Effects[i].IsEffect())
2185 continue;
2186
2187 targetMask |= Effects[i].TargetA.GetExplicitTargetMask(srcSet, dstSet);
2188 targetMask |= Effects[i].TargetB.GetExplicitTargetMask(srcSet, dstSet);
2189
2190 // add explicit target flags based on spell effects which have EFFECT_IMPLICIT_TARGET_EXPLICIT and no valid target provided
2191 if (Effects[i].GetImplicitTargetType() != EFFECT_IMPLICIT_TARGET_EXPLICIT)
2192 continue;
2193
2194 // extend explicit target mask only if valid targets for effect could not be provided by target types
2195 uint32 effectTargetMask = Effects[i].GetMissingTargetMask(srcSet, dstSet, targetMask);
2196
2197 // don't add explicit object/dest flags when spell has no max range
2198 if (GetMaxRange(true) == 0.0f && GetMaxRange(false) == 0.0f)
2200
2201 targetMask |= effectTargetMask;
2202 }
2203
2204 ExplicitTargetMask = targetMask;
2205}
2206
2207bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const
2208{
2209 // not found a single positive spell with this attribute
2211 return false;
2212
2213 switch (SpellFamilyName)
2214 {
2216 switch (Id)
2217 {
2218 case 29214: // Wrath of the Plaguebringer
2219 case 34700: // Allergic Reaction
2220 case 54836: // Wrath of the Plaguebringer
2221 return false;
2222 case 30877: // Tag Murloc
2223 case 61716: // Rabbit Costume
2224 case 61734: // Noblegarden Bunny
2225 case 62344: // Fists of Stone
2226 return true;
2227 default:
2228 break;
2229 }
2230 break;
2231 case SPELLFAMILY_MAGE:
2232 // Ignite
2233 if (SpellIconID == 45)
2234 return true;
2235 break;
2236 case SPELLFAMILY_PRIEST:
2237 switch (Id)
2238 {
2239 case 64844: // Divine Hymn
2240 case 64904: // Hymn of Hope
2241 case 47585: // Dispersion
2242 return true;
2243 default:
2244 break;
2245 }
2246 break;
2247 case SPELLFAMILY_ROGUE:
2248 switch (Id)
2249 {
2250 // Envenom must be considered as a positive effect even though it deals damage
2251 case 32645: // Envenom
2252 return true;
2253 default:
2254 break;
2255 }
2256 break;
2257 default:
2258 break;
2259 }
2260
2261 switch (Mechanic)
2262 {
2264 return true;
2265 default:
2266 break;
2267 }
2268
2269 // Special case: effects which determine positivity of whole spell
2270 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
2271 {
2272 if (Effects[i].IsAura() && Effects[i].ApplyAuraName == SPELL_AURA_MOD_STEALTH)
2273 return true;
2274 }
2275
2276 switch (Effects[effIndex].Effect)
2277 {
2278 case SPELL_EFFECT_DUMMY:
2279 // some explicitly required dummy effect sets
2280 switch (Id)
2281 {
2282 case 28441:
2283 return false; // AB Effect 000
2284 default:
2285 break;
2286 }
2287 break;
2288 // always positive effects (check before target checks that provided non-positive result in some case for positive effects)
2289 case SPELL_EFFECT_HEAL:
2294 return true;
2296 return false;
2297
2298 // non-positive aura use
2301 {
2302 switch (Effects[effIndex].ApplyAuraName)
2303 {
2304 case SPELL_AURA_MOD_DAMAGE_DONE: // dependent from bas point sign (negative -> negative)
2311 if (Effects[effIndex].CalcValue() < 0)
2312 return false;
2313 break;
2314 case SPELL_AURA_MOD_DAMAGE_TAKEN: // dependent from bas point sign (positive -> negative)
2315 if (Effects[effIndex].CalcValue() > 0)
2316 return false;
2317 break;
2320 if (Effects[effIndex].CalcValue() > 0)
2321 return true; // some expected positive spells have SPELL_ATTR1_NEGATIVE
2322 break;
2324 return true;
2327 if (!deep)
2328 {
2329 if (SpellInfo const* spellTriggeredProto = sSpellMgr->GetSpellInfo(Effects[effIndex].TriggerSpell))
2330 {
2331 // negative targets of main spell return early
2332 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
2333 {
2334 if (!spellTriggeredProto->Effects[i].Effect)
2335 continue;
2336 // if non-positive trigger cast targeted to positive target this main cast is non-positive
2337 // this will place this spell auras as debuffs
2338 if (_IsPositiveTarget(spellTriggeredProto->Effects[i].TargetA.GetTarget(), spellTriggeredProto->Effects[i].TargetB.GetTarget()) && !spellTriggeredProto->_IsPositiveEffect(i, true))
2339 return false;
2340 }
2341 }
2342 }
2344 // many positive auras have negative triggered spells at damage for example and this not make it negative (it can be canceled for example)
2345 break;
2346 case SPELL_AURA_MOD_STUN: //have positive and negative spells, we can't sort its correctly at this moment.
2347 if (effIndex == 0 && Effects[1].Effect == 0 && Effects[2].Effect == 0)
2348 return false; // but all single stun aura spells is negative
2349 break;
2351 if (Id == 24740) // Wisp Costume
2352 return true;
2353 return false;
2356 case SPELL_AURA_GHOST:
2361 return false;
2362 case SPELL_AURA_PERIODIC_DAMAGE: // used in positive spells also.
2363 // part of negative spell if casted at self (prevent cancel)
2364 if (Effects[effIndex].TargetA.GetTarget() == TARGET_UNIT_CASTER)
2365 return false;
2366 break;
2367 case SPELL_AURA_MOD_DECREASE_SPEED: // used in positive spells also
2368 // part of positive spell if casted at self
2369 if (Effects[effIndex].TargetA.GetTarget() != TARGET_UNIT_CASTER)
2370 return false;
2371 // but not this if this first effect (didn't find better check)
2372 if (Attributes & SPELL_ATTR0_NEGATIVE_1 && effIndex == 0)
2373 return false;
2374 break;
2376 {
2377 // non-positive immunities
2378 switch (Effects[effIndex].MiscValue)
2379 {
2380 case MECHANIC_BANDAGE:
2381 case MECHANIC_SHIELD:
2382 case MECHANIC_MOUNT:
2384 return false;
2385 default:
2386 break;
2387 }
2388 break;
2389 }
2390 default:
2391 break;
2392 }
2393 break;
2394 }
2395 default:
2396 break;
2397 }
2398
2399 // non-positive targets
2400 if (!_IsPositiveTarget(Effects[effIndex].TargetA.GetTarget(), Effects[effIndex].TargetB.GetTarget()))
2401 return false;
2402
2403 // negative spell if triggered spell is negative
2404 if (!deep && !Effects[effIndex].ApplyAuraName && Effects[effIndex].TriggerSpell)
2405 {
2406 if (SpellInfo const* spellTriggeredProto = sSpellMgr->GetSpellInfo(Effects[effIndex].TriggerSpell))
2407 if (!spellTriggeredProto->_IsPositiveSpell())
2408 return false;
2409 }
2410
2411 // ok, positive
2412 return true;
2413}
2414
2416{
2417 // spells with at least one negative effect are considered negative
2418 // some self-applied spells have negative effects but in self casting case negative check ignored.
2419 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
2420 if (!_IsPositiveEffect(i, true))
2421 return false;
2422 return true;
2423}
2424
2426{
2427 // non-positive targets
2428 switch (targetA)
2429 {
2438 return false;
2439 default:
2440 break;
2441 }
2442 if (targetB)
2443 return _IsPositiveTarget(targetB, 0);
2444 return true;
2445}
2446
2451
2456
2461
2463{
2464 return SpellLevelsId ? sSpellLevelsStore.LookupEntry(SpellLevelsId) : NULL;
2465}
2466
2468{
2469 return SpellReagentsId ? sSpellReagentsStore.LookupEntry(SpellReagentsId) : NULL;
2470}
2471
2473{
2474 return SpellScalingId ? sSpellScalingStore.LookupEntry(SpellScalingId) : NULL;
2475}
2476
2481
2483{
2484 return SpellTotemsId ? sSpellTotemsStore.LookupEntry(SpellTotemsId) : NULL;
2485}
2486
2491
2496
2501
2506
2511
2516
2518{
2519 // find the same instances of ConditionList and delete them.
2520 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
2521 {
2522 ConditionList* cur = Effects[i].ImplicitTargetConditions;
2523 if (!cur)
2524 continue;
2525 for (uint8 j = i; j < MAX_SPELL_EFFECTS; ++j)
2526 {
2527 if (Effects[j].ImplicitTargetConditions == cur)
2528 Effects[j].ImplicitTargetConditions = NULL;
2529 }
2530 delete cur;
2531 }
2532}
@ STATUS_WAIT_JOIN
std::list< Condition * > ConditionList
@ CORPSE_BONES
Definition Corpse.h:16
DB2Storage< SpellReagentsEntry > sSpellReagentsStore(SpellReagentsfmt)
#define MAX_SPELL_REAGENTS
@ VEHICLE_SEAT_FLAG_UNK2
Definition DBCEnums.h:548
@ VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL
Definition DBCEnums.h:530
@ VEHICLE_SEAT_FLAG_CAN_CONTROL
Definition DBCEnums.h:529
@ VEHICLE_SEAT_FLAG_UNCONTROLLED
Definition DBCEnums.h:531
@ VEHICLE_SEAT_FLAG_CAN_ATTACK
Definition DBCEnums.h:532
@ ABILITY_LEARNED_ON_GET_PROFESSION_SKILL
Definition DBCEnums.h:403
@ SPELL_CATEGORY_FLAG_COOLDOWN_STARTS_ON_EVENT
Definition DBCEnums.h:445
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormfmt)
DBCStorage< SpellRadiusEntry > sSpellRadiusStore(SpellRadiusfmt)
DBCStorage< SpellLevelsEntry > sSpellLevelsStore(SpellLevelsEntryfmt)
DBCStorage< SummonPropertiesEntry > sSummonPropertiesStore(SummonPropertiesfmt)
SpellEffectScallingByEffectId sSpellEffectScallingByEffectId
DBCStorage< SpellClassOptionsEntry > sSpellClassOptionsStore(SpellClassOptionsEntryfmt)
DBCStorage< SpellInterruptsEntry > sSpellInterruptsStore(SpellInterruptsEntryfmt)
DBCStorage< SpellAuraOptionsEntry > sSpellAuraOptionsStore(SpellAuraOptionsEntryfmt)
DBCStorage< SpellCategoryEntry > sSpellCategoryStore(SpellCategoryfmt)
DBCStorage< SpellCastTimesEntry > sSpellCastTimesStore(SpellCastTimefmt)
DBCStorage< SpellRangeEntry > sSpellRangeStore(SpellRangefmt)
DBCStorage< SpellMiscEntry > sSpellMiscStore(SpellMiscfmt)
uint32 GetTalentSpellCost(uint32 spellId)
DBCStorage< SpellTargetRestrictionsEntry > sSpellTargetRestrictionsStore(SpellTargetRestrictionsEntryfmt)
DBCStorage< SpellEquippedItemsEntry > sSpellEquippedItemsStore(SpellEquippedItemsEntryfmt)
DBCStorage< SpellTotemsEntry > sSpellTotemsStore(SpellTotemsEntryfmt)
uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId)
DBCStorage< SpellShapeshiftEntry > sSpellShapeshiftStore(SpellShapeshiftEntryfmt)
DBCStorage< SpellAuraRestrictionsEntry > sSpellAuraRestrictionsStore(SpellAuraRestrictionsEntryfmt)
DBCStorage< SpellCastingRequirementsEntry > sSpellCastingRequirementsStore(SpellCastingRequirementsEntryfmt)
DBCStorage< AreaGroupEntry > sAreaGroupStore(AreaGroupEntryfmt)
DBCStorage< GtSpellScalingEntry > sGtSpellScalingStore(GtSpellScalingfmt)
DBCStorage< SpellDurationEntry > sSpellDurationStore(SpellDurationfmt)
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
DBCStorage< SpellCooldownsEntry > sSpellCooldownsStore(SpellCooldownsEntryfmt)
DBCStorage< SpellCategoriesEntry > sSpellCategoriesStore(SpellCategoriesEntryfmt)
DBCStorage< SpellEffectScalingEntry > sSpellEffectScalingStore(SpellEffectScalingfmt)
DBCStorage< SpellScalingEntry > sSpellScalingStore(SpellScalingEntryfmt)
#define MAX_GROUP_AREA_IDS
#define MAX_SPELL_EFFECTS
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::uint16_t uint16
Definition Define.h:78
#define ITEM_SUBCLASS_MASK_WEAPON_RANGED
#define SF_LOG_ERROR(filterType__,...)
Definition Log.h:143
@ TYPEID_PLAYER
Definition Object.h:55
@ EFFECT_0
@ SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY
@ SPELL_ATTR0_DISABLED_WHILE_ACTIVE
@ SPELL_ATTR0_NEGATIVE_1
@ SPELL_ATTR0_PASSIVE
@ SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION
@ SPELL_ATTR0_REQ_AMMO
@ SPELL_ATTR0_NOT_SHAPESHIFT
@ SPELL_ATTR0_CASTABLE_WHILE_MOUNTED
@ SPELL_ATTR0_CANT_USED_IN_COMBAT
SpellEffects
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_POWER_BURN
@ SPELL_EFFECT_ENERGIZE_PCT
@ SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE
@ SPELL_EFFECT_APPLY_AREA_AURA_PARTY
@ SPELL_EFFECT_APPLY_AREA_AURA_FRIEND
@ SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE
@ SPELL_EFFECT_SELF_RESURRECT
@ SPELL_EFFECT_HEALTH_LEECH
@ SPELL_EFFECT_SKILL
@ SPELL_EFFECT_SUMMON_RAF_FRIEND
@ SPELL_EFFECT_WEAPON_DAMAGE
@ SPELL_EFFECT_HEAL
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
@ SPELL_EFFECT_SUMMON_PLAYER
@ SPELL_EFFECT_APPLY_AREA_AURA_PET
@ SPELL_EFFECT_SKIN_PLAYER_CORPSE
@ SPELL_EFFECT_APPLY_AREA_AURA_RAID
@ SPELL_EFFECT_CREATE_ITEM_2
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
@ SPELL_EFFECT_SUMMON
@ SPELL_EFFECT_POWER_DRAIN
@ SPELL_EFFECT_RESURRECT
@ SPELL_EFFECT_RESURRECT_NEW
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ TOTAL_SPELL_EFFECTS
@ SPELL_EFFECT_LEARN_SPELL
@ SPELL_EFFECT_CREATE_RANDOM_ITEM
@ SPELL_EFFECT_APPLY_AREA_AURA_ENEMY
@ SPELL_EFFECT_HEAL_PCT
@ SPELL_EFFECT_TELEPORT_UNITS
@ SPELL_EFFECT_FORCE_CAST_WITH_VALUE
@ SPELL_EFFECT_THREAT
@ SPELL_EFFECT_SKILL_STEP
@ SPELL_EFFECT_APPLY_AURA
@ SPELL_EFFECT_APPLY_AREA_AURA_OWNER
@ SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE
@ SPELL_ATTR1_NOT_BREAK_STEALTH
@ SPELL_ATTR1_UNAUTOCASTABLE_BY_PET
@ SPELL_ATTR1_CHANNELED_1
@ SPELL_ATTR1_CHANNELED_2
@ SPELL_ATTR1_REQ_COMBO_POINTS2
@ SPELL_ATTR1_REQ_COMBO_POINTS1
@ SPELL_ATTR1_CANT_TARGET_SELF
@ SPELL_ATTR1_CANT_TARGET_IN_COMBAT
@ TARGET_DEST_DYNOBJ_ENEMY
@ TARGET_UNIT_DEST_AREA_ENEMY
@ TARGET_UNIT_CONE_ENEMY_104
@ TARGET_UNIT_SRC_AREA_ENEMY
@ TARGET_DEST_TARGET_ENEMY
@ TARGET_UNIT_TARGET_ENEMY
@ TARGET_DEST_CASTER
@ TARGET_UNIT_CASTER
@ TARGET_UNIT_CONE_ENEMY_24
@ TARGET_UNIT_NEARBY_ENEMY
@ SPELL_ATTR2_CANT_TARGET_TAPPED
@ SPELL_ATTR2_AUTOREPEAT_FLAG
@ SPELL_ATTR2_CAN_TARGET_DEAD
@ SPELL_ATTR2_NOT_NEED_SHAPESHIFT
@ SPELL_ATTR4_CAST_ONLY_IN_OUTLAND
@ SPELL_ATTR6_CAN_TARGET_INVISIBLE
@ SPELL_ATTR6_NOT_IN_RAID_INSTANCE
@ SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED
@ SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE
@ SPELL_ATTR3_STACK_FOR_DIFF_CASTERS
@ SPELL_ATTR3_DEATH_PERSISTENT
@ SPELL_ATTR3_NO_DONE_BONUS
@ SPELL_ATTR3_ONLY_TARGET_PLAYERS
@ SPELL_ATTR3_ONLY_TARGET_GHOSTS
@ SPELLFAMILY_PRIEST
@ SPELLFAMILY_WARLOCK
@ SPELLFAMILY_MAGE
@ SPELLFAMILY_GENERIC
@ SPELLFAMILY_WARRIOR
@ SPELLFAMILY_PALADIN
@ SPELLFAMILY_HUNTER
@ SPELLFAMILY_ROGUE
@ SPELLFAMILY_SHAMAN
@ SPELLFAMILY_DRUID
@ SPELLFAMILY_DEATHKNIGHT
@ SPELL_ATTR5_SINGLE_TARGET_SPELL
uint32 const CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD
#define MAX_CLASSES
@ SPELL_ATTR9_AIMED_SHOT
AuraStateType
@ AURA_STATE_NONE
@ AURA_STATE_FROZEN
@ AURA_STATE_DEADLY_POISON
@ AURA_STATE_BLEEDING
@ AURA_STATE_FAERIE_FIRE
@ AURA_STATE_ENRAGE
@ AURA_STATE_WARRIOR_VICTORY_RUSH
@ AURA_STATE_UNKNOWN22
@ AURA_STATE_JUDGEMENT
@ AURA_STATE_SWIFTMEND
@ AURA_STATE_CONFLAGRATE
Mechanics
@ MECHANIC_DISARM
@ MECHANIC_NONE
@ MECHANIC_MOUNT
@ MECHANIC_INVULNERABILITY
@ MECHANIC_BANDAGE
@ MECHANIC_BLEED
@ MECHANIC_IMMUNE_SHIELD
@ MECHANIC_SHIELD
DispelType
@ DISPEL_ENRAGE
@ DISPEL_POISON
@ DISPEL_CURSE
@ SUMMON_CATEGORY_WILD
SpellSchoolMask
@ SPELL_SCHOOL_MASK_FROST
SpellCastResult
@ SPELL_FAILED_TARGET_AFFECTING_COMBAT
@ SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED
@ SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW
@ SPELL_AURA_PREVENT_RESURRECTION
@ SPELL_AURA_MOD_SKILL
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_TRACK_RESOURCES
@ SPELL_AURA_MOD_SHAPESHIFT
@ SPELL_AURA_DAMAGE_SHIELD
@ SPELL_AURA_OBS_MOD_HEALTH
@ SPELL_AURA_PERIODIC_MANA_LEECH
@ SPELL_AURA_MOD_POSSESS_PET
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_MOD_POWER_REGEN
@ SPELL_AURA_OBS_MOD_POWER
@ SPELL_AURA_TRACK_STEALTHED
@ SPELL_AURA_MOD_STALKED
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
@ SPELL_AURA_PERIODIC_HEAL
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MOD_DODGE_PERCENT
@ SPELL_AURA_FLY
@ SPELL_AURA_MOD_SILENCE
@ SPELL_AURA_ADD_TARGET_TRIGGER
@ SPELL_AURA_MOD_STAT
@ SPELL_AURA_MOD_HEALING_DONE
@ SPELL_AURA_MOD_HEALING_PCT
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
@ SPELL_AURA_GHOST
@ SPELL_AURA_MOD_CHARM
@ SPELL_AURA_MOD_ROOT
@ SPELL_AURA_MOUNTED
@ SPELL_AURA_MECHANIC_IMMUNITY
@ SPELL_AURA_MOD_DAMAGE_TAKEN
@ SPELL_AURA_MOD_CRIT_PCT
@ SPELL_AURA_MOD_PACIFY_SILENCE
@ SPELL_AURA_AOE_CHARM
@ SPELL_AURA_MOD_DECREASE_SPEED
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE
@ SPELL_AURA_SCHOOL_ABSORB
@ SPELL_AURA_PERIODIC_LEECH
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
@ SPELL_AURA_MOD_DAMAGE_DONE
@ SPELL_AURA_MOD_CONFUSE
@ SPELL_AURA_TRACK_CREATURES
@ SPELL_AURA_MOD_POSSESS
@ SPELL_AURA_MOD_STEALTH
@ SPELL_AURA_MOD_REGEN
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELL_AURA_MOD_STUN
@ SPELL_ATTR0_CU_NEGATIVE_EFF2
Definition SpellInfo.h:76
@ SPELL_ATTR0_CU_NEGATIVE_EFF1
Definition SpellInfo.h:75
@ SPELL_ATTR0_CU_NEGATIVE
Definition SpellInfo.h:81
@ SPELL_ATTR0_CU_NEGATIVE_EFF0
Definition SpellInfo.h:74
@ SPELL_ATTR0_CU_PICKPOCKET
Definition SpellInfo.h:73
SpellSpecificType
Definition SpellInfo.h:35
@ SPELL_SPECIFIC_FOOD
Definition SpellInfo.h:49
@ SPELL_SPECIFIC_MAGE_ARMOR
Definition SpellInfo.h:44
@ SPELL_SPECIFIC_NORMAL
Definition SpellInfo.h:36
@ SPELL_SPECIFIC_STING
Definition SpellInfo.h:39
@ SPELL_SPECIFIC_MAGE_ARCANE_BRILLANCE
Definition SpellInfo.h:55
@ SPELL_SPECIFIC_ASPECT
Definition SpellInfo.h:41
@ SPELL_SPECIFIC_ELEMENTAL_SHIELD
Definition SpellInfo.h:45
@ SPELL_SPECIFIC_WARLOCK_CORRUPTION
Definition SpellInfo.h:48
@ SPELL_SPECIFIC_BANE
Definition SpellInfo.h:60
@ SPELL_SPECIFIC_PRESENCE
Definition SpellInfo.h:52
@ SPELL_SPECIFIC_CURSE
Definition SpellInfo.h:40
@ SPELL_SPECIFIC_JUDGEMENT
Definition SpellInfo.h:47
@ SPELL_SPECIFIC_DRINK
Definition SpellInfo.h:50
@ SPELL_SPECIFIC_HAND
Definition SpellInfo.h:58
@ SPELL_SPECIFIC_AURA
Definition SpellInfo.h:38
@ SPELL_SPECIFIC_WARRIOR_ENRAGE
Definition SpellInfo.h:56
@ SPELL_SPECIFIC_WARLOCK_ARMOR
Definition SpellInfo.h:43
@ SPELL_SPECIFIC_SCROLL
Definition SpellInfo.h:54
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition SpellInfo.h:46
@ SPELL_SPECIFIC_TRACKER
Definition SpellInfo.h:42
@ SPELL_SPECIFIC_SEAL
Definition SpellInfo.h:37
@ SPELL_SPECIFIC_FOOD_AND_DRINK
Definition SpellInfo.h:51
@ SPELL_SPECIFIC_CHARM
Definition SpellInfo.h:53
bool IsPrimaryProfessionSkill(uint32 skill)
Definition SpellMgr.cpp:23
bool IsProfessionOrRidingSkill(uint32 skill)
Definition SpellMgr.h:575
bool IsProfessionSkill(uint32 skill)
Definition SpellMgr.h:570
std::pair< SpellAreaMap::const_iterator, SpellAreaMap::const_iterator > SpellAreaMapBounds
Definition SpellMgr.h:497
#define sSpellMgr
Definition SpellMgr.h:744
std::pair< SkillLineAbilityMap::const_iterator, SkillLineAbilityMap::const_iterator > SkillLineAbilityMapBounds
Definition SpellMgr.h:544
uint32 GetTargetFlagMask(SpellTargetObjectTypes objType)
SpellEffectImplicitTargetTypes
@ EFFECT_IMPLICIT_TARGET_CASTER
@ EFFECT_IMPLICIT_TARGET_NONE
@ EFFECT_IMPLICIT_TARGET_EXPLICIT
@ TARGET_FLAG_GAMEOBJECT
@ TARGET_FLAG_UNIT_RAID
@ TARGET_FLAG_UNIT_ENEMY
@ TARGET_FLAG_CORPSE_ALLY
@ TARGET_FLAG_ITEM
@ TARGET_FLAG_UNIT_MINIPET
@ TARGET_FLAG_UNIT_PASSENGER
@ TARGET_FLAG_GAMEOBJECT_ITEM
@ TARGET_FLAG_DEST_LOCATION
@ TARGET_FLAG_UNIT_ALLY
@ TARGET_FLAG_SOURCE_LOCATION
@ TARGET_FLAG_UNIT_MASK
@ TARGET_FLAG_UNIT_DEAD
@ TARGET_FLAG_CORPSE_ENEMY
@ TARGET_FLAG_CORPSE_MASK
@ TARGET_FLAG_GAMEOBJECT_MASK
@ TARGET_FLAG_UNIT_PARTY
SpellTargetObjectTypes
@ TARGET_OBJECT_TYPE_UNIT
@ TARGET_OBJECT_TYPE_ITEM
@ TARGET_OBJECT_TYPE_UNIT_AND_DEST
@ TARGET_OBJECT_TYPE_NONE
@ TARGET_OBJECT_TYPE_DEST
@ TARGET_OBJECT_TYPE_GOBJ
@ TARGET_OBJECT_TYPE_CORPSE_ALLY
@ TARGET_OBJECT_TYPE_CORPSE_ENEMY
@ TARGET_OBJECT_TYPE_GOBJ_ITEM
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition Unit.h:59
@ SPELLMOD_RANGE
Definition Unit.h:78
@ SPELLMOD_BONUS_MULTIPLIER
Definition Unit.h:97
@ SPELLMOD_VALUE_MULTIPLIER
Definition Unit.h:100
@ SPELLMOD_DAMAGE_MULTIPLIER
Definition Unit.h:93
@ SPELLMOD_RADIUS
Definition Unit.h:79
@ UNIT_STATE_IN_FLIGHT
Definition Unit.h:520
@ UNIT_FIELD_VIRTUAL_ITEM_ID
float frand(float min, float max)
Definition Util.cpp:39
BattlegroundStatus GetStatus() const
Definition Item.h:202
static Player * FindPlayer(uint64)
Corpse * ToCorpse()
Definition Object.h:216
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:325
Player * ToPlayer()
Definition Object.h:204
TypeID GetTypeId() const
Definition Object.h:131
GameObject * ToGameObject()
Definition Object.h:213
Creature * ToCreature()
Definition Object.h:207
Unit * ToUnit()
Definition Object.h:210
int8 GetComboPoints() const
Definition Player.h:1982
bool IsKnowHowFlyIn(uint32 mapid, uint32 zone) const
Definition Player.cpp:20800
bool InBattleground() const
Definition Player.h:2692
Battleground * GetBattleground() const
Definition Player.cpp:19212
bool IsGameMaster() const
Definition Player.h:1369
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
bool IsUseEquipedWeapon(bool mainhand) const
Mechanics Mechanic
Definition SpellInfo.h:101
float ComboScalingMultiplier
Definition SpellInfo.h:114
float BonusMultiplier
Definition SpellInfo.h:98
float ValueMultiplier
Definition SpellInfo.h:96
bool IsUnitOwnedAuraEffect() const
float CalcValueMultiplier(Unit *caster, Spell *spell=NULL) const
float PointsPerComboPoint
Definition SpellInfo.h:95
static StaticData _data[TOTAL_SPELL_EFFECTS]
Definition SpellInfo.h:361
std::list< Condition * > * ImplicitTargetConditions
Definition SpellInfo.h:110
uint32 TriggerSpell
Definition SpellInfo.h:108
float DamageMultiplier
Definition SpellInfo.h:97
float ScalingMultiplier
Definition SpellInfo.h:112
float CalcDamageMultiplier(Unit *caster, Spell *spell=NULL) const
bool IsAreaAuraEffect() const
Definition SpellInfo.cpp:84
SpellInfo const * _spellInfo
Definition SpellInfo.h:86
bool IsAura() const
Definition SpellInfo.cpp:69
uint32 GetMissingTargetMask(bool srcSet=false, bool destSet=false, uint32 mask=0) const
bool HasRadius() const
bool IsFarUnitTargetEffect() const
Definition SpellInfo.cpp:96
bool HasMaxRadius() const
bool IsEffect() const
Definition SpellInfo.cpp:59
flag128 SpellClassMask
Definition SpellInfo.h:109
bool IsTargetingArea() const
Definition SpellInfo.cpp:79
bool IsFarDestTargetEffect() const
float CalcBonusMultiplier(Unit *caster, Spell *spell=NULL) const
uint32 ApplyAuraTickCount
Definition SpellInfo.h:91
SpellEffectImplicitTargetTypes GetImplicitTargetType() const
uint32 ApplyAuraName
Definition SpellInfo.h:90
float CalcRadius(Unit *caster=NULL, Spell *=NULL) const
float DeltaScalingMultiplier
Definition SpellInfo.h:113
SpellTargetObjectTypes GetUsedTargetObjectType() const
uint32 ChainTarget
Definition SpellInfo.h:106
float RealPointsPerLevel
Definition SpellInfo.h:93
SpellRadiusEntry const * MaxRadiusEntry
Definition SpellInfo.h:105
SpellRadiusEntry const * RadiusEntry
Definition SpellInfo.h:104
uint32 GetProvidedTargetMask() const
SpellImplicitTargetInfo TargetA
Definition SpellInfo.h:102
int32 CalcBaseValue(int32 value) const
int32 CalcValue(Unit const *caster=NULL, int32 const *basePoints=NULL, Unit const *target=NULL) const
SpellImplicitTargetInfo TargetB
Definition SpellInfo.h:103
Definition Spell.h:289
Unit * GetCaster() const
Definition Spell.h:563
uint32 ChannelInterruptFlags
Definition SpellInfo.h:200
SpellInterruptsEntry const * GetSpellInterrupts() const
bool IsExplicitDiscovery() const
uint32 RequiresSpellFocus
Definition SpellInfo.h:183
uint32 BaseLevel
Definition SpellInfo.h:205
SpellEffectInfo Effects[MAX_SPELL_EFFECTS]
Definition SpellInfo.h:255
bool _IsPositiveSpell() const
uint32 MaxLevel
Definition SpellInfo.h:204
uint32 SpellLevel
Definition SpellInfo.h:206
static bool _IsPositiveTarget(uint32 targetA, uint32 targetB)
uint32 TargetAuraState
Definition SpellInfo.h:186
SpellReagentsEntry const * GetSpellReagents() const
bool IsRankOf(SpellInfo const *spellInfo) const
uint32 GetMaxTicks() const
uint32 ExcludeTargetAuraSpell
Definition SpellInfo.h:192
uint32 GetEffectMechanicMask(uint8 effIndex) const
uint32 TargetAuraStateNot
Definition SpellInfo.h:188
uint32 PreventionType
Definition SpellInfo.h:229
uint32 CasterAuraSpell
Definition SpellInfo.h:189
bool IsProfessionOrRiding() const
uint32 RuneCostID
Definition SpellInfo.h:208
uint32 Stances
Definition SpellInfo.h:179
uint32 SpellVisual[2]
Definition SpellInfo.h:219
SpellInfo const * GetFirstRankSpell() const
bool IsAutocastable() const
uint32 GetCategory() const
SpellCastResult CheckShapeshift(uint32 form) const
SpellScalingEntry const * GetSpellScaling() const
bool IsRequiringDeadTarget() const
uint32 TotemCategory[2]
Definition SpellInfo.h:218
uint32 AttributesCu
Definition SpellInfo.h:178
int32 ScalingClass
Definition SpellInfo.h:252
uint32 RecoveryTime
Definition SpellInfo.h:194
uint32 ReagentCount[MAX_SPELL_REAGENTS]
Definition SpellInfo.h:214
uint32 AttributesEx8
Definition SpellInfo.h:172
uint32 SpellShapeshiftId
Definition SpellInfo.h:244
uint32 ResearchProject
Definition SpellInfo.h:247
uint32 SpellInterruptsId
Definition SpellInfo.h:241
bool IsAuraExclusiveBySpecificPerCasterWith(SpellInfo const *spellInfo) const
SpellInfo const * GetPrevRankSpell() const
bool IsDeathPersistent() const
SpellShapeshiftEntry const * GetSpellShapeshift() const
bool IsCooldownStartedOnEvent() const
uint32 SpellAuraRestrictionsId
Definition SpellInfo.h:235
bool IsPassive() const
uint32 StancesNot
Definition SpellInfo.h:180
uint32 CalcCastTime(uint8 level=0, Spell *spell=NULL) const
uint32 StackAmount
Definition SpellInfo.h:211
uint32 Mechanic
Definition SpellInfo.h:163
bool IsAuraExclusiveBySpecificWith(SpellInfo const *spellInfo) const
uint32 Id
Definition SpellInfo.h:160
uint8 GetRank() const
SpellRangeEntry const * RangeEntry
Definition SpellInfo.h:209
uint32 ProcCharges
Definition SpellInfo.h:203
uint32 SpellTargetRestrictionsId
Definition SpellInfo.h:245
bool IsLootCrafting() const
SpellClassOptionsEntry const * GetSpellClassOptions() const
bool IsStackableOnOneSlotWithDifferentCasters() const
uint32 SpellCategoriesId
Definition SpellInfo.h:237
bool IsRanked() const
uint32 GetDispelMask() const
bool IsHighRankOf(SpellInfo const *spellInfo) const
SpellLevelsEntry const * GetSpellLevels() const
SpellInfo const * GetAuraRankForLevel(uint8 level) const
bool NeedsToBeTriggeredByCaster(SpellInfo const *triggeringSpell) const
uint32 GetRecoveryTime() const
SpellSpecificType GetSpellSpecific() const
uint32 Dispel
Definition SpellInfo.h:162
uint32 ActiveIconID
Definition SpellInfo.h:221
float Speed
Definition SpellInfo.h:210
bool IsMultiSlotAura() const
void _UnloadImplicitTargetConditionLists()
float GetMinRange(bool positive=false) const
int32 GetMaxDuration() const
int32 CastTimeMaxLevel
Definition SpellInfo.h:251
int32 EquippedItemClass
Definition SpellInfo.h:215
SpellTotemsEntry const * GetSpellTotems() const
uint32 SchoolMask
Definition SpellInfo.h:231
bool IsAbilityOfSkillType(uint32 skillType) const
SpellCategoriesEntry const * GetSpellCategories() const
uint32 CasterAuraState
Definition SpellInfo.h:185
bool IsAffectedBySpellMod(SpellModifier const *mod) const
bool CanPierceImmuneAura(SpellInfo const *aura) const
uint32 ProcFlags
Definition SpellInfo.h:201
bool CheckTargetCreatureType(Unit const *target) const
bool IsStackableWithRanks() const
SpellCastResult CheckLocation(uint32 map_id, uint32 zone_id, uint32 area_id, Player const *player=NULL) const
bool CanBeUsedInCombat() const
SpellTargetRestrictionsEntry const * GetSpellTargetRestrictions() const
uint32 CategoryRecoveryTime
Definition SpellInfo.h:195
bool HasAnyEffectMechanic() const
uint32 GetSpellMechanicMaskByEffectMask(uint32 effectMask) const
SpellInfo(SpellEntry const *spellEntry, SpellEffectEntry const **effects)
flag128 SpellFamilyFlags
Definition SpellInfo.h:227
uint32 SpellReagentsId
Definition SpellInfo.h:243
uint32 ExplicitTargetMask
Definition SpellInfo.h:256
uint32 SpellTotemsId
Definition SpellInfo.h:246
bool IsAbilityLearnedWithProfession() const
float GetMaxRange(bool positive=false, Unit *caster=NULL, Spell *spell=NULL) const
bool IsQuestTame() const
bool IsAllowingDeadTarget() const
uint32 AttributesEx3
Definition SpellInfo.h:167
uint32 CasterAuraStateNot
Definition SpellInfo.h:187
bool _IsPositiveEffect(uint8 effIndex, bool deep) const
Mechanics GetEffectMechanic(uint8 effIndex) const
SpellSchoolMask GetSchoolMask() const
int32 AreaGroupId
Definition SpellInfo.h:230
bool IsPrimaryProfession() const
bool NeedsComboPoints() const
AuraStateType GetAuraState() const
bool IsChanneled() const
uint32 InterruptFlags
Definition SpellInfo.h:198
SpellDurationEntry const * DurationEntry
Definition SpellInfo.h:207
uint32 Attributes
Definition SpellInfo.h:164
uint32 AttributesEx
Definition SpellInfo.h:165
char * SpellName
Definition SpellInfo.h:222
bool IsPassiveStackableWithRanks() const
SpellCategoryEntry const * CategoryEntry
Definition SpellInfo.h:161
int32 CoefLevelBase
Definition SpellInfo.h:254
uint32 MaxAffectedTargets
Definition SpellInfo.h:225
int32 GetDuration() const
bool IsAffectedBySpellMods() const
SpellCastResult CheckVehicle(Unit const *caster) const
uint32 AttributesEx6
Definition SpellInfo.h:170
uint32 AttributesEx7
Definition SpellInfo.h:171
int32 EquippedItemSubClassMask
Definition SpellInfo.h:216
uint32 GetExplicitTargetMask() const
uint32 AttributesEx9
Definition SpellInfo.h:173
int32 CastTimeMax
Definition SpellInfo.h:250
uint32 FacingCasterFlags
Definition SpellInfo.h:184
uint32 StartRecoveryTime
Definition SpellInfo.h:197
uint32 TargetAuraSpell
Definition SpellInfo.h:190
bool HasAreaAuraEffect() const
uint32 GetAllEffectsMechanicMask() const
uint32 SpellIconID
Definition SpellInfo.h:220
SpellChainNode const * ChainEntry
Definition SpellInfo.h:257
uint32 SpellAuraOptionsId
Definition SpellInfo.h:234
uint32 Targets
Definition SpellInfo.h:181
SpellAuraRestrictionsEntry const * GetSpellAuraRestrictions() const
void _InitializeExplicitTargetMask()
bool IsDifferentRankOf(SpellInfo const *spellInfo) const
SpellInfo const * GetLastRankSpell() const
bool NeedsExplicitUnitTarget() const
SpellInfo const * GetNextRankSpell() const
SpellCastTimesEntry const * CastTimeEntry
Definition SpellInfo.h:193
int32 EquippedItemInventoryTypeMask
Definition SpellInfo.h:217
SpellCastResult CheckTarget(Unit const *caster, WorldObject const *target, bool implicit=true) const
SpellCastingRequirementsEntry const * GetSpellCastingRequirements() const
uint32 Totem[2]
Definition SpellInfo.h:212
bool IsPrimaryProfessionFirstRank() const
bool HasEffect(SpellEffects effect) const
uint32 SpellClassOptionsId
Definition SpellInfo.h:238
bool IsAffectingArea() const
bool IsProfession() const
bool IsPositive() const
bool IsAutoRepeatRangedSpell() const
uint32 TargetCreatureType
Definition SpellInfo.h:182
uint32 ProcChance
Definition SpellInfo.h:202
uint32 SpellCastingRequirementsId
Definition SpellInfo.h:236
uint32 AttributesEx2
Definition SpellInfo.h:166
uint32 DmgClass
Definition SpellInfo.h:228
uint32 AttributesEx5
Definition SpellInfo.h:169
bool IsRangedWeaponSpell() const
uint32 SpellCooldownsId
Definition SpellInfo.h:239
uint32 AttributesEx4
Definition SpellInfo.h:168
bool CanDispelAura(SpellInfo const *aura) const
uint32 SpellScalingId
Definition SpellInfo.h:233
uint32 ExcludeCasterAuraSpell
Definition SpellInfo.h:191
bool HasAura(AuraType aura) const
bool IsTargetingArea() const
uint32 StartRecoveryCategory
Definition SpellInfo.h:196
int32 Reagent[MAX_SPELL_REAGENTS]
Definition SpellInfo.h:213
uint32 SpellLevelsId
Definition SpellInfo.h:242
int32 CastTimeMin
Definition SpellInfo.h:249
SpellCastResult CheckExplicitTarget(Unit const *caster, WorldObject const *target, Item const *itemTarget=NULL) const
float CoefBase
Definition SpellInfo.h:253
uint32 SpellFamilyName
Definition SpellInfo.h:226
SpellCooldownsEntry const * GetSpellCooldowns() const
uint32 AuraInterruptFlags
Definition SpellInfo.h:199
bool IsBreakingStealth() const
bool IsPositiveEffect(uint8 effIndex) const
bool IsSingleTarget() const
SpellEquippedItemsEntry const * GetSpellEquippedItems() const
SpellAuraOptionsEntry const * GetSpellAuraOptions() const
uint32 SpellEquippedItemsId
Definition SpellInfo.h:240
Definition Unit.h:1367
bool IsVehicle() const
Definition Unit.h:1523
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition Unit.cpp:3936
Vehicle * GetVehicle() const
Definition Unit.h:2743
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=NULL, Unit const *Caster=NULL) const
Player * m_movedPlayer
Definition Unit.h:2156
Player * GetSpellModOwner() const
Definition Unit.cpp:5818
bool CanFreeMove() const
Definition Unit.cpp:5144
float ApplyEffectModifiers(SpellInfo const *spellProto, uint8 effect_index, float value) const
Definition Unit.cpp:4681
bool IsAlive() const
Definition Unit.h:2032
bool HasAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=NULL) const
Definition Unit.cpp:3816
Unit * GetCharmerOrOwner() const
Definition Unit.cpp:2419
bool IsVisible() const
Definition Unit.cpp:4158
bool HasAuraType(AuraType auraType) const
bool HasUnitState(const uint32 f) const
Definition Unit.h:1485
bool IsInRaidWith(Unit const *unit) const
Definition Unit.cpp:7253
bool IsControlledByPlayer() const
Definition Unit.h:2100
uint32 GetCreatureTypeMask() const
Definition Unit.cpp:4925
uint8 getLevel() const
Definition Unit.h:1528
MountCapabilityEntry const * GetMountCapability(uint32 mountType) const
Definition Unit.cpp:3728
uint64 GetCritterGUID() const
Definition Unit.h:2095
bool IsInPartyWith(Unit const *unit) const
Definition Unit.cpp:7234
bool IsInCombat() const
Definition Unit.h:1896
void ModSpellCastTime(SpellInfo const *spellProto, int32 &castTime, Spell *spell=NULL)
Definition Unit.cpp:4821
VehicleSeatEntry const * GetSeatForPassenger(Unit const *passenger) const
Returns information on the seat of specified passenger, represented by the format in VehicleSeat....
Definition Vehicle.cpp:614
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1666
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false) const
Definition Object.cpp:2105
uint32 GetEffectIndexMask(uint32 effIndex)
uint32 CalculateMaxTicks(int32 duration, SpellTickEffectInfo const *effects, uint32 effectCount)
uint32 GetDispelMask(DispelType type)
int32 CalculateBaseCastTime(uint8 level, int32 castTimeMin, int32 castTimeMax, int32 castTimeMaxLevel, int32 fallbackCastTime)
uint32 CalculateRecoveryTime(uint32 recoveryTime, uint32 categoryRecoveryTime)
uint32 GetMechanicMask(uint32 mechanic)
int32 CalculateDuration(bool hasDurationEntry, int32 duration)
float SelectSpellRange(bool hasRangeEntry, float friendRange, float hostileRange, bool positive)
float CalculateRadius(SpellRadiusCalculationData const &data)
uint32 FinalizeCastTime(int32 castTime, bool addRangedAmmoDelay)
int32 CalculateEffectBaseValue(int32 value, int32 dieSides)
bool HasMechanic(uint32 mask, uint32 mechanic)
uint32 nextGroup
uint32 AreaId[MAX_GROUP_AREA_IDS]
bool IsBattleground() const
uint32 addon
bool IsContinent() const
bool IsRaid() const
bool IsBattleArena() const
uint32 req_skill_value
uint32 learnOnGetSkill
uint32 StackAmount
uint32 procFlags
uint32 procCharges
uint32 procChance
uint32 excludeTargetAuraSpell
uint32 TargetAuraState
uint32 excludeCasterAuraSpell
uint32 TargetAuraStateNot
uint32 CasterAuraState
uint32 targetAuraSpell
uint32 CasterAuraStateNot
uint32 casterAuraSpell
uint32 FacingCasterFlags
uint32 RequiresSpellFocus
int32 AreaGroupId
uint32 PreventionType
uint32 Dispel
uint32 DmgClass
uint32 StartRecoveryCategory
uint32 Category
uint32 Mechanic
SpellInfo const * first
Definition SpellMgr.h:507
uint32 SpellFamilyName
flag128 SpellFamilyFlags
uint32 StartRecoveryTime
uint32 RecoveryTime
uint32 CategoryRecoveryTime
uint32 EffectApplyAuraName
uint32 EffectChainTarget
uint32 Effect
uint32 EffectItemType
float EffectValueMultiplier
int32 EffectMiscValue
float EffectRealPointsPerLevel
float EffectDamageMultiplier
uint32 EffectTriggerSpell
uint32 EffectRadiusIndex
int32 EffectMiscValueB
float EffectPointsPerComboPoint
uint32 EffectAuraTickCount
uint32 EffectIndex
float EffectBonusMultiplier
uint32 EffectImplicitTargetA
int32 EffectDieSides
uint32 Id
int32 EffectBasePoints
flag128 EffectSpellClassMask
uint32 EffectRadiusMaxIndex
uint32 EffectImplicitTargetB
uint32 EffectMechanic
uint32 ResearchProject
char * SpellName
uint32 runeCostID
uint32 SpellCastingRequirementsId
uint32 SpellLevelsId
uint32 SpellMiscId
uint32 SpellTargetRestrictionsId
uint32 SpellShapeshiftId
uint32 SpellCategoriesId
uint32 Id
uint32 SpellReagentsId
uint32 SpellAuraOptionsId
uint32 SpellEquippedItemsId
uint32 SpellAuraRestrictionsId
uint32 SpellClassOptionsId
uint32 SpellTotemsId
uint32 SpellScalingId
uint32 SpellInterruptsId
uint32 SpellCooldownsId
int32 EquippedItemSubClassMask
int32 EquippedItemClass
int32 EquippedItemInventoryTypeMask
uint32 AuraInterruptFlags
uint32 ChannelInterruptFlags
uint32 InterruptFlags
uint32 baseLevel
uint32 maxLevel
uint32 spellLevel
uint32 AttributesEx3
uint32 AttributesEx7
uint32 AttributesEx9
uint32 SchoolMask
uint32 AttributesEx8
float speed
uint32 rangeIndex
uint32 DurationIndex
uint32 SpellIconID
uint32 CastingTimeIndex
uint32 AttributesEx5
uint32 AttributesEx2
uint32 SpellVisual[2]
uint32 AttributesEx4
uint32 Attributes
uint32 AttributesEx
uint32 activeIconID
uint32 AttributesEx6
uint32 spellId
Definition Player.h:176
flag128 mask
Definition Player.h:175
int32 Reagent[MAX_SPELL_REAGENTS]
uint32 ReagentCount[MAX_SPELL_REAGENTS2]
int32 CoefLevelBase
float CoefBase
int32 ScalingClass
int32 CastTimeMaxLevel
int32 CastTimeMax
int32 CastTimeMin
uint32 StancesNot
uint32 Stances
uint32 flags1
uint32 Targets
uint32 MaxAffectedTargets
uint32 TargetCreatureType
uint32 TotemCategory[MAX_SPELL_TOTEMS]
uint32 Totem[MAX_SPELL_TOTEMS]
uint32 Category
uint32 m_flags