Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_the_black_stalker.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/* ScriptData
7SDName: Boss_the_black_stalker
8SD%Complete: 95
9SDComment: Timers may be incorrect
10SDCategory: Coilfang Resevoir, Underbog
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15
26
28{
30};
31
33{
34public:
35 boss_the_black_stalker() : CreatureScript("boss_the_black_stalker") { }
36
38 {
39 return new boss_the_black_stalkerAI(creature);
40 }
41
43 {
45 {
46 }
47
54 bool InAir;
56 std::list<uint64> Striders;
57
59 {
60 Levitate_Timer = 12000;
62 StaticCharge_Timer = 10000;
63 SporeStriders_Timer = 10000+rand()%5000;
64 check_Timer = 5000;
67 Striders.clear();
68 }
69
70 void EnterCombat(Unit* /*who*/) OVERRIDE { }
71
73 {
74 if (summon && summon->GetEntry() == ENTRY_SPORE_STRIDER)
75 {
76 Striders.push_back(summon->GetGUID());
77 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
78 summon->AI()->AttackStart(target);
79 else
80 if (me->GetVictim())
81 summon->AI()->AttackStart(me->GetVictim());
82 }
83 }
84
85 void JustDied(Unit* /*killer*/) OVERRIDE
86 {
87 for (std::list<uint64>::const_iterator i = Striders.begin(); i != Striders.end(); ++i)
88 if (Creature* strider = Unit::GetCreature(*me, *i))
89 strider->DisappearAndDie();
90 }
91
93 {
94 if (!UpdateVictim())
95 return;
96
97 // Evade if too far
98 if (check_Timer <= diff)
99 {
100 float x, y, z, o;
101 me->GetHomePosition(x, y, z, o);
102 if (!me->IsWithinDist3d(x, y, z, 60))
103 {
105 return;
106 }
107 check_Timer = 1000;
108 } else check_Timer -= diff;
109
110 // Spore Striders
111 if (IsHeroic() && SporeStriders_Timer <= diff)
112 {
114 SporeStriders_Timer = 10000+rand()%5000;
115 } else SporeStriders_Timer -= diff;
116
117 // Levitate
118 if (LevitatedTarget)
119 {
120 if (LevitatedTarget_Timer <= diff)
121 {
122 if (Unit* target = Unit::GetUnit(*me, LevitatedTarget))
123 {
124 if (!target->HasAura(SPELL_LEVITATE))
125 {
126 LevitatedTarget = 0;
127 return;
128 }
129 if (InAir)
130 {
131 target->AddAura(SPELL_SUSPENSION, target);
132 LevitatedTarget = 0;
133 }
134 else
135 {
136 target->CastSpell(target, SPELL_MAGNETIC_PULL, true);
137 InAir = true;
139 }
140 }
141 else
142 LevitatedTarget = 0;
143 } else LevitatedTarget_Timer -= diff;
144 }
145 if (Levitate_Timer <= diff)
146 {
147 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
148 {
149 DoCast(target, SPELL_LEVITATE);
150 LevitatedTarget = target->GetGUID();
152 InAir = false;
153 }
154 Levitate_Timer = 12000+rand()%3000;
155 } else Levitate_Timer -= diff;
156
157 // Chain Lightning
158 if (ChainLightning_Timer <= diff)
159 {
160 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
163 } else ChainLightning_Timer -= diff;
164
165 // Static Charge
166 if (StaticCharge_Timer <= diff)
167 {
168 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30, true))
170 StaticCharge_Timer = 10000;
171 } else StaticCharge_Timer -= diff;
172
174 }
175 };
176};
177
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ SPELL_STATIC_CHARGE
@ SPELL_MAGNETIC_PULL
@ SPELL_MAGNETIC_PULL
@ SPELL_SUMMON_SPORE_STRIDER
@ SPELL_CHAIN_LIGHTNING
@ SPELL_STATIC_CHARGE
@ SPELL_LEVITATION_PULSE
@ ENTRY_SPORE_STRIDER
void AddSC_boss_the_black_stalker()
@ SPELL_CHAIN_LIGHTNING
bool UpdateVictim()
virtual void EnterEvadeMode()
CreatureScript(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
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
static Unit * GetUnit(WorldObject &object, uint64 guid)
Definition Unit.cpp:4895
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool IsHeroic() const
Creature * me
ScriptedAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================