Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_doomlord_kazzak.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 "ScriptMgr.h"
7#include "ScriptedCreature.h"
8#include "SpellAuraEffects.h"
9#include "SpellScript.h"
10
21
35
47
49{
50 public:
51 boss_doomlord_kazzak() : CreatureScript("boss_doomlord_kazzak") { }
52
54 {
56 {
57 }
58
60 {
61 _events.Reset();
62 _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, std::rand() % 10000 + 6000);
63 _events.ScheduleEvent(EVENT_CLEAVE, 7000);
64 _events.ScheduleEvent(EVENT_THUNDERCLAP, std::rand() % 18000 + 14000);
65 _events.ScheduleEvent(EVENT_VOID_BOLT, 30000);
66 _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 25000);
67 _events.ScheduleEvent(EVENT_ENRAGE, 60000);
68 _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 33000);
69 _events.ScheduleEvent(EVENT_BERSERK, 180000);
70 }
71
73 {
75 }
76
77 void EnterCombat(Unit* /*who*/) OVERRIDE
78 {
80 }
81
82 void KilledUnit(Unit* victim) OVERRIDE
83 {
84 // When Kazzak kills a player (not pets/totems), he regens some health
85 if (victim->GetTypeId() != TypeID::TYPEID_PLAYER)
86 return;
87
89
91 }
92
93 void JustDied(Unit* /*killer*/) OVERRIDE
94 {
96 }
97
99 {
100 // Return since we have no target
101 if (!UpdateVictim())
102 return;
103
104 _events.Update(diff);
105
106 if (me->HasUnitState(UNIT_STATE_CASTING))
107 return;
108
109 while (uint32 eventId = _events.ExecuteEvent())
110 {
111 switch (eventId)
112 {
115 _events.ScheduleEvent(EVENT_SHADOW_VOLLEY, std::rand() % 6000 + 4000);
116 break;
117 case EVENT_CLEAVE:
119 _events.ScheduleEvent(EVENT_CLEAVE, std::rand() % 12000 + 8000);
120 break;
123 _events.ScheduleEvent(EVENT_THUNDERCLAP, std::rand() % 14000 + 10000);
124 break;
125 case EVENT_VOID_BOLT:
127 _events.ScheduleEvent(EVENT_VOID_BOLT, std::rand() % 18000 + 15000);
128 break;
130 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
132 _events.ScheduleEvent(EVENT_MARK_OF_KAZZAK, 20000);
133 break;
134 case EVENT_ENRAGE:
137 _events.ScheduleEvent(EVENT_ENRAGE, 30000);
138 break;
140 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
142 _events.ScheduleEvent(EVENT_TWISTED_REFLECTION, 15000);
143 break;
144 case EVENT_BERSERK:
146 break;
147 default:
148 break;
149 }
150 }
151
153 }
154
155 private:
157 };
158
160 {
161 return new boss_doomlordkazzakAI(creature);
162 }
163};
164
166{
167 public:
168 spell_mark_of_kazzak() : SpellScriptLoader("spell_mark_of_kazzak") { }
169
171 {
173
174 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
175 {
176 if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_KAZZAK_DAMAGE))
177 return false;
178 return true;
179 }
180
181 void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
182 {
183 if (Unit* owner = GetUnitOwner())
184 amount = CalculatePct(owner->GetPower(POWER_MANA), 5);
185 }
186
187 void OnPeriodic(AuraEffect const* aurEff)
188 {
189 Unit* target = GetTarget();
190
191 if (target->GetPower(POWER_MANA) == 0)
192 {
193 target->CastSpell(target, SPELL_MARK_OF_KAZZAK_DAMAGE, true, NULL, aurEff);
194 // Remove aura
195 SetDuration(0);
196 }
197 }
198
204 };
205
207 {
209 }
210};
211
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
@ EFFECT_0
@ POWER_MANA
@ SPELL_AURA_PERIODIC_MANA_LEECH
#define sSpellMgr
Definition SpellMgr.h:744
#define AuraEffectCalcAmountFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
T CalculatePct(T base, U pct)
Definition Util.h:103
@ SPELL_CLEAVE
@ SPELL_ENRAGE
@ EVENT_ENRAGE
@ EVENT_CLEAVE
@ SAY_INTRO
#define SAY_DEATH
#define SAY_AGGRO
#define SAY_KILL
@ SPELL_MARK_OF_KAZZAK_DAMAGE
@ SPELL_TWISTED_REFLECTION
@ SPELL_SHADOW_VOLLEY
@ SPELL_VOID_BOLT
@ SPELL_THUNDERCLAP
@ SPELL_MARK_OF_KAZZAK
@ SPELL_CAPTURE_SOUL
void AddSC_boss_doomlordkazzak()
@ EVENT_MARK_OF_KAZZAK
@ EVENT_SHADOW_VOLLEY
@ EVENT_THUNDERCLAP
@ EVENT_VOID_BOLT
@ EVENT_TWISTED_REFLECTION
@ EVENT_THUNDERCLAP
#define SPELL_BERSERK
@ EVENT_BERSERK
@ SPELL_SHADOW_VOLLEY
@ EVENT_SHADOW_VOLLEY
@ SPELL_THUNDERCLAP
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectCalcAmountHandler > DoEffectCalcAmount
void SetDuration(int32 duration, bool withMods=false)
Unit * GetTarget() const
Unit * GetUnitOwner() const
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
SpellScriptLoader(const char *name)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition UnitAI.cpp:66
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
Definition Unit.h:1367
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)
int32 GetPower(Powers power) const
Definition Unit.cpp:5237
CreatureAI * GetAI(Creature *creature) const OVERRIDE
PrepareAuraScript(spell_mark_of_kazzak_AuraScript)
void CalculateAmount(AuraEffect const *, int32 &amount, bool &)
AuraScript * GetAuraScript() const OVERRIDE
Creature * me
ScriptedAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================