Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_prince_taldaram.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 "ahnkahet.h"
10
30
31enum Misc
32{
35};
36
37#define DATA_SPHERE_ANGLE_OFFSET 0.7f
38#define DATA_GROUND_POSITION_Z 11.30809f
39
50
62
64{
67};
68
70{
71 public:
72 boss_taldaram() : CreatureScript("boss_taldaram") { }
73
74 struct boss_taldaramAI : public BossAI
75 {
77 {
78 me->SetDisableGravity(true);
79 }
80
82 {
83 _Reset();
86 }
87
88 void EnterCombat(Unit* /*who*/) OVERRIDE
89 {
92 events.SetPhase(PHASE_NORMAL);
93 events.ScheduleEvent(EVENT_BLOODTHIRST, 10000);
94 events.ScheduleEvent(EVENT_VANISH, std::rand() % 35000 + 25000);
95 events.ScheduleEvent(EVENT_FLAME_SPHERE, 5000);
96 }
97
99 {
100 if (!UpdateVictim())
101 return;
102
103 events.Update(diff);
104
105 if (me->HasUnitState(UNIT_STATE_CASTING))
106 return;
107
108 while (uint32 eventId = events.ExecuteEvent())
109 {
110 switch (eventId)
111 {
113 {
114 if (!events.IsInPhase(PHASE_NORMAL))
115 break;
116
118 events.ScheduleEvent(EVENT_BLOODTHIRST, 10000);
119 break;
120 }
122 {
123 if (!events.IsInPhase(PHASE_NORMAL))
124 break;
125
127 events.SetPhase(PHASE_SPECIAL);
128 events.ScheduleEvent(EVENT_CASTING_FLAME_SPHERES, 3000);
129 events.ScheduleEvent(EVENT_FLAME_SPHERE, 15000);
130 break;
131 }
132 case EVENT_VANISH:
133 {
134 if (!events.IsInPhase(PHASE_NORMAL))
135 break;
136
137 Map::PlayerList const& players = me->GetMap()->GetPlayers();
138 uint32 targets = 0;
139 for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
140 {
141 Player* player = i->GetSource();
142 if (player && player->IsAlive())
143 ++targets;
144 }
145
146 if (targets > 2)
147 {
150 events.SetPhase(PHASE_SPECIAL);
151 events.ScheduleEvent(EVENT_JUST_VANISHED, 500);
152 if (Unit* embraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
153 _embraceTargetGUID = embraceTarget->GetGUID();
154 }
155 events.ScheduleEvent(EVENT_VANISH, std::rand() % 35000 + 25000);
156 break;
157 }
159 {
160 events.SetPhase(PHASE_NORMAL);
161 Unit* sphereTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
162 if (!sphereTarget)
163 break;
164
165 float angle, x, y;
166
167 //DoCast(me, SPELL_FLAME_SPHERE_SUMMON_1);
169 {
170 angle = sphere->GetAngle(sphereTarget);
171 x = sphere->GetPositionX() + 15.0f * std::cos(angle);
172 y = sphere->GetPositionY() + 15.0f * std::sin(angle);
173 sphere->GetMotionMaster()->MovePoint(0, x, y, sphere->GetPositionZ());
174 }
175
176 if (IsHeroic())
177 {
178 //DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_1);
180 {
181 angle = sphere->GetAngle(sphereTarget) + DATA_SPHERE_ANGLE_OFFSET;
182 x = sphere->GetPositionX() + 15.0f / 2.0f * std::cos(angle);
183 y = sphere->GetPositionY() + 15.0f / 2.0f * std::sin(angle);
184 sphere->GetMotionMaster()->MovePoint(0, x, y, sphere->GetPositionZ());
185 }
186
187 //DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_2);
189 {
190 angle = sphere->GetAngle(sphereTarget) - DATA_SPHERE_ANGLE_OFFSET;
191 x = sphere->GetPositionX() + 15.0f / 2 * std::cos(angle);
192 y = sphere->GetPositionY() + 15.0f / 2 * std::sin(angle);
193 sphere->GetMotionMaster()->MovePoint(0, x, y, sphere->GetPositionZ());
194 }
195 }
196 break;
197 }
199 if (Unit* embraceTarget = GetEmbraceTarget())
200 {
201 me->GetMotionMaster()->Clear();
202 me->SetSpeed(MOVE_WALK, 2.0f, true);
203 me->GetMotionMaster()->MoveChase(embraceTarget);
204 }
205 events.ScheduleEvent(EVENT_VANISHED, 1300);
206 break;
207 case EVENT_VANISHED:
208 if (Unit* embraceTarget = GetEmbraceTarget())
209 DoCast(embraceTarget, SPELL_EMBRACE_OF_THE_VAMPYR);
210 Talk(SAY_FEED);
211 me->GetMotionMaster()->Clear();
212 me->SetSpeed(MOVE_WALK, 1.0f, true);
213 me->GetMotionMaster()->MoveChase(me->GetVictim());
214 events.ScheduleEvent(EVENT_FEEDING, 20000);
215 break;
216 case EVENT_FEEDING:
218 events.SetPhase(PHASE_NORMAL);
219 break;
220 default:
221 break;
222 }
223 }
224
226 }
227
228 void DamageTaken(Unit* /*doneBy*/, uint32& damage) OVERRIDE
229 {
230 Unit* embraceTarget = GetEmbraceTarget();
231
232 if (events.IsInPhase(PHASE_SPECIAL) && embraceTarget && embraceTarget->IsAlive())
233 {
234 _embraceTakenDamage += damage;
236 {
238 events.SetPhase(PHASE_NORMAL);
239 me->CastStop();
240 }
241 }
242 }
243
244 void JustDied(Unit* /*killer*/) OVERRIDE
245 {
247 _JustDied();
248 }
249
251 {
252 if (victim->GetTypeId() != TypeID::TYPEID_PLAYER)
253 return;
254
255 Unit* embraceTarget = GetEmbraceTarget();
256 if (events.IsInPhase(PHASE_SPECIAL) && embraceTarget && victim == embraceTarget)
257 {
259 events.SetPhase(PHASE_NORMAL);
260 }
261 Talk(SAY_SLAY);
262 }
263
265 {
266 for (uint8 i = 0; i < 2; ++i)
267 if (!instance->GetData(DATA_SPHERE_1 + i))
268 return false;
269
270 RemovePrison();
271 return true;
272 }
273
275 {
278
279 return NULL;
280 }
281
283 {
285 me->RemoveAurasDueToSpell(SPELL_BEAM_VISUAL);
286 me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), DATA_GROUND_POSITION_Z, me->GetOrientation());
288 me->SetDisableGravity(false);
289 me->GetMotionMaster()->MovePoint(0, me->GetHomePosition());
291 instance->HandleGameObject(instance->GetData64(DATA_PRINCE_TALDARAM_PLATFORM), true);
292 }
293
294 private:
297 };
298
300 {
301 return GetAhnKahetAI<boss_taldaramAI>(creature);
302 }
303};
304
306{
307 public:
308 npc_taldaram_flamesphere() : CreatureScript("npc_taldaram_flamesphere") { }
309
311 {
313 {
314 }
315
317 {
320 me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
321 me->setFaction(16);
322 me->SetObjectScale(1.0f);
327 }
328
329 void EnterCombat(Unit* /*who*/) OVERRIDE { }
330 void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
331
332 void JustDied(Unit* /*killer*/) OVERRIDE
333 {
335 }
336
338 {
339 if (_despawnTimer <= diff)
340 me->DisappearAndDie();
341 else
342 _despawnTimer -= diff;
343 }
344
345 private:
347 };
348
350 {
351 return new npc_taldaram_flamesphereAI(creature);
352 }
353};
354
356{
357 public:
358 prince_taldaram_sphere() : GameObjectScript("prince_taldaram_sphere") { }
359
361 {
362 InstanceScript* instance = go->GetInstanceScript();
363 if (!instance)
364 return false;
365
366 Creature* PrinceTaldaram = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_PRINCE_TALDARAM));
367 if (PrinceTaldaram && PrinceTaldaram->IsAlive())
368 {
369 // maybe these are hacks :(
371 go->SetGoState(GOState::GO_STATE_ACTIVE);
372
373 switch (go->GetEntry())
374 {
375 case GO_SPHERE_1:
377 PrinceTaldaram->AI()->Talk(SAY_1);
378 break;
379 case GO_SPHERE_2:
381 PrinceTaldaram->AI()->Talk(SAY_1);
382 break;
383 }
384
385 CAST_AI(boss_taldaram::boss_taldaramAI, PrinceTaldaram->AI())->CheckSpheres();
386 }
387 return true;
388 }
389};
390
@ IN_MILLISECONDS
Definition Common.h:125
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ GO_STATE_ACTIVE
Definition GameObject.h:576
@ IN_PROGRESS
@ TYPEID_PLAYER
Definition Object.h:55
@ TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN
Definition Object.h:69
#define CAST_AI(a, b)
@ GO_FLAG_NOT_SELECTABLE
@ MOVEMENTFLAG_FLYING
Definition Unit.h:747
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ MOVE_WALK
Definition Unit.h:555
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_FLAGS
@ GAMEOBJECT_FIELD_FLAGS
@ GO_SPHERE_2
Definition ahnkahet.h:67
@ GO_SPHERE_1
Definition ahnkahet.h:66
AI * GetAhnKahetAI(Creature *creature)
Definition ahnkahet.h:71
@ DATA_SPHERE_2
Definition ahnkahet.h:24
@ DATA_PRINCE_TALDARAM_PLATFORM
Definition ahnkahet.h:25
@ DATA_PRINCE_TALDARAM
Definition ahnkahet.h:17
@ DATA_SPHERE_1
Definition ahnkahet.h:23
@ SAY_SLAY
#define SAY_DEATH
#define SAY_AGGRO
@ PHASE_NORMAL
@ SPELL_VANISH
#define DATA_GROUND_POSITION_Z
@ DATA_EMBRACE_DMG
@ H_DATA_EMBRACE_DMG
@ SPELL_FLAME_SPHERE_VISUAL
@ SPELL_FLAME_SPHERE_SUMMON_1
@ SPELL_FLAME_SPHERE_DEATH_EFFECT
@ H_CREATURE_FLAME_SPHERE_1
@ SPELL_FLAME_SPHERE_SPAWN_EFFECT
@ H_SPELL_FLAME_SPHERE_SUMMON_1
@ SPELL_BEAM_VISUAL
@ CREATURE_FLAME_SPHERE
@ H_CREATURE_FLAME_SPHERE_2
@ H_SPELL_FLAME_SPHERE_SUMMON_2
@ SPELL_CONJURE_FLAME_SPHERE
@ SPELL_BLOODTHIRST
@ SPELL_FLAME_SPHERE_PERIODIC
@ SPELL_HOVER_FALL
@ SPELL_EMBRACE_OF_THE_VAMPYR
void AddSC_boss_taldaram()
#define DATA_SPHERE_ANGLE_OFFSET
@ EVENT_FLAME_SPHERE
@ EVENT_CASTING_FLAME_SPHERES
@ EVENT_JUST_VANISHED
@ EVENT_BLOODTHIRST
InstanceScript *const instance
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureAI * AI() const
Definition Creature.h:483
CreatureScript(const char *name)
GameObjectScript(const char *name)
MapRefManager PlayerList
Definition Map.h:406
iterator end()
iterator begin()
LinkedListHead::Iterator< MapReference const > const_iterator
static Creature * GetCreature(WorldObject const &u, uint64 guid)
static Unit * GetUnit(WorldObject const &, 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 DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
Definition Unit.h:1367
bool IsAlive() const
Definition Unit.h:2032
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:37
virtual uint64 GetData64(uint32) const
Definition ZoneScript.h:32
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipHello(Player *, GameObject *go) OVERRIDE
#define SAY_1
bool IsHeroic() const
Creature * me
Creature * DoSpawnCreature(uint32 entry, float offsetX, float offsetY, float offsetZ, float angle, TempSummonType type, uint32 despawntime)
ScriptedAI(Creature *creature)
const T & DUNGEON_MODE(const T &normal5, const T &heroic5) const
void KilledUnit(Unit *victim) OVERRIDE
void DamageTaken(Unit *, uint32 &damage) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================