Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
utgarde_keep.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 "utgarde_keep.h"
9#include "SpellScript.h"
10#include "SpellAuraEffects.h"
11
16
23
25{
26 public:
27 npc_dragonflayer_forge_master() : CreatureScript("npc_dragonflayer_forge_master") { }
28
30 {
32 {
33 _instance = creature->GetInstanceScript();
34 _forgeId = 0;
35 }
36
38 {
39 if (!_forgeId)
41
42 if (!me->IsAlive())
43 return;
44
45 if (_forgeId)
47 }
48
49 void JustDied(Unit* /*killer*/) OVERRIDE
50 {
51 if (!_forgeId)
53
54 if (_forgeId)
55 _instance->SetData(DATA_FORGE_1 + _forgeId - 1, DONE);
56 }
57
58 void EnterCombat(Unit* /*who*/) OVERRIDE
59 {
60 if (!_forgeId)
62
63 if (_forgeId)
65
67 }
68
69 void UpdateAI(uint32 /*diff*/) OVERRIDE
70 {
71 if (!_forgeId)
73
74 if (!UpdateVictim())
75 return;
76
78 }
79
80 private:
82 {
83 float diff = 30.0f;
84 uint8 id = 0;
85
86 for (uint8 i = 0; i < 3; ++i)
87 {
88 if (GameObject* go = me->FindNearestGameObject(ForgeSearch[i], 30))
89 {
90 if (me->IsWithinDist(go, diff, false))
91 {
92 id = i + 1;
93 diff = me->GetDistance2d(go);
94 }
95 }
96 }
97 return id > 0 && id < 4 ? id : 0;
98 }
99
102 };
103
105 {
107 }
108};
109
114
148
150{
152};
153
155{
156 public:
157 spell_fixate() : SpellScriptLoader("spell_fixate") { }
158
160 {
162
163 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
164 {
165 if (!sSpellMgr->GetSpellInfo(SPELL_FIXATE_TRIGGER))
166 return false;
167 return true;
168 }
169
171 {
173 }
174
179 };
180
182 {
183 return new spell_fixate_SpellScript();
184 }
185};
186
204
205const Position protodrakeCheckPos = {206.24f, -190.28f, 200.11f, 0.f};
206
208{
209 public:
210 npc_enslaved_proto_drake() : CreatureScript("npc_enslaved_proto_drake") { }
211
213 {
215 {
216 _setData = false;
217 }
218
220 {
221 _events.Reset();
222 _events.ScheduleEvent(EVENT_REND, std::rand() % 3000 + 2000);
223 _events.ScheduleEvent(EVENT_FLAME_BREATH, std::rand() % 7000 + 5500);
224 _events.ScheduleEvent(EVENT_KNOCKAWAY, std::rand() % 6000 + 3500);
225 }
226
228 {
229 if (type == WAYPOINT_MOTION_TYPE && id == POINT_LAST)
230 {
232 }
233 }
234
235 void SetData(uint32 type, uint32 data) OVERRIDE
236 {
237 if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->GetDistance(protodrakeCheckPos) < 5.0f)
238 {
239 _setData = true;
241 me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false);
242 }
243 }
244
246 {
247 if (!UpdateVictim())
248 return;
249
250 _events.Update(diff);
251
252 if (me->HasUnitState(UNIT_STATE_CASTING))
253 return;
254
255 while (uint32 eventid = _events.ExecuteEvent())
256 {
257 switch (eventid)
258 {
259 case EVENT_REND:
261 _events.ScheduleEvent(EVENT_REND, std::rand() % 20000 + 15000);
262 break;
265 _events.ScheduleEvent(EVENT_FLAME_BREATH, std::rand() % 12000 + 11000);
266 break;
267 case EVENT_KNOCKAWAY:
269 _events.ScheduleEvent(EVENT_KNOCKAWAY, std::rand() % 8500 + 7000);
270 break;
271 default:
272 break;
273 }
274 }
275
277 }
278
279 private:
282 };
283
285 {
286 return new npc_enslaved_proto_drakeAI(creature);
287 }
288};
289
291{
292 public:
293 spell_uk_second_wind_proc() : SpellScriptLoader("spell_uk_second_wind_proc") { }
294
296 {
298
299 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
300 {
301 if (!sSpellMgr->GetSpellInfo(SPELL_UK_SECOUND_WIND_TRIGGER))
302 return false;
303 return true;
304 }
305
306 bool CheckProc(ProcEventInfo& eventInfo)
307 {
308 if (eventInfo.GetProcTarget() == GetTarget())
309 return false;
310 if (!(eventInfo.GetDamageInfo() || eventInfo.GetDamageInfo()->GetSpellInfo()->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
311 return false;
312 return true;
313 }
314
315 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
316 {
319 }
320
326 };
327
332};
333
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
@ WAYPOINT_MOTION_TYPE
SpellEffIndex
@ EFFECT_0
@ EFFECT_2
@ EMOTE_ONESHOT_NONE
@ SPELL_EFFECT_SCRIPT_EFFECT
@ MECHANIC_STUN
@ MECHANIC_ROOT
@ SPELL_AURA_DUMMY
@ SPELL_AURA_PERIODIC_DUMMY
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
#define sSpellMgr
Definition SpellMgr.h:744
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define AuraCheckProcFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ SPELLVALUE_BASE_POINT0
Definition Unit.h:114
@ UNIT_BYTE1_FLAG_HOVER
Definition Unit.h:189
@ UNIT_BYTE1_FLAG_ALWAYS_STAND
Definition Unit.h:188
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ UNIT_FIELD_ANIM_TIER
@ UNIT_FIELD_NPC_EMOTESTATE
@ SPELL_KNOCK_AWAY
Definition boss_gyth.cpp:16
@ EVENT_FLAME_BREATH
Definition boss_gyth.cpp:31
@ SPELL_REND
@ EVENT_REND
@ SPELL_FLAME_BREATH
void PreventDefaultAction()
Unit * GetCaster() const
Unit * GetTarget() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectApplyHandler > OnEffectRemove
HookList< EffectProcHandler > OnEffectProc
bool UpdateVictim()
CreatureScript(const char *name)
SpellInfo const * GetSpellInfo() const
Definition Unit.h:907
DamageInfo * GetDamageInfo() const
Definition Unit.h:985
Unit * GetProcTarget() const
Definition Unit.h:974
uint32 GetAllEffectsMechanicMask() const
HookList< EffectHandler > OnEffectHitTarget
Unit * GetHitUnit()
Unit * GetCaster()
SpellScriptLoader(const char *name)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
Definition Unit.h:1367
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
void CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
PrepareSpellScript(spell_fixate_SpellScript)
bool Validate(SpellInfo const *) OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
void HandleOnEffectRemove(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_ticking_time_bomb_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &)
PrepareAuraScript(spell_uk_second_wind_proc_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
Creature * me
ScriptedAI(Creature *creature)
void UpdateAI(uint32) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SetData(uint32 type, uint32 data) OVERRIDE
void MovementInform(uint32 type, uint32 id) OVERRIDE
const Position protodrakeCheckPos
void AddSC_utgarde_keep()
EnslavedProtoDrake
@ EVENT_FLAME_BREATH
@ EVENT_REND
@ SPELL_FLAME_BREATH
@ TYPE_PROTODRAKE_AT
@ DATA_PROTODRAKE_MOVE
@ POINT_LAST
@ PATH_PROTODRAKE
@ SPELL_KNOCK_AWAY
@ SPELL_REND
@ EVENT_KNOCKAWAY
@ SPELL_UK_SECOUND_WIND_TRIGGER
uint32 ForgeSearch[3]
TickingTimeBomb
@ SPELL_TICKING_TIME_BOMB_EXPLODE
@ SPELL_FIXATE_TRIGGER
@ GO_GLOWING_ANVIL_1
@ GO_GLOWING_ANVIL_2
@ GO_GLOWING_ANVIL_3
AI * GetUtgardeKeepAI(Creature *creature)
@ DATA_FORGE_1