Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_ayamiss.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 "ruins_of_ahnqiraj.h"
10
21
32
34{
36};
37
39{
42};
43
50
51const Position AyamissAirPos = { -9689.292f, 1547.912f, 48.02729f, 0.0f };
52const Position AltarPos = { -9717.18f, 1517.72f, 27.4677f, 0.0f };
54const Position SwarmerPos = { -9647.352f, 1578.062f, 55.32f, 0.0f };
56{
57 { -9674.4707f, 1528.4133f, 22.457f, 0.0f },
58 { -9701.6005f, 1566.9993f, 24.118f, 0.0f }
59};
60
62{
63public:
64 boss_ayamiss() : CreatureScript("boss_ayamiss") { }
65
66 struct boss_ayamissAI : public BossAI
67 {
69 {
70 _phase = 0;
71 _enraged = false;
72 }
73
75 {
76 _Reset();
78 _enraged = false;
79 SetCombatMovement(false);
80 }
81
83 {
84 switch (who->GetEntry())
85 {
86 case NPC_SWARMER:
87 {
88 _swarmers.push_back(who->GetGUID());
89 break;
90 }
91 case NPC_LARVA:
92 {
93 who->GetMotionMaster()->MovePoint(POINT_PARALYZE, AltarPos);
94 break;
95 }
96 case NPC_HORNET:
97 {
99 who->AI()->AttackStart(target);
100 break;
101 }
102
103 }
104 }
105
107 {
108 if (type == POINT_MOTION_TYPE)
109 {
110 switch (id)
111 {
112 case POINT_AIR:
113 {
114 me->AddUnitState(UNIT_STATE_ROOT);
115 break;
116 }
117 case POINT_GROUND:
118 {
119 me->ClearUnitState(UNIT_STATE_ROOT);
120 break;
121 }
122 }
123 }
124 }
125
127 {
128 me->ClearUnitState(UNIT_STATE_ROOT);
130 }
131
132 void EnterCombat(Unit* attacker) OVERRIDE
133 {
134 BossAI::EnterCombat(attacker);
135
136 events.ScheduleEvent(EVENT_STINGER_SPRAY, std::rand() % 30000 + 20000);
137 events.ScheduleEvent(EVENT_POISON_STINGER, 5000);
138 events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000);
139 events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000);
140 events.ScheduleEvent(EVENT_PARALYZE, 15000);
141
142 me->SetCanFly(true);
143 me->SetDisableGravity(true);
144 me->GetMotionMaster()->MovePoint(POINT_AIR, AyamissAirPos);
145 }
146
148 {
149 if (!UpdateVictim())
150 return;
151
152 events.Update(diff);
153
154 if (_phase == PHASE_AIR && me->GetHealthPct() < 70.0f)
155 {
157 SetCombatMovement(true);
158 me->SetCanFly(false);
159 Position VictimPos;
160 me->GetVictim()->GetPosition(&VictimPos);
161 me->GetMotionMaster()->MovePoint(POINT_GROUND, VictimPos);
163 events.ScheduleEvent(EVENT_LASH, std::rand() % 8000 + 5000);
164 events.ScheduleEvent(EVENT_TRASH, std::rand() % 6000 + 3000);
165 events.CancelEvent(EVENT_POISON_STINGER);
166 }
167 else
168 {
170 }
171
172 if (!_enraged && me->GetHealthPct() < 20.0f)
173 {
176 _enraged = true;
177 }
178
179 while (uint32 eventId = events.ExecuteEvent())
180 {
181 switch (eventId)
182 {
184 {
186 events.ScheduleEvent(EVENT_STINGER_SPRAY, std::rand() % 20000 + 15000);
187 break;
188 }
190 {
192 events.ScheduleEvent(EVENT_POISON_STINGER, std::rand() % 3000 + 2000);
193 break;
194 }
195 case EVENT_PARALYZE:
196 {
197 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true))
198 {
199 DoCast(target, SPELL_PARALYZE);
200 instance->SetData64(DATA_PARALYZED, target->GetGUID());
201 uint8 Index = std::rand() % 1;
203 }
204 events.ScheduleEvent(EVENT_PARALYZE, 15000);
205 break;
206 }
208 {
209 for (std::list<uint64>::iterator i = _swarmers.begin(); i != _swarmers.end(); ++i)
210 if (Creature* swarmer = me->GetMap()->GetCreature(*i))
212 swarmer->AI()->AttackStart(target);
213
214 _swarmers.clear();
215 events.ScheduleEvent(EVENT_SWARMER_ATTACK, 60000);
216 break;
217 }
219 {
221 me->GetRandomPoint(SwarmerPos, 80.0f, Pos);
222 me->SummonCreature(NPC_SWARMER, Pos);
223 events.ScheduleEvent(EVENT_SUMMON_SWARMER, 5000);
224 break;
225 }
226 case EVENT_TRASH:
227 {
229 events.ScheduleEvent(EVENT_TRASH, std::rand() % 7000 + 5000);
230 break;
231 }
232 case EVENT_LASH:
233 {
235 events.ScheduleEvent(EVENT_LASH, std::rand() % 15000 + 8000);
236 break;
237 }
238 }
239 }
240 }
241 private:
242 std::list<uint64> _swarmers;
245 };
246
248 {
249 return new boss_ayamissAI(creature);
250 }
251};
252
254{
255public:
256 npc_hive_zara_larva() : CreatureScript("npc_hive_zara_larva") { }
257
259 {
261 {
262 _instance = me->GetInstanceScript();
263 }
264
266 {
267 if (type == POINT_MOTION_TYPE)
268 if (id == POINT_PARALYZE)
269 if (Player* target = ObjectAccessor::GetPlayer(*me, _instance->GetData64(DATA_PARALYZED)))
270 DoCast(target, SPELL_FEED); // Omnomnom
271 }
272
274
275 {
276 if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS)
277 return;
278
280 }
281
283 {
284 if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS)
285 return;
286
288 }
289
291 {
292 if (_instance->GetBossState(DATA_AYAMISS) == IN_PROGRESS)
293 return;
294
296 }
297 private:
299 };
300
302 {
303 return new npc_hive_zara_larvaAI(creature);
304 }
305};
306
308{
309 new boss_ayamiss();
311}
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ IN_PROGRESS
@ POINT_MOTION_TYPE
@ TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN
Definition Object.h:69
@ UNIT_STATE_ROOT
Definition Unit.h:522
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
const Position AltarPos
void AddSC_boss_ayamiss()
@ EMOTE_FRENZY
const Position AyamissAirPos
const Position LarvaPos[2]
@ POINT_GROUND
@ POINT_AIR
@ POINT_PARALYZE
@ SPELL_STINGER_SPRAY
@ SPELL_FEED
@ SPELL_LASH
@ SPELL_TRASH
@ SPELL_FRENZY
@ SPELL_PARALYZE
@ SPELL_POISON_STINGER
@ PHASE_GROUND
@ PHASE_AIR
const Position SwarmerPos
@ EVENT_POISON_STINGER
@ EVENT_TRASH
@ EVENT_LASH
@ EVENT_SWARMER_ATTACK
@ EVENT_PARALYZE
@ EVENT_SUMMON_SWARMER
@ EVENT_STINGER_SPRAY
@ SPELL_FRENZY
@ PHASE_GROUND
InstanceScript *const instance
EventMap events
BossAI(Creature *creature, uint32 bossId)
void EnterCombat(Unit *) OVERRIDE
virtual void MoveInLineOfSight(Unit *)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
virtual void EnterEvadeMode()
CreatureScript(const char *name)
static Player * GetPlayer(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
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
@ NPC_HORNET
@ NPC_LARVA
@ NPC_SWARMER
@ DATA_PARALYZED
@ DATA_AYAMISS
void SetCombatMovement(bool allowMovement)
Creature * me
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
ScriptedAI(Creature *creature)
void AttackStart(Unit *) OVERRIDE
void MovementInform(uint32 type, uint32 id) OVERRIDE
void EnterCombat(Unit *attacker) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void JustSummoned(Creature *who) OVERRIDE
std::list< uint64 > _swarmers
boss_ayamissAI(Creature *creature)
void AttackStart(Unit *victim) OVERRIDE
void MovementInform(uint32 type, uint32 id) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================