Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_faerlina.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 "naxxramas.h"
9#include "SpellInfo.h"
10
12{
17};
18
30
31#define SPELL_WIDOWS_EMBRACE_HELPER RAID_MODE(SPELL_WIDOWS_EMBRACE, H_SPELL_WIDOWS_EMBRACE)
32
39
40enum Misc
41{
43};
44
46{
47 public:
48 boss_faerlina() : CreatureScript("boss_faerlina") { }
49
50 struct boss_faerlinaAI : public BossAI
51 {
53 _frenzyDispels(0), _introDone(false), _delayFrenzy(false)
54 {
55 }
56
57
58 void EnterCombat(Unit* /*who*/) OVERRIDE
59 {
62 events.ScheduleEvent(EVENT_POISON, std::rand() % 15000 + 10000);
63 events.ScheduleEvent(EVENT_FIRE, std::rand() % 18000 + 6000);
64 events.ScheduleEvent(EVENT_FRENZY, std::rand() % 80000 + 60000);
65 }
66
68 {
69 _Reset();
70 _delayFrenzy = false;
72 }
73
75
76 {
77 if (!_introDone && who->GetTypeId() == TypeID::TYPEID_PLAYER)
78 {
80 _introDone = true;
81 }
82
84 }
85
86 void KilledUnit(Unit* /*victim*/) OVERRIDE
87 {
88 if (!(std::rand() % 2))
90 }
91
92 void JustDied(Unit* /*killer*/) OVERRIDE
93 {
94 _JustDied();
96 }
97
98 void SpellHit(Unit* caster, SpellInfo const* spell) OVERRIDE
99 {
100 if (spell->Id == SPELL_WIDOWS_EMBRACE || spell->Id == H_SPELL_WIDOWS_EMBRACE)
101 {
104 _delayFrenzy = true;
105 me->Kill(caster);
106 }
107 }
108
110 {
111 if (type == DATA_FRENZY_DISPELS)
112 return _frenzyDispels;
113
114 return 0;
115 }
116
118 {
119 if (!UpdateVictim())
120 return;
121
123 {
124 _delayFrenzy = false;
126 }
127
128 events.Update(diff);
129
130 if (me->HasUnitState(UNIT_STATE_CASTING))
131 return;
132
133 while (uint32 eventId = events.ExecuteEvent())
134 {
135 switch (eventId)
136 {
137 case EVENT_POISON:
138 if (!me->HasAura(SPELL_WIDOWS_EMBRACE_HELPER))
140 events.ScheduleEvent(EVENT_POISON, std::rand() % 15000 + 8000);
141 break;
142 case EVENT_FIRE:
143 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
145 events.ScheduleEvent(EVENT_FIRE, std::rand() % 18000 + 6000);
146 break;
147 case EVENT_FRENZY:
149 if (!me->HasAura(SPELL_WIDOWS_EMBRACE_HELPER))
151 else
152 _delayFrenzy = true;
153
154 events.ScheduleEvent(EVENT_FRENZY, std::rand() % 80000 + 60000);
155 break;
156 }
157 }
158
160 }
161
162 private:
166 };
167
169 {
170 return new boss_faerlinaAI(creature);
171 }
172};
173
175{
176 public:
177 npc_faerlina_add() : CreatureScript("npc_faerlina_add") { }
178
180 {
181 npc_faerlina_addAI(Creature* creature) : ScriptedAI(creature),
182 _instance(creature->GetInstanceScript())
183 {
184 }
185
187 {
189 me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_BIND, true);
190 me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true);
191 }
192 }
193
194 void JustDied(Unit* /*killer*/) OVERRIDE
195 {
197 if (Creature* faerlina = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FAERLINA)))
198 DoCast(faerlina, SPELL_WIDOWS_EMBRACE);
199 }
200
201 private:
203 };
204
206 {
207 return new npc_faerlina_addAI(creature);
208 }
209};
210
212{
213 public:
214 achievement_momma_said_knock_you_out() : AchievementCriteriaScript("achievement_momma_said_knock_you_out") { }
215
216 bool OnCheck(Player* /*source*/, Unit* target) OVERRIDE
217 {
218 return target && !target->GetAI()->GetData(DATA_FRENZY_DISPELS);
219 }
220};
221
@ DIFFICULTY_10MAN_NORMAL
Definition DBCEnums.h:334
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ TYPEID_PLAYER
Definition Object.h:55
@ SPELL_EFFECT_BIND
@ IMMUNITY_EFFECT
@ IMMUNITY_MECHANIC
@ MECHANIC_CHARM
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ SAY_SLAY
@ SAY_GREET
#define SAY_DEATH
#define SAY_AGGRO
@ SPELL_FRENZY
@ DATA_FRENZY_DISPELS
@ SAY_DEATH
@ SAY_AGGRO
@ SAY_GREET
@ SAY_SLAY
void AddSC_boss_faerlina()
@ H_SPELL_POISON_BOLT_VOLLEY
@ H_SPELL_FRENZY
@ H_SPELL_RAIN_OF_FIRE
@ SPELL_RAIN_OF_FIRE
@ H_SPELL_WIDOWS_EMBRACE
@ SPELL_FRENZY
@ SPELL_WIDOWS_EMBRACE
@ SPELL_POISON_BOLT_VOLLEY
#define SPELL_WIDOWS_EMBRACE_HELPER
@ EVENT_FIRE
@ EVENT_FRENZY
@ EVENT_POISON
@ SPELL_RAIN_OF_FIRE
AchievementCriteriaScript(const char *name)
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
virtual void MoveInLineOfSight(Unit *)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
static Creature * GetCreature(WorldObject const &u, 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 DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
Definition Unit.h:1367
bool OnCheck(Player *, Unit *target) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
@ DATA_FAERLINA
Definition naxxramas.h:45
@ BOSS_FAERLINA
Definition naxxramas.h:14
DifficultyID GetDifficulty() const
Creature * me
const T & RAID_MODE(const T &normal10, const T &normal25) const
ScriptedAI(Creature *creature)
boss_faerlinaAI(Creature *creature)
void EnterCombat(Unit *) OVERRIDE
void MoveInLineOfSight(Unit *who) OVERRIDE
uint32 GetData(uint32 type) const OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void JustDied(Unit *) OVERRIDE
void KilledUnit(Unit *) OVERRIDE
void SpellHit(Unit *caster, SpellInfo const *spell) OVERRIDE