Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_supremus.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/* ScriptData
7SDName: Boss_Supremus
8SD%Complete: 95
9SDComment: Need to implement molten punch
10SDCategory: Black Temple
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "PassiveAI.h"
16#include "black_temple.h"
17
47
49{
50public:
51 molten_flame() : CreatureScript("molten_flame") { }
52
54 {
55 return new molten_flameAI(creature);
56 }
57
59 {
60 molten_flameAI(Creature* creature) : NullCreatureAI(creature) { }
61
63 {
64 float x, y, z;
65 me->GetNearPoint(me, x, y, z, 1, 100, float(M_PI*2*rand_norm()));
66 me->GetMotionMaster()->MovePoint(0, x, y, z);
67 me->SetVisible(false);
68 me->CastSpell(me, SPELL_MOLTEN_FLAME, true);
69 }
70 };
71};
72
74{
75public:
76 boss_supremus() : CreatureScript("boss_supremus") { }
77
79 {
80 return new boss_supremusAI(creature);
81 }
82
84 {
85 boss_supremusAI(Creature* creature) : ScriptedAI(creature), summons(me)
86 {
87 instance = creature->GetInstanceScript();
88 }
89
94
96 {
97 if (instance)
98 {
99 if (me->IsAlive())
100 instance->SetBossState(DATA_SUPREMUS, NOT_STARTED);
101 }
102
103 phase = 0;
104
105 events.Reset();
106 summons.DespawnAll();
107 }
108
109 void EnterCombat(Unit* /*who*/) OVERRIDE
110 {
111 if (instance)
112 instance->SetBossState(DATA_SUPREMUS, IN_PROGRESS);
113
114 ChangePhase();
115 events.ScheduleEvent(EVENT_BERSERK, 900000, GCD_CAST);
116 events.ScheduleEvent(EVENT_FLAME, 20000, GCD_CAST);
117 }
118
120 {
121 if (!phase || phase == PHASE_CHASE)
122 {
125 summons.DoAction(EVENT_VOLCANO, pred);
126 events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 5000, GCD_CAST, PHASE_STRIKE);
127 me->SetSpeed(MOVE_RUN, 1.2f);
128 me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false);
129 me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false);
130 }
131 else
132 {
134 events.ScheduleEvent(EVENT_VOLCANO, 5000, GCD_CAST, PHASE_CHASE);
135 events.ScheduleEvent(EVENT_SWITCH_TARGET, 10000, 0, PHASE_CHASE);
136 me->SetSpeed(MOVE_RUN, 0.9f);
137 me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
138 me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
139 }
142 events.SetPhase(phase);
143 events.ScheduleEvent(EVENT_SWITCH_PHASE, 60000, GCD_CAST);
144 }
145
146 void JustDied(Unit* /*killer*/) OVERRIDE
147 {
148 if (instance)
149 instance->SetBossState(DATA_SUPREMUS, DONE);
150
151 summons.DespawnAll();
152 }
153
155 {
156 summons.Summon(summon);
157 }
158
160 {
161 summons.Despawn(summon);
162 }
163
165 {
166 uint32 health = 0;
167 Unit* target = NULL;
168
169 ThreatContainer::StorageType const &threatlist = me->getThreatManager().getThreatList();
170 ThreatContainer::StorageType::const_iterator i = threatlist.begin();
171 for (i = threatlist.begin(); i != threatlist.end(); ++i)
172 {
173 Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid());
174 if (unit && me->IsWithinMeleeRange(unit))
175 {
176 if (unit->GetHealth() > health)
177 {
178 health = unit->GetHealth();
179 target = unit;
180 }
181 }
182 }
183
184 return target;
185 }
186
188 {
189 if (!UpdateVictim())
190 return;
191
192 events.Update(diff);
193
194 while (uint32 eventId = events.ExecuteEvent())
195 {
196 switch (eventId)
197 {
198 case EVENT_BERSERK:
199 DoCast(me, SPELL_BERSERK, true);
200 break;
201 case EVENT_FLAME:
203 events.DelayEvents(1500, GCD_CAST);
204 events.ScheduleEvent(EVENT_FLAME, 20000, GCD_CAST);
205 break;
207 if (Unit* target = CalculateHatefulStrikeTarget())
209 events.DelayEvents(1000, GCD_CAST);
210 events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 5000, GCD_CAST, PHASE_STRIKE);
211 break;
213 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
214 {
216 me->AddThreat(target, 5000000.0f);
218 }
219 events.ScheduleEvent(EVENT_SWITCH_TARGET, 10000, 0, PHASE_CHASE);
220 break;
221 case EVENT_VOLCANO:
222 {
223 Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true);
224 if (!target) target = me->GetVictim();
225 if (target)
226 {
227 //DoCast(target, SPELL_VOLCANIC_SUMMON);//movement bugged
228 me->SummonCreature(CREATURE_VOLCANO, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TempSummonType::TEMPSUMMON_TIMED_DESPAWN, 30000);
230 events.DelayEvents(1500, GCD_CAST);
231 }
232 events.ScheduleEvent(EVENT_VOLCANO, 10000, GCD_CAST, PHASE_CHASE);
233 return;
234 }
236 ChangePhase();
237 break;
238 }
239 }
240
242 }
243 };
244};
245
247{
248public:
249 npc_volcano() : CreatureScript("npc_volcano") { }
250
252 {
253 return new npc_volcanoAI(creature);
254 }
255
256 struct npc_volcanoAI : public ScriptedAI
257 {
258 npc_volcanoAI(Creature* creature) : ScriptedAI(creature)
259 {
260 SetCombatMovement(false);
261 }
262
264 {
267 //DoCast(me, SPELL_VOLCANIC_ERUPTION);
268 me->SetReactState(REACT_PASSIVE);
269 wait = 3000;
270 }
272
273 void EnterCombat(Unit* /*who*/) OVERRIDE { }
274
275 void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
276
277
278 void DoAction(int32 /*info*/) OVERRIDE
279 {
280 me->RemoveAura(SPELL_VOLCANIC_ERUPTION);
281 }
282
284 {
285 if (wait <= diff)//wait 3secs before casting
286 {
288 wait = 60000;
289 }
290 else wait -= diff;
291 }
292 };
293};
294
296{
297 new boss_supremus();
298 new molten_flame();
299 new npc_volcano();
300}
#define M_PI
Definition Common.h:192
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
@ TEMPSUMMON_TIMED_DESPAWN
Definition Object.h:70
@ SPELL_EFFECT_ATTACK_ME
@ IMMUNITY_STATE
@ IMMUNITY_EFFECT
@ SPELL_AURA_MOD_TAUNT
@ MOVE_RUN
Definition Unit.h:556
@ REACT_PASSIVE
Definition Unit.h:1156
@ UNIT_FLAG_NON_ATTACKABLE
Definition Unit.h:626
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_FLAGS
double rand_norm(void)
Definition Util.cpp:50
@ DATA_SUPREMUS
#define SPELL_BERSERK
@ EVENT_BERSERK
@ SPELL_HATEFUL_STRIKE
@ EVENT_FLAME
Supremus
@ EVENT_VOLCANO
@ EMOTE_PUNCH_GROUND
@ CREATURE_VOLCANO
@ SPELL_VOLCANIC_ERUPTION
@ EVENT_FLAME
@ SPELL_MOLTEN_FLAME
@ CREATURE_STALKER
@ EVENT_SWITCH_TARGET
@ GCD_CAST
@ EVENT_BERSERK
@ EVENT_SWITCH_PHASE
@ SPELL_HATEFUL_STRIKE
@ SPELL_VOLCANIC_SUMMON
@ EMOTE_NEW_TARGET
@ SPELL_MOLTEN_PUNCH
@ PHASE_CHASE
@ SPELL_BERSERK
@ EVENT_HATEFUL_STRIKE
@ EMOTE_GROUND_CRACK
@ PHASE_STRIKE
void AddSC_boss_supremus()
#define GCD_CAST
Definition chapter1.cpp:23
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:56
CreatureScript(const char *name)
NullCreatureAI(Creature *c)
Definition PassiveAI.cpp:12
std::list< HostileReference * > StorageType
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
Definition Unit.h:1367
uint32 GetHealth() const
Definition Unit.h:1600
static Unit * GetUnit(WorldObject &object, uint64 guid)
Definition Unit.cpp:4895
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
float GetPositionZ() const
Definition Object.h:330
float GetPositionX() const
Definition Object.h:328
float GetPositionY() const
Definition Object.h:329
void SetCombatMovement(bool allowMovement)
Creature * me
ScriptedAI(Creature *creature)
void JustSummoned(Creature *summon) OVERRIDE
boss_supremusAI(Creature *creature)
void SummonedCreatureDespawn(Creature *summon) OVERRIDE
void EnterCombat(Unit *) OVERRIDE
void JustDied(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
molten_flameAI(Creature *creature)
void EnterCombat(Unit *) OVERRIDE
void DoAction(int32) OVERRIDE
void MoveInLineOfSight(Unit *) OVERRIDE
npc_volcanoAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================