Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_tharon_ja.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 "SpellScript.h"
9#include "SpellAuraEffects.h"
10#include "Player.h"
11#include "drak_tharon_keep.h"
12
13/*
14 * Known Issues: Spell 49356 and 53463 will be interrupted for an unknown reason
15 */
16
18{
19 // Skeletal Spells (phase 1)
23 SPELL_DECAY_FLESH = 49356, // casted at end of phase 1, starts phase 2
24 // Flesh Spells (phase 2)
30 SPELL_RETURN_FLESH = 53463, // Channeled spell ending phase two and returning to phase 1. This ability will stun the party for 6 seconds.
34};
35
51
60
62{
64};
65
67{
68 public:
69 boss_tharon_ja() : CreatureScript("boss_tharon_ja") { }
70
71 struct boss_tharon_jaAI : public BossAI
72 {
73 boss_tharon_jaAI(Creature* creature) : BossAI(creature, DATA_THARON_JA) { }
74
76 {
77 _Reset();
78 me->RestoreDisplayId();
79 }
80
81 void EnterCombat(Unit* /*who*/) OVERRIDE
82 {
85
86 events.ScheduleEvent(EVENT_DECAY_FLESH, 20000);
87 events.ScheduleEvent(EVENT_CURSE_OF_LIFE, 1000);
88 events.ScheduleEvent(EVENT_RAIN_OF_FIRE, std::rand() % 18000 + 14000);
89 events.ScheduleEvent(EVENT_SHADOW_VOLLEY, std::rand() % 10000 + 8000);
90 }
91
93 {
94 if (who->GetTypeId() == TypeID::TYPEID_PLAYER)
96 }
97
98 void JustDied(Unit* /*killer*/) OVERRIDE
99 {
100 _JustDied();
101
105 }
106
108 {
109 if (!UpdateVictim())
110 return;
111
112 events.Update(diff);
113
114 if (me->HasUnitState(UNIT_STATE_CASTING))
115 return;
116
117 while (uint32 eventId = events.ExecuteEvent())
118 {
119 switch (eventId)
120 {
122 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
124 events.ScheduleEvent(EVENT_CURSE_OF_LIFE, std::rand() % 15000 + 10000);
125 return;
128 events.ScheduleEvent(EVENT_SHADOW_VOLLEY, std::rand() % 10000 + 8000);
129 return;
131 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
132 DoCast(target, SPELL_RAIN_OF_FIRE);
133 events.ScheduleEvent(EVENT_RAIN_OF_FIRE, std::rand() % 18000 + 14000);
134 return;
136 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
138 events.ScheduleEvent(EVENT_LIGHTNING_BREATH, std::rand() % 7000 + 6000);
139 return;
140 case EVENT_EYE_BEAM:
141 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
142 DoCast(target, SPELL_EYE_BEAM);
143 events.ScheduleEvent(EVENT_EYE_BEAM, std::rand() % 6000 + 4000);
144 return;
147 events.ScheduleEvent(EVENT_POISON_CLOUD, std::rand() % 12000 + 10000);
148 return;
151 events.ScheduleEvent(EVENT_GOING_FLESH, 6000);
152 return;
155 me->SetDisplayId(MODEL_FLESH);
158 DoCast(me, SPELL_DUMMY, true);
159
160 events.Reset();
161 events.ScheduleEvent(EVENT_RETURN_FLESH, 20000);
162 events.ScheduleEvent(EVENT_LIGHTNING_BREATH, std::rand() % 4000 + 3000);
163 events.ScheduleEvent(EVENT_EYE_BEAM, std::rand() % 8000 + 4000);
164 events.ScheduleEvent(EVENT_POISON_CLOUD, std::rand() % 7000 + 6000);
165 break;
168 events.ScheduleEvent(EVENT_GOING_SKELETAL, 6000);
169 return;
172 me->RestoreDisplayId();
174
175 events.Reset();
176 events.ScheduleEvent(EVENT_DECAY_FLESH, 20000);
177 events.ScheduleEvent(EVENT_CURSE_OF_LIFE, 1000);
178 events.ScheduleEvent(EVENT_RAIN_OF_FIRE, std::rand() % 18000 + 14000);
179 events.ScheduleEvent(EVENT_SHADOW_VOLLEY, std::rand() % 10000 + 8000);
180 break;
181 default:
182 break;
183 }
184 }
185
187 }
188 };
189
191 {
193 }
194};
195
229
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ TYPEID_PLAYER
Definition Object.h:55
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
#define sSpellMgr
Definition SpellMgr.h:744
#define SpellEffectFn(F, I, N)
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ SPELL_POISON_CLOUD
@ EVENT_POISON_CLOUD
#define SAY_DEATH
#define SAY_AGGRO
#define SAY_KILL
@ SPELL_RAIN_OF_FIRE
@ EVENT_RAIN_OF_FIRE
@ SAY_DEATH
@ SAY_FLESH
@ SAY_AGGRO
@ SAY_KILL
@ SAY_SKELETON
@ SPELL_CLEAR_GIFT_OF_THARON_JA
@ SPELL_DECAY_FLESH
@ SPELL_ACHIEVEMENT_CHECK
@ SPELL_FLESH_VISUAL
@ SPELL_SHADOW_VOLLEY
@ SPELL_DUMMY
@ SPELL_EYE_BEAM
@ SPELL_CURSE_OF_LIFE
@ SPELL_RETURN_FLESH
@ SPELL_RAIN_OF_FIRE
@ SPELL_GIFT_OF_THARON_JA
@ SPELL_LIGHTNING_BREATH
@ SPELL_POISON_CLOUD
void AddSC_boss_tharon_ja()
@ MODEL_FLESH
@ EVENT_POISON_CLOUD
@ EVENT_GOING_SKELETAL
@ EVENT_DECAY_FLESH
@ EVENT_EYE_BEAM
@ EVENT_SHADOW_VOLLEY
@ EVENT_GOING_FLESH
@ EVENT_RAIN_OF_FIRE
@ EVENT_CURSE_OF_LIFE
@ EVENT_RETURN_FLESH
@ EVENT_LIGHTNING_BREATH
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
HookList< EffectHandler > OnEffectHitTarget
Unit * GetHitUnit()
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
void DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
Definition Unit.h:1367
CreatureAI * GetAI(Creature *creature) const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
AI * GetDrakTharonKeepAI(Creature *creature)
@ DATA_THARON_JA
Creature * me
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void EnterCombat(Unit *) OVERRIDE
void KilledUnit(Unit *who) OVERRIDE