Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_forgemaster_garfrost.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 "SpellAuras.h"
10#include "pit_of_saron.h"
11
24
35
36#define SPELL_PERMAFROST_HELPER RAID_MODE<uint32>(68786, 70336)
37#define SPELL_FORGE_BLADE_HELPER RAID_MODE<uint32>(68774, 70334)
38
40{
44};
45
53
62
63Position const northForgePos = { 722.5643f, -234.1615f, 527.182f, 2.16421f };
64Position const southForgePos = { 639.257f, -210.1198f, 529.015f, 0.523599f };
65
67{
68 public:
69 boss_garfrost() : CreatureScript("boss_garfrost") { }
70
71 struct boss_garfrostAI : public BossAI
72 {
73 boss_garfrostAI(Creature* creature) : BossAI(creature, DATA_GARFROST) { }
74
76 {
77 _Reset();
78 events.SetPhase(PHASE_ONE);
81 }
82
83 void EnterCombat(Unit* /*who*/) OVERRIDE
84 {
88 me->CallForHelp(70.0f);
89 events.ScheduleEvent(EVENT_THROW_SARONITE, 7000);
90 }
91
92 void KilledUnit(Unit* victim) OVERRIDE
93 {
94 if (victim->GetTypeId() == TypeID::TYPEID_PLAYER)
96 }
97
98 void JustDied(Unit* /*killer*/) OVERRIDE
99 {
100 _JustDied();
102
103 if (Creature* tyrannus = me->GetCreature(*me, instance->GetData64(DATA_TYRANNUS)))
104 tyrannus->AI()->Talk(SAY_TYRANNUS_DEATH);
105 }
106
107 void DamageTaken(Unit* /*attacker*/, uint32& /*uiDamage*/) OVERRIDE
108 {
109 if (events.IsInPhase(PHASE_ONE) && !HealthAbovePct(66))
110 {
111 events.SetPhase(PHASE_TWO);
113 events.DelayEvents(8000);
115 events.ScheduleEvent(EVENT_FORGE_JUMP, 1500);
116 return;
117 }
118
119 if (events.IsInPhase(PHASE_TWO) && !HealthAbovePct(33))
120 {
121 events.SetPhase(PHASE_THREE);
123 events.DelayEvents(8000);
125 events.ScheduleEvent(EVENT_FORGE_JUMP, 1500);
126 return;
127 }
128 }
129
131 {
132 if (type != EFFECT_MOTION_TYPE || id != POINT_FORGE)
133 return;
134
135 if (events.IsInPhase(PHASE_TWO))
136 {
139 }
140 if (events.IsInPhase(PHASE_THREE))
141 {
142 me->RemoveAurasDueToSpell(SPELL_FORGE_BLADE_HELPER);
145 }
146 events.ScheduleEvent(EVENT_RESUME_ATTACK, 5000);
147 }
148
149 void SpellHitTarget(Unit* target, const SpellInfo* spell) OVERRIDE
150 {
151 if (spell->Id == SPELL_PERMAFROST_HELPER)
152 {
153 if (Aura* aura = target->GetAura(SPELL_PERMAFROST_HELPER))
154 _permafrostStack = std::max<uint32>(_permafrostStack, aura->GetStackAmount());
155 }
156 }
157
159 {
160 return _permafrostStack;
161 }
162
164 {
165 if (!UpdateVictim())
166 return;
167
168 events.Update(diff);
169
170 if (me->HasUnitState(UNIT_STATE_CASTING))
171 return;
172
173 while (uint32 eventId = events.ExecuteEvent())
174 {
175 switch (eventId)
176 {
178 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
179 {
180 Talk(SAY_THROW_SARONITE, target);
182 }
183 events.ScheduleEvent(EVENT_THROW_SARONITE, std::rand() % 20000 + 12500);
184 break;
187 events.ScheduleEvent(EVENT_CHILLING_WAVE, 40000, 0, PHASE_TWO);
188 break;
190 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
191 {
192 Talk(SAY_CAST_DEEP_FREEZE, target);
193 DoCast(target, SPELL_DEEP_FREEZE);
194 }
195 events.ScheduleEvent(EVENT_DEEP_FREEZE, 35000, 0, PHASE_THREE);
196 break;
197 case EVENT_FORGE_JUMP:
198 me->AttackStop();
199 if (events.IsInPhase(PHASE_TWO))
200 me->GetMotionMaster()->MoveJump(northForgePos, 25.0f, 15.0f, POINT_FORGE);
201 else if (events.IsInPhase(PHASE_THREE))
202 me->GetMotionMaster()->MoveJump(southForgePos, 25.0f, 15.0f, POINT_FORGE);
203 break;
205 if (events.IsInPhase(PHASE_TWO))
206 events.ScheduleEvent(EVENT_CHILLING_WAVE, 5000, 0, PHASE_TWO);
207 else if (events.IsInPhase(PHASE_THREE))
208 events.ScheduleEvent(EVENT_DEEP_FREEZE, 10000, 0, PHASE_THREE);
209 AttackStart(me->GetVictim());
210 break;
211 default:
212 break;
213 }
214 }
215
217 }
218
219 private:
221 };
222
224 {
225 return GetPitOfSaronAI<boss_garfrostAI>(creature);
226 }
227};
228
230{
231 public:
232 spell_garfrost_permafrost() : SpellScriptLoader("spell_garfrost_permafrost") { }
233
235 {
237
239 {
240 prevented = false;
241 return true;
242 }
243
245 {
246 if (Unit* target = GetHitUnit())
247 {
248 Unit* caster = GetCaster();
249 //Temporary Line of Sight Check
250 std::list<GameObject*> blockList;
251 caster->GetGameObjectListWithEntryInGrid(blockList, GO_SARONITE_ROCK, 100.0f);
252 if (!blockList.empty())
253 {
254 for (std::list<GameObject*>::const_iterator itr = blockList.begin(); itr != blockList.end(); ++itr)
255 {
256 if (!(*itr)->IsInvisibleDueToDespawn())
257 {
258 if ((*itr)->IsInBetween(caster, target, 4.0f))
259 {
260 prevented = true;
261 target->ApplySpellImmune(GetSpellInfo()->Id, IMMUNITY_ID, GetSpellInfo()->Id, true);
266 break;
267 }
268 }
269 }
270 }
271 }
272 }
273
275 {
276 if (Unit* target = GetHitUnit())
277 {
278 target->ApplySpellImmune(GetSpellInfo()->Id, IMMUNITY_ID, GetSpellInfo()->Id, false);
279 if (prevented)
281 }
282 }
283
289
291 };
292
297};
298
300{
301 public:
302 achievement_doesnt_go_to_eleven() : AchievementCriteriaScript("achievement_doesnt_go_to_eleven") { }
303
304 bool OnCheck(Player* /*source*/, Unit* target) OVERRIDE
305 {
306 if (target)
307 if (Creature* garfrost = target->ToCreature())
308 if (garfrost->AI()->GetData(ACHIEV_DOESNT_GO_TO_ELEVEN) <= 10)
309 return true;
310
311 return false;
312 }
313};
314
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ EFFECT_MOTION_TYPE
@ TYPEID_PLAYER
Definition Object.h:55
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ IMMUNITY_ID
#define SpellHitFn(F)
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ SAY_SLAY
@ SPELL_PERMAFROST
#define SAY_DEATH
#define SAY_AGGRO
@ ACHIEV_DOESNT_GO_TO_ELEVEN
#define SPELL_PERMAFROST_HELPER
Position const northForgePos
#define SPELL_FORGE_BLADE_HELPER
void AddSC_boss_garfrost()
Position const southForgePos
@ PHASE_ONE
@ PHASE_THREE
@ PHASE_TWO
AchievementCriteriaScript(const char *name)
InstanceScript *const instance
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
Creature * ToCreature()
Definition Object.h:207
HookList< HitHandler > AfterHit
SpellInfo const * GetSpellInfo()
void PreventHitDamage()
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit()
void PreventHitAura()
Unit * GetCaster()
HookList< HitHandler > BeforeHit
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
Definition Unit.h:1367
void GetGameObjectListWithEntryInGrid(std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
Definition Object.cpp:2828
bool OnCheck(Player *, Unit *target) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
PrepareSpellScript(spell_garfrost_permafrost_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
@ GO_SARONITE_ROCK
AI * GetPitOfSaronAI(Creature *creature)
@ DATA_GARFROST
@ DATA_TYRANNUS
void SetEquipmentSlots(bool loadDefault, int32 mainHand=EQUIP_NO_CHANGE, int32 offHand=EQUIP_NO_CHANGE, int32 ranged=EQUIP_NO_CHANGE)
Creature * me
bool HealthAbovePct(uint32 pct) const
void AttackStart(Unit *) OVERRIDE
void SpellHitTarget(Unit *target, const SpellInfo *spell) OVERRIDE
uint32 GetData(uint32) const OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void DamageTaken(Unit *, uint32 &) OVERRIDE
void MovementInform(uint32 type, uint32 id) OVERRIDE