TrinityCore
boss_vazruden_the_herald.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/* ScriptData
19Name: Boss_Vazruden_the_Herald
20%Complete: 90
21Comment:
22Category: Hellfire Citadel, Hellfire Ramparts
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "hellfire_ramparts.h"
27#include "MotionMaster.h"
28#include "ObjectAccessor.h"
29#include "Player.h"
30#include "ScriptedCreature.h"
31#include "SpellInfo.h"
32#include "TemporarySummon.h"
33
34enum Says
35{
37
42
43 EMOTE = 0
44};
45
47{
57};
58
59const float VazrudenMiddle[3] = { -1406.5f, 1746.5f, 81.2f };
60
61const float VazrudenRing[2][3] =
62{
63 { -1430.0f, 1705.0f, 112.0f },
64 { -1377.0f, 1760.0f, 112.0f }
65};
66
68{
69 public:
70 boss_nazan() : CreatureScript("boss_nazan") { }
71
72 struct boss_nazanAI : public BossAI
73 {
74 boss_nazanAI(Creature* creature) : BossAI(creature, DATA_NAZAN)
75 {
76 Initialize();
77 flight = true;
80 }
81
83 {
84 Fireball_Timer = 4000;
85 Fly_Timer = 45000;
86 Turn_Timer = 0;
87 }
88
89 void Reset() override
90 {
91 Initialize();
92 _Reset();
93 }
94
95 void JustEngagedWith(Unit* /*who*/) override { }
96
97 void IsSummonedBy(WorldObject* summoner) override
98 {
99 if (summoner->GetEntry() == NPC_VAZRUDEN_HERALD)
100 VazrudenGUID = summoner->GetGUID();
101 }
102
103 void JustSummoned(Creature* summoned) override
104 {
105 if (summoned && summoned->GetEntry() == NPC_LIQUID_FIRE)
106 {
107 summoned->SetLevel(me->GetLevel());
108 summoned->SetFaction(me->GetFaction());
110 summoned->CastSpell(summoned, SPELL_FIRE_NOVA_VISUAL, true);
111 }
112 }
113
114 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
115 {
116 if (spellInfo->Id == uint32(SPELL_FIREBALL))
118 }
119
120 void UpdateAI(uint32 diff) override
121 {
122 if (!UpdateVictim())
123 return;
124
125 if (Fireball_Timer <= diff)
126 {
128 DoCast(victim, SPELL_FIREBALL, true);
129 Fireball_Timer = urand(4000, 7000);
130 }
131 else
132 Fireball_Timer -= diff;
133
134 if (flight) // phase 1 - the flight
135 {
137 if (Fly_Timer < diff || !(Vazruden && Vazruden->IsAlive() && Vazruden->HealthAbovePct(20)))
138 {
139 flight = false;
140 BellowingRoar_Timer = 6000;
141 ConeOfFire_Timer = 12000;
142 me->SetDisableGravity(false);
143 me->SetWalk(true);
146 AttackStart(victim);
148 Talk(EMOTE);
149 return;
150 }
151 else
152 Fly_Timer -= diff;
153
154 if (Turn_Timer <= diff)
155 {
156 uint32 waypoint = (Fly_Timer/10000)%2;
159 Turn_Timer = 10000;
160 }
161 else
162 Turn_Timer -= diff;
163 }
164 else // phase 2 - land fight
165 {
166 if (ConeOfFire_Timer <= diff)
167 {
169 ConeOfFire_Timer = 12000;
170 Fireball_Timer = 4000;
171 }
172 else
173 ConeOfFire_Timer -= diff;
174
175 if (IsHeroic())
176 {
177 if (BellowingRoar_Timer <= diff)
178 {
180 BellowingRoar_Timer = 45000;
181 }
182 else
183 BellowingRoar_Timer -= diff;
184 }
185 }
186 }
187
188 private:
194 bool flight;
196 };
197
198 CreatureAI* GetAI(Creature* creature) const override
199 {
200 return GetHellfireRampartsAI<boss_nazanAI>(creature);
201 }
202};
203
205{
206 public:
207 boss_vazruden() : CreatureScript("boss_vazruden") { }
208
209 struct boss_vazrudenAI : public BossAI
210 {
212 {
213 Initialize();
214 }
215
217 {
218 Revenge_Timer = 4000;
219 UnsummonCheck = 2000;
220 WipeSaid = false;
221 }
222
223 void Reset() override
224 {
225 Initialize();
226 _Reset();
227 }
228
229 void JustEngagedWith(Unit* who) override
230 {
233 }
234
235 void KilledUnit(Unit* who) override
236 {
237 if (who && who->GetEntry() != NPC_VAZRUDEN)
238 Talk(SAY_KILL);
239 }
240
241 void JustDied(Unit* killer) override
242 {
243 if (killer && killer != me)
244 Talk(SAY_DIE);
245 _JustDied();
246 }
247
248 void UpdateAI(uint32 diff) override
249 {
250 if (!UpdateVictim())
251 {
252 if (UnsummonCheck < diff && me->IsAlive())
253 {
254 if (!WipeSaid)
255 {
256 Talk(SAY_WIPE);
257 WipeSaid = true;
258 }
260 }
261 else
262 UnsummonCheck -= diff;
263 return;
264 }
265
266 if (Revenge_Timer <= diff)
267 {
268 if (Unit* victim = me->GetVictim())
270 Revenge_Timer = 5000;
271 }
272 else
273 Revenge_Timer -= diff;
274 }
275
276 private:
280 };
281
282 CreatureAI* GetAI(Creature* creature) const override
283 {
284 return GetHellfireRampartsAI<boss_vazrudenAI>(creature);
285 }
286};
287
289{
290 public:
291 boss_vazruden_the_herald() : CreatureScript("boss_vazruden_the_herald") { }
292
294 {
296 {
297 Initialize();
298 summoned = false;
299 sentryDown = false;
300 }
301
303 {
304 phase = 0;
305 waypoint = 0;
306 check = 0;
307 }
308
309 void Reset() override
310 {
311 Initialize();
312 UnsummonAdds();
313 }
314
316 {
317 if (summoned)
318 {
320 if (!Nazan)
321 Nazan = me->FindNearestCreature(NPC_NAZAN, 5000);
322 if (Nazan)
323 {
324 Nazan->DisappearAndDie();
326 }
327
329 if (!Vazruden)
330 Vazruden = me->FindNearestCreature(NPC_VAZRUDEN, 5000);
331 if (Vazruden)
332 {
333 Vazruden->DisappearAndDie();
335 }
336 summoned = false;
338 me->SetVisible(true);
339 }
340 }
341
343 {
344 if (!summoned)
345 {
347 VazrudenGUID = Vazruden->GetGUID();
349 {
350 NazanGUID = Nazan->GetGUID();
351 if (Player* player = Nazan->SelectNearestPlayer(60.0f))
352 Nazan->AI()->AttackStart(player);
353 }
354 summoned = true;
355 me->SetVisible(false);
357 }
358 }
359
360 void JustEngagedWith(Unit* /*who*/) override
361 {
362 if (phase == 0)
363 {
364 phase = 1;
365 check = 0;
367 }
368 }
369
370 void JustSummoned(Creature* summon) override
371 {
372 if (!summon)
373 return;
374 Unit* victim = me->GetVictim();
375 if (summon->GetEntry() == NPC_NAZAN)
376 {
377 summon->SetDisableGravity(true);
378 summon->SetSpeedRate(MOVE_FLIGHT, 2.5f);
379 if (victim)
380 AttackStartNoMove(victim);
381 }
382 else
383 if (victim)
384 summon->AI()->AttackStart(victim);
385 }
386
387 void SentryDownBy(Unit* killer)
388 {
389 if (sentryDown)
390 {
391 AttackStartNoMove(killer);
392 sentryDown = false;
393 }
394 else
395 sentryDown = true;
396 }
397
398 void UpdateAI(uint32 diff) override
399 {
400 switch (phase)
401 {
402 case 0: // circle around the platform
403 return;
404 break;
405 case 1: // go to the middle and begin the fight
406 if (check <= diff)
407 {
409 {
412 check = 1000;
413 }
414 else
415 {
416 SummonAdds();
417 phase = 2;
418 return;
419 }
420 }
421 else
422 check -= diff;
423 break;
424 default: // adds do the job now
425 if (check <= diff)
426 {
429 if ((Nazan && Nazan->IsAlive()) || (Vazruden && Vazruden->IsAlive()))
430 {
431 if ((Nazan && Nazan->GetVictim()) || (Vazruden && Vazruden->GetVictim()))
432 return;
433 else
434 {
435 UnsummonAdds();
437 return;
438 }
439 }
440 if (!(Nazan && Nazan->IsAlive()) && !(Vazruden && Vazruden->IsAlive()))
441 {
443 }
444 check = 2000;
445 }
446 else
447 check -= diff;
448 break;
449 }
450 }
451
452 private:
460 };
461
462 CreatureAI* GetAI(Creature* creature) const override
463 {
464 return GetHellfireRampartsAI<boss_vazruden_the_heraldAI>(creature);
465 }
466};
467
469{
470 public:
471 npc_hellfire_sentry() : CreatureScript("npc_hellfire_sentry") { }
472
474 {
476 {
477 Initialize();
478 }
479
481 {
482 KidneyShot_Timer = urand(3000, 7000);
483 }
484
485 void Reset() override
486 {
487 Initialize();
488 }
489
490 void JustEngagedWith(Unit* /*who*/) override { }
491
492 void JustDied(Unit* killer) override
493 {
494 if (!killer)
495 return;
496
498 ENSURE_AI(boss_vazruden_the_herald::boss_vazruden_the_heraldAI, herald->AI())->SentryDownBy(killer);
499 }
500
501 void UpdateAI(uint32 diff) override
502 {
503 if (!UpdateVictim())
504 return;
505
506 if (KidneyShot_Timer <= diff)
507 {
508 if (Unit* victim = me->GetVictim())
509 DoCast(victim, SPELL_KIDNEY_SHOT);
510 KidneyShot_Timer = 20000;
511 }
512 else
513 KidneyShot_Timer -= diff;
514 }
515
516 private:
518 };
519
520 CreatureAI* GetAI(Creature* creature) const override
521 {
522 return GetHellfireRampartsAI<npc_hellfire_sentryAI>(creature);
523 }
524};
526{
528 new boss_vazruden();
529 new boss_nazan();
531}
uint32_t uint32
Definition: Define.h:142
@ TEMPSUMMON_TIMED_DESPAWN
Definition: ObjectDefines.h:65
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
Definition: ObjectDefines.h:68
Spells
Definition: PlayerAI.cpp:32
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
#define ENSURE_AI(a, b)
Definition: UnitAI.h:29
@ MOVE_FLIGHT
Definition: UnitDefines.h:123
@ UNIT_STATE_ROOT
Definition: Unit.h:265
static float waypoint[6][3]
Definition: boss_alar.cpp:54
Says
const float VazrudenRing[2][3]
@ SPELL_BELLOWING_ROAR
@ SPELL_SUMMON_LIQUID_FIRE
@ SPELL_SUMMON_LIQUID_FIRE_H
@ SPELL_FIRE_NOVA_VISUAL
void AddSC_boss_vazruden_the_herald()
const float VazrudenMiddle[3]
void JustEngagedWith(Unit *who) override
void _JustDied()
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:219
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Definition: CreatureAI.cpp:328
Creature *const me
Definition: CreatureAI.h:61
CreatureAI * AI() const
Definition: Creature.h:214
void DisappearAndDie()
Definition: Creature.h:83
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
void Clear()
Definition: ObjectGuid.h:286
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
uint32 const Id
Definition: SpellInfo.h:325
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void ClearUnitState(uint32 f)
Definition: Unit.h:733
void SetVisible(bool x)
Definition: Unit.cpp:8351
bool HealthAbovePct(int32 pct) const
Definition: Unit.h:782
void SetFaction(uint32 faction) override
Definition: Unit.h:859
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
bool IsAlive() const
Definition: Unit.h:1164
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition: Unit.cpp:12725
void AddUnitState(uint32 f)
Definition: Unit.h:731
uint32 GetFaction() const override
Definition: Unit.h:858
bool SetWalk(bool enable)
Definition: Unit.cpp:12707
Unit * GetVictim() const
Definition: Unit.h:715
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition: Unit.cpp:8525
void SetLevel(uint8 lvl, bool sendUpdate=true)
Definition: Unit.cpp:9329
uint8 GetLevel() const
Definition: Unit.h:746
Player * SelectNearestPlayer(float range) const
Definition: Object.cpp:2210
bool IsWithinDist3d(float x, float y, float z, float dist) const
Definition: Object.cpp:1122
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:2025
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition: Object.cpp:2148
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
CreatureAI * GetAI(Creature *creature) const override
@ DATA_VAZRUDEN
@ DATA_NAZAN
@ NPC_VAZRUDEN
@ NPC_NAZAN
@ NPC_VAZRUDEN_HERALD
@ NPC_LIQUID_FIRE
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr float GetOrientation() const
Definition: Position.h:79
constexpr float GetPositionZ() const
Definition: Position.h:78
bool IsHeroic() const
T const & DUNGEON_MODE(T const &normal5, T const &heroic10) const
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
void AttackStartNoMove(Unit *target)
void DoStartMovement(Unit *target, float distance=0.0f, float angle=0.0f)
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
void JustSummoned(Creature *summoned) override
void IsSummonedBy(WorldObject *summoner) override
void JustDied(Unit *killer) override