Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
spell_shaman.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/*
7 * Scripts for spells with SPELLFAMILY_SHAMAN and SPELLFAMILY_GENERIC spells used by shaman players.
8 * Ordered alphabetically using scriptname.
9 * Scriptnames of files in this file should be prefixed with "spell_sha_".
10 */
11
12#include "Player.h"
13#include "ScriptMgr.h"
14#include "GridNotifiers.h"
15#include "Unit.h"
16#include "SpellScript.h"
17#include "SpellAuraEffects.h"
18
51
57
58// -51556 - Ancestral Awakening
60{
61public:
62 spell_sha_ancestral_awakening() : SpellScriptLoader("spell_sha_ancestral_awakening") { }
63
88
93};
94
95// 52759 - Ancestral Awakening
129
130// 2825 - Bloodlust
133{
134public:
135 spell_sha_bloodlust() : SpellScriptLoader("spell_sha_bloodlust") { }
136
169
174};
175
176// 1064 - Chain Heal
179{
180public:
181 spell_sha_chain_heal() : SpellScriptLoader("spell_sha_chain_heal") { }
182
184 {
186
188 {
189 firstHeal = true;
190 riptide = false;
191 amount = 0;
192 return true;
193 }
194
195 void HandleHeal(SpellEffIndex /*effIndex*/)
196 {
197 if (firstHeal)
198 {
199 // Check if the target has Riptide
200 if (AuraEffect* aurEff = GetHitUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, GetCaster()->GetGUID()))
201 {
202 riptide = true;
203 amount = aurEff->GetSpellInfo()->Effects[EFFECT_2].CalcValue();
204 // Consume it
205 GetHitUnit()->RemoveAura(aurEff->GetBase());
206 }
207 firstHeal = false;
208 }
209 // Riptide increases the Chain Heal effect by 25%
210 if (riptide)
211 {
213 SetHitHeal(GetHitHeal() + bonus);
214 }
215 }
216
221
225 };
226
231};
232
233// 974 - Earth Shield
235{
236public:
237 spell_sha_earth_shield() : SpellScriptLoader("spell_sha_earth_shield") { }
238
240 {
242
243 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
244 {
245 if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EARTH_SHIELD_HEAL))
246 return false;
247 return true;
248 }
249
250 void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
251 {
252 if (Unit* caster = GetCaster())
253 {
254 amount = caster->SpellHealingBonusDone(GetUnitOwner(), GetSpellInfo(), amount, HEAL);
255 amount = GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, HEAL);
256 }
257 }
258
259 bool CheckProc(ProcEventInfo& /*eventInfo*/)
260 {
262 if (Player* player = GetTarget()->ToPlayer())
263 if (player->HasSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL))
264 return false;
265 return true;
266 }
267
268 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
269 {
271
273
275 if (Player* player = GetTarget()->ToPlayer())
276 player->AddSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL, 0, time(NULL) + 3);
277 }
278
285 };
286
291};
292
293// 1535 Fire Nova
296{
297public:
298 spell_sha_fire_nova() : SpellScriptLoader("spell_sha_fire_nova") { }
299
301 {
303
304 void HandleDummy(SpellEffIndex /*effIndex*/)
305 {
306 Unit* caster = GetCaster();
307 if (Unit* target = GetHitUnit())
308 {
309 if (target->HasAura(SPELL_SHAMAN_FLAME_SHOCK))
310 {
311 caster->CastSpell(target, SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1, true);
312 target->RemoveAurasDueToSpell(SPELL_SHAMAN_FLAME_SHOCK);
313 }
314 }
315 }
316
321 };
322
327};
328
329// 55440 - Glyph of Healing Wave
331{
332public:
333 spell_sha_glyph_of_healing_wave() : SpellScriptLoader("spell_sha_glyph_of_healing_wave") { }
334
336 {
338
339 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
340 {
342 return false;
343 return true;
344 }
345
346 bool CheckProc(ProcEventInfo& eventInfo)
347 {
348 // Not proc from self heals
349 return GetTarget() != eventInfo.GetProcTarget();
350 }
351
352 void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
353 {
355 int32 heal = CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount());
356
358 }
359
365 };
366
371};
372
373// 52041 - Healing Stream Totem
376{
377public:
378 spell_sha_healing_stream_totem() : SpellScriptLoader("spell_sha_healing_stream_totem") { }
379
381 {
383
384 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
385 {
387 }
388
389 void HandleDummy(SpellEffIndex /* effIndex */)
390 {
391 int32 damage = GetEffectValue();
392 SpellInfo const* triggeringSpell = GetTriggeringSpell();
393 if (Unit* target = GetHitUnit())
394 if (Unit* caster = GetCaster())
395 {
396 if (Unit* owner = caster->GetOwner())
397 {
398 if (triggeringSpell)
399 damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL));
400
401 // Soothing Rains
403 AddPct(damage, dummy->GetAmount());
404
405 damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL));
406 }
407 caster->CastCustomSpell(target, SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID());
408 }
409 }
410
415 };
416
421};
422
423// 32182 - Heroism
426{
427public:
428 spell_sha_heroism() : SpellScriptLoader("spell_sha_heroism") { }
429
462
464 {
466 }
467};
468
469// 23551 - Lightning Shield
471{
472public:
473 spell_sha_item_lightning_shield() : SpellScriptLoader("spell_sha_item_lightning_shield") { }
474
497
502};
503
504// 23552 - Lightning Shield
538
539// 23572 - Mana Surge
541{
542public:
543 spell_sha_item_mana_surge() : SpellScriptLoader("spell_sha_item_mana_surge") { }
544
546 {
548
549 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
550 {
552 return false;
553 return true;
554 }
555
556 void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
557 {
559 //int32 mana = eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), SpellSchoolMask(eventInfo.GetDamageInfo()->GetSchoolMask()));
560 //mana = int32(CalculatePct(mana, 35));
561
562 //GetTarget()->CastCustomSpell(SPELL_SHAMAN_ITEM_MANA_SURGE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
563 }
564
569 };
570
575};
576
577// 60103 - Lava Lash
580{
581public:
582 spell_sha_lava_lash() : SpellScriptLoader("spell_sha_lava_lash") { }
583
585 {
592
593 void HandleDummy(SpellEffIndex /*effIndex*/)
594 {
595 if (Player* caster = GetCaster()->ToPlayer())
596 {
597 int32 damage = GetEffectValue();
598 int32 hitDamage = GetHitDamage();
599 if (caster->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND))
600 {
601 // Damage is increased by 25% if your off-hand weapon is enchanted with Flametongue.
602 if (caster->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0x200000, 0, 0))
603 AddPct(hitDamage, damage);
604 SetHitDamage(hitDamage);
605 }
606 }
607 }
608
613 };
614
619};
620
622{
623public:
624 spell_sha_lava_surge() : SpellScriptLoader("spell_sha_lava_surge") { }
625
627 {
629
630 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
631 {
632 if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_SURGE))
633 return false;
634 return true;
635 }
636
637 void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
638 {
641 }
642
647 };
648
650 {
652 }
653};
654
656{
657public:
658 spell_sha_lava_surge_proc() : SpellScriptLoader("spell_sha_lava_surge_proc") { }
659
661 {
663
664 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
665 {
666 if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_BURST))
667 return false;
668 return true;
669 }
670
672 {
674 }
675
680
685 };
686
691};
692
693// 16191 - Mana Tide
696{
697public:
698 spell_sha_mana_tide_totem() : SpellScriptLoader("spell_sha_mana_tide_totem") { }
699
701 {
703
704 void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
705 {
707 if (Unit* caster = GetCaster())
708 if (Unit* owner = caster->GetOwner())
709 amount = CalculatePct(owner->GetStat(STAT_SPIRIT), aurEff->GetAmount());
710 }
711
716 };
717
722};
723
724// -30881 - Nature's Guardian
726{
727public:
728 spell_sha_nature_guardian() : SpellScriptLoader("spell_sha_nature_guardian") { }
729
731 {
733
734 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
735 {
736 if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_NATURE_GUARDIAN))
737 return false;
738 return true;
739 }
740
741 bool CheckProc(ProcEventInfo& eventInfo)
742 {
744 if (Player* player = GetTarget()->ToPlayer())
745 if (player->HasSpellCooldown(GetSpellInfo()->Id))
746 return false;
747
748 return GetTarget()->HealthBelowPctDamaged(30, eventInfo.GetDamageInfo()->GetDamage());
749 }
750
751 void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
752 {
754 int32 basePoints0 = GetTarget()->CountPctFromMaxHealth(aurEff->GetAmount());
755
756 GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_NATURE_GUARDIAN, &basePoints0, NULL, NULL, true);
757
758 if (eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->IsAlive())
760
761 if (Player* player = GetTarget()->ToPlayer())
762 player->AddSpellCooldown(GetSpellInfo()->Id, 0, time(NULL) + aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue());
763 }
764
770 };
771
776};
777
778// 88756 - Rolling Thunder
780{
781public:
782 spell_sha_rolling_thunder() : SpellScriptLoader("spell_sha_rolling_thunder") { }
783
785 {
787
788 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
789 {
790 if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LIGHTNING_SHIELD))
791 return false;
792 return true;
793 }
794
795 void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
796 {
798 {
799 aura->SetCharges(std::min(aura->GetCharges() + 1, aurEff->GetAmount()));
800 aura->RefreshDuration();
801 }
802 }
803
808 };
809
814};
815
816// 82984 - Telluric Currents
818{
819public:
820 spell_sha_telluric_currents() : SpellScriptLoader("spell_sha_telluric_currents") { }
821
823 {
825
826 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
827 {
828 if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TELLURIC_CURRENTS))
829 return false;
830 return true;
831 }
832
833 void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
834 {
836 int32 basePoints0 = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount());
837
838 GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_TELLURIC_CURRENTS, &basePoints0, NULL, NULL, true);
839 }
840
845 };
846
851};
852
853// 51490 - Thunderstorm
881
882// 51562 - Tidal Waves
884{
885public:
886 spell_sha_tidal_waves() : SpellScriptLoader("spell_sha_tidal_waves") { }
887
889 {
891
892 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
893 {
894 if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TIDAL_WAVES))
895 return false;
896 return true;
897 }
898
899 void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
900 {
902 int32 basePoints0 = -aurEff->GetAmount();
903 int32 basePoints1 = aurEff->GetAmount();
904
905 GetTarget()->CastCustomSpell(GetTarget(), SPELL_SHAMAN_TIDAL_WAVES, &basePoints0, &basePoints1, NULL, true, NULL, aurEff);
906 }
907
912 };
913
918};
919
920
921// 114049 - Ascendance
923{
924public:
925 spell_sha_ascendance() : SpellScriptLoader("spell_sha_ascendance") { }
926
928 {
930
932 {
933 if (Player* player = GetCaster()->ToPlayer())
934 {
935 switch (player->GetTalentSpecialization(player->GetActiveSpec()))
936 {
941 default:
943 }
944 }
945
947 }
948
950 {
951 if (Player* player = GetCaster()->ToPlayer())
952 {
953 switch (player->GetTalentSpecialization(player->GetActiveSpec()))
954 {
956 player->CastSpell(player, SPELL_SHAMAN_ASCENDANCE_ENHANCEMENT, true);
957 break;
959 player->CastSpell(player, SPELL_SHAMAN_ASCENDANCE_ELEMENTAL, true);
960 break;
962 player->CastSpell(player, SPELL_SHAMAN_ASCENDANCE_RESTORATION, true);
963 break;
964 default:
965 break;
966 }
967 }
968 }
969
975 };
976
981};
982
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ TYPEID_PLAYER
Definition Object.h:55
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:705
@ TALENT_TREE_SHAMAN_ELEMENTAL
Definition Player.h:149
@ TALENT_TREE_SHAMAN_RESTORATION
Definition Player.h:151
@ TALENT_TREE_SHAMAN_ENHANCEMENT
Definition Player.h:150
#define INVENTORY_SLOT_BAG_0
Definition Player.h:684
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_HEAL
@ SPELL_EFFECT_KNOCK_BACK
@ TARGET_UNIT_CASTER_AREA_RAID
@ SPELLFAMILY_SHAMAN
@ STAT_SPIRIT
SpellCastResult
@ SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_PERIODIC_HEAL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MOD_STAT
#define sSpellMgr
Definition SpellMgr.h:744
#define SpellCheckCastFn(F)
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define AuraEffectCalcAmountFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraCheckProcFn(F)
#define SpellHitFn(F)
@ SPELLVALUE_BASE_POINT0
Definition Unit.h:114
@ HEAL
Definition Unit.h:617
T AddPct(T &base, U pct)
Definition Util.h:109
T CalculatePct(T base, U pct)
Definition Util.h:103
virtual bool Validate(SpellInfo const *)
virtual bool Load()
SpellInfo const * GetSpellInfo() const
int32 GetAmount() const
void PreventDefaultAction()
SpellInfo const * GetSpellInfo() const
HookList< EffectCalcAmountHandler > DoEffectCalcAmount
uint64 GetCasterGUID() const
Unit * GetCaster() const
Aura * GetAura() const
Unit * GetTarget() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectProcHandler > OnEffectProc
Unit * GetUnitOwner() const
uint32 GetDamage() const
Definition Unit.h:923
uint32 GetHeal() const
Definition Unit.h:959
Player * ToPlayer()
Definition Object.h:204
TypeID GetTypeId() const
Definition Object.h:131
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition Player.cpp:4284
HealInfo * GetHealInfo() const
Definition Unit.h:986
DamageInfo * GetDamageInfo() const
Definition Unit.h:985
Unit * GetProcTarget() const
Definition Unit.h:974
int32 CalcValue(Unit const *caster=NULL, int32 const *basePoints=NULL, Unit const *target=NULL) const
SpellEffectInfo Effects[MAX_SPELL_EFFECTS]
Definition SpellInfo.h:255
HookList< CheckCastHandler > OnCheckCast
HookList< HitHandler > AfterHit
HookList< HitHandler > OnHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
HookList< EffectHandler > OnEffectHitTarget
Unit * GetHitUnit()
int32 GetEffectValue()
SpellInfo const * GetTriggeringSpell()
void SetHitDamage(int32 damage)
void SetHitHeal(int32 heal)
Unit * GetOriginalCaster()
int32 GetHitHeal()
Unit * GetCaster()
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
int32 GetHitDamage()
SpellScriptLoader(const char *name)
void modifyThreatPercent(Unit *victim, int32 percent)
Definition Unit.h:1367
Unit * GetOwner() const
Definition Unit.cpp:2339
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
bool IsAlive() const
Definition Unit.h:2032
uint32 SpellHealingBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1) const
void CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
ThreatManager & getThreatManager()
Definition Unit.h:2455
uint32 CountPctFromMaxHealth(int32 pct) const
Definition Unit.h:1633
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition Unit.h:1617
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
SpellScript * GetSpellScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_sha_ascendance_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_sha_bloodlust_SpellScript)
void RemoveInvalidTargets(std::list< WorldObject * > &targets)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_sha_chain_heal_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &)
PrepareAuraScript(spell_sha_earth_shield_AuraScript)
void CalculateAmount(AuraEffect const *, int32 &amount, bool &)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_sha_fire_nova_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
AuraScript * GetAuraScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_sha_heroism_SpellScript)
bool Validate(SpellInfo const *) OVERRIDE
void RemoveInvalidTargets(std::list< WorldObject * > &targets)
Updated 4.3.4.
SpellScript * GetSpellScript() const OVERRIDE
void OnProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
AuraScript * GetAuraScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
void OnProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
PrepareAuraScript(spell_sha_item_mana_surge_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_sha_lava_lash_SpellScript) bool Load() OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareAuraScript(spell_sha_lava_surge_AuraScript)
void HandleEffectProc(AuraEffect const *, ProcEventInfo &)
PrepareSpellScript(spell_sha_lava_surge_proc_SpellScript) bool Validate(SpellInfo const *) OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
PrepareAuraScript(spell_sha_mana_tide_totem_AuraScript)
void CalculateAmount(AuraEffect const *aurEff, int32 &amount, bool &)
AuraScript * GetAuraScript() const OVERRIDE
void OnProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
PrepareAuraScript(spell_sha_nature_guardian_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
PrepareAuraScript(spell_sha_rolling_thunder_AuraScript)
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo &)
AuraScript * GetAuraScript() const OVERRIDE
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_sha_thunderstorm_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo &)
PrepareAuraScript(spell_sha_tidal_waves_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
ShamanSpells
@ SPELL_SHAMAN_SATED
@ SPELL_MAGE_TEMPORAL_DISPLACEMENT
@ SPELL_HUNTER_INSANITY
void AddSC_shaman_spell_scripts()
ShamanSpellIcons
@ SHAMAN_ICON_ID_SOOTHING_RAIN
@ SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW
@ SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM
@ SPELL_SHAMAN_NATURE_GUARDIAN
@ SPELL_SHAMAN_ASCENDANCE_RESTORATION
@ SPELL_SHAMAN_LAVA_SURGE
@ SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD
@ SPELL_SHAMAN_SATED
@ SPELL_SHAMAN_FLAME_SHOCK
@ SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE
@ SPELL_SHAMAN_LIGHTNING_SHIELD
@ SPELL_SHAMAN_ANCESTRAL_AWAKENING
@ SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM
@ SPELL_SHAMAN_GLYPH_OF_HEALING_WAVE
@ SPELL_MAGE_TEMPORAL_DISPLACEMENT
@ SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL
@ SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC
@ SPELL_SHAMAN_LAVA_BURST
@ SPELL_HUNTER_INSANITY
@ SPELL_SHAMAN_EXHAUSTION
@ SPELL_SHAMAN_ASCENDANCE_ELEMENTAL
@ SPELL_SHAMAN_ASCENDANCE_ENHANCEMENT
@ SPELL_SHAMAN_EARTH_SHIELD_HEAL
@ SPELL_SHAMAN_TELLURIC_CURRENTS
@ SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1
@ SPELL_SHAMAN_ITEM_MANA_SURGE
@ SPELL_SHAMAN_TIDAL_WAVES