Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_alizabal.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 "Player.h"
9#include "ObjectAccessor.h"
10#include "baradin_hold.h"
11
23
32
34{
36};
37
38 enum Points
39{
41};
42
50
52{
53 public:
54 at_alizabal_intro() : AreaTriggerScript("at_alizabal_intro") { }
55
56 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/)
57 {
58 if (InstanceScript* instance = player->GetInstanceScript())
59 if (Creature* alizabal = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_ALIZABAL)))
60 alizabal->AI()->DoAction(ACTION_INTRO);
61 return true;
62 }
63};
64
66{
67 public:
68 boss_alizabal() : CreatureScript("boss_alizabal") { }
69
70 struct boss_alizabalAI : public BossAI
71 {
73 {
74 _intro = false;
75 }
76
78 {
79 _Reset();
80 _hate = false;
81 _skewer = false;
82 }
83
84 void EnterCombat(Unit* /*who*/) OVERRIDE
85 {
88 instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
89 events.ScheduleEvent(EVENT_RANDOM_CAST, 10000);
90 }
91
92 void JustDied(Unit* /*killer*/) OVERRIDE
93 {
94 _JustDied();
96 instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
97 }
98
100 {
101 if (who->GetTypeId() == TypeID::TYPEID_PLAYER)
102 Talk(SAY_SLAY);
103 }
104
106 {
107 instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
108 me->GetMotionMaster()->MoveTargetedHome();
110 }
111
113 {
114 switch (action)
115 {
116 case ACTION_INTRO:
117 if (!_intro)
118 {
120 _intro = true;
121 }
122 break;
123 }
124 }
125
126 void MovementInform(uint32 /*type*/, uint32 pointId) OVERRIDE
127 {
128 switch (pointId)
129 {
130 case POINT_STORM:
131 events.ScheduleEvent(EVENT_CAST_STORM, 1);
132 break;
133 }
134 }
135
137 {
138 if (!UpdateVictim())
139 return;
140
141 events.Update(diff);
142
143 while (uint32 eventId = events.ExecuteEvent())
144 {
145 switch (eventId)
146 {
148 switch (std::rand() % 1)
149 {
150 case 0:
151 if (!_skewer)
152 {
153 if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0))
154 {
155 DoCast(target, SPELL_SKEWER, true);
157 Talk(SAY_SKEWER_ANNOUNCE, target);
158 }
159 _skewer = true;
160 events.ScheduleEvent(EVENT_RANDOM_CAST, std::rand() % 10000 + 7000);
161 }
162 else if (!_hate)
163 {
165 {
166 DoCast(target, SPELL_SEETHING_HATE, true);
167 Talk(SAY_HATE);
168 }
169 _hate = true;
170 events.ScheduleEvent(EVENT_RANDOM_CAST, std::rand() % 10000 + 7000);
171 }
172 else if (_hate && _skewer)
173 {
177 events.ScheduleEvent(EVENT_RANDOM_CAST, 21000);
178 events.ScheduleEvent(EVENT_MOVE_STORM, 4050);
179 events.ScheduleEvent(EVENT_STOP_STORM, 13000);
180 }
181 break;
182 case 1:
183 if (!_hate)
184 {
186 {
187 DoCast(target, SPELL_SEETHING_HATE, true);
188 Talk(SAY_HATE);
189 }
190 _hate = true;
191 events.ScheduleEvent(EVENT_RANDOM_CAST, std::rand() % 10000 + 7000);
192 }
193 else if (!_skewer)
194 {
195 if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0))
196 {
197 DoCast(target, SPELL_SKEWER, true);
199 Talk(SAY_SKEWER_ANNOUNCE, target);
200 }
201 _skewer = true;
202 events.ScheduleEvent(EVENT_RANDOM_CAST, std::rand() % 10000 + 7000);
203 }
204 else if (_hate && _skewer)
205 {
209 events.ScheduleEvent(EVENT_RANDOM_CAST, 21000);
210 events.ScheduleEvent(EVENT_MOVE_STORM, 4050);
211 events.ScheduleEvent(EVENT_STOP_STORM, 13000);
212 }
213 break;
214 }
215 break;
216 case EVENT_MOVE_STORM:
217 me->SetSpeed(MOVE_RUN, 4.0f);
218 me->SetSpeed(MOVE_WALK, 4.0f);
220 me->GetMotionMaster()->MovePoint(POINT_STORM, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
221 events.ScheduleEvent(EVENT_MOVE_STORM, 4050);
222 break;
223 case EVENT_STOP_STORM:
224 me->RemoveAura(SPELL_BLADE_DANCE);
225 me->RemoveAura(SPELL_BLADE_DANCE_DUMMY);
226 me->SetSpeed(MOVE_WALK, 1.0f);
227 me->SetSpeed(MOVE_RUN, 1.14f);
228 me->GetMotionMaster()->MoveChase(me->GetVictim());
229 _hate = false;
230 _skewer = false;
231 break;
232 case EVENT_CAST_STORM:
234 break;
235 }
236 }
237
239 }
240
241 private:
242 bool _intro;
243 bool _hate;
245 };
246
248 {
249 return GetBaradinHoldAI<boss_alizabalAI>(creature);
250 }
251};
252
254{
255 new boss_alizabal();
256 new at_alizabal_intro();
257}
Actions
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ ENCOUNTER_FRAME_DISENGAGE
@ ENCOUNTER_FRAME_ENGAGE
@ TYPEID_PLAYER
Definition Object.h:55
@ MOVE_RUN
Definition Unit.h:556
@ MOVE_WALK
Definition Unit.h:555
@ SELECT_TARGET_TOPAGGRO
Definition UnitAI.h:24
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
CreatureAI * GetBaradinHoldAI(Creature *creature)
@ DATA_ALIZABAL
void AddSC_boss_alizabal()
@ ACTION_INTRO
@ POINT_STORM
@ SPELL_BLADE_DANCE
@ SPELL_SKEWER
@ SPELL_BLADE_DANCE_DUMMY
@ SPELL_SEETHING_HATE
@ SAY_DEATH
@ SAY_HATE
@ SAY_AGGRO
@ SAY_BLADE_STORM
@ SAY_SKEWER_ANNOUNCE
@ SAY_SLAY
@ SAY_SKEWER
@ SAY_INTRO
@ EVENT_MOVE_STORM
@ EVENT_CAST_STORM
@ EVENT_RANDOM_CAST
@ EVENT_STOP_STORM
#define SAY_DEATH
#define SAY_AGGRO
#define SPELL_BERSERK
AreaTriggerScript(const char *name)
InstanceScript *const instance
void _DespawnAtEvade()
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
static Creature * GetCreature(WorldObject const &u, uint64 guid)
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 DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
Definition Unit.h:1367
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
bool OnTrigger(Player *player, AreaTriggerEntry const *)
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Creature * me
void MovementInform(uint32, uint32 pointId) OVERRIDE
void EnterCombat(Unit *) OVERRIDE
void KilledUnit(Unit *who) OVERRIDE
boss_alizabalAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void JustDied(Unit *) OVERRIDE
void DoAction(int32 action) OVERRIDE