Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
boss_midnight.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
7
SDName: Boss_Midnight
8
SD%Complete: 100
9
SDComment:
10
SDCategory: Karazhan
11
EndScriptData */
12
13
#include "
ScriptMgr.h
"
14
#include "
ScriptedCreature.h
"
15
#include "
SpellInfo.h
"
16
17
enum
Midnight
18
{
19
SAY_MIDNIGHT_KILL
= 0,
20
SAY_APPEAR
= 1,
21
SAY_MOUNT
= 2,
22
23
SAY_KILL
= 0,
24
SAY_DISARMED
= 1,
25
SAY_DEATH
= 2,
26
SAY_RANDOM
= 3,
27
28
SPELL_SHADOWCLEAVE
= 29832,
29
SPELL_INTANGIBLE_PRESENCE
= 29833,
30
SPELL_BERSERKER_CHARGE
= 26561,
//Only when mounted
31
32
MOUNTED_DISPLAYID
= 16040,
33
34
//Attumen (@todo Use the summoning spell instead of Creature id. It works, but is not convenient for us)
35
SUMMON_ATTUMEN
= 15550,
36
};
37
38
class
boss_attumen
:
public
CreatureScript
39
{
40
public
:
41
boss_attumen
() :
CreatureScript
(
"boss_attumen"
) { }
42
43
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
44
{
45
return
new
boss_attumenAI
(creature);
46
}
47
48
struct
boss_attumenAI
:
public
ScriptedAI
49
{
50
boss_attumenAI
(
Creature
* creature) :
ScriptedAI
(creature)
51
{
52
Phase
= 1;
53
54
CleaveTimer
= std::rand() % 15000 + 10000;
55
CurseTimer
= 30000;
56
RandomYellTimer
= std::rand() % 60000 + 30000;
//Occasionally yell
57
ChargeTimer
= 20000;
58
ResetTimer
= 0;
59
}
60
61
uint64
Midnight
;
62
uint8
Phase
;
63
uint32
CleaveTimer
;
64
uint32
CurseTimer
;
65
uint32
RandomYellTimer
;
66
uint32
ChargeTimer
;
//only when mounted
67
uint32
ResetTimer
;
68
69
void
Reset
()
OVERRIDE
70
{
71
ResetTimer
= 0;
72
}
73
74
void
EnterEvadeMode
()
OVERRIDE
75
{
76
ScriptedAI::EnterEvadeMode
();
77
ResetTimer
= 2000;
78
}
79
80
void
EnterCombat
(
Unit
*
/*who*/
)
OVERRIDE
{ }
81
82
void
KilledUnit
(
Unit
*
/*victim*/
)
OVERRIDE
83
{
84
Talk
(
SAY_KILL
);
85
}
86
87
void
JustDied
(
Unit
*
/*killer*/
)
OVERRIDE
88
{
89
Talk
(
SAY_DEATH
);
90
if
(
Unit
* midnight =
Unit::GetUnit
(*
me
,
Midnight
))
91
midnight->Kill(midnight);
92
}
93
94
void
UpdateAI
(
uint32
diff)
OVERRIDE
;
95
96
void
SpellHit
(
Unit
*
/*source*/
,
const
SpellInfo
* spell)
OVERRIDE
97
{
98
if
(spell->Mechanic ==
MECHANIC_DISARM
)
99
Talk
(
SAY_DISARMED
);
100
}
101
};
102
};
103
104
class
boss_midnight
:
public
CreatureScript
105
{
106
public
:
107
boss_midnight
() :
CreatureScript
(
"boss_midnight"
) { }
108
109
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
110
{
111
return
new
boss_midnightAI
(creature);
112
}
113
114
struct
boss_midnightAI
:
public
ScriptedAI
115
{
116
boss_midnightAI
(
Creature
* creature) :
ScriptedAI
(creature) { }
117
118
uint64
Attumen
;
119
uint8
Phase
;
120
uint32
Mount_Timer
;
121
122
void
Reset
()
OVERRIDE
123
{
124
Phase
= 1;
125
Attumen
= 0;
126
Mount_Timer
= 0;
127
128
me
->RemoveFlag(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_NON_ATTACKABLE
);
129
me
->SetVisible(
true
);
130
}
131
132
void
EnterCombat
(
Unit
*
/*who*/
)
OVERRIDE
{ }
133
134
void
KilledUnit
(
Unit
*
/*victim*/
)
OVERRIDE
135
{
136
if
(
Phase
== 2)
137
{
138
if
(
Unit
* unit =
Unit::GetUnit
(*
me
,
Attumen
))
139
Talk
(
SAY_MIDNIGHT_KILL
, unit);
140
}
141
}
142
143
void
UpdateAI
(
uint32
diff)
OVERRIDE
144
{
145
if
(!
UpdateVictim
())
146
return
;
147
148
if
(
Phase
== 1 &&
HealthBelowPct
(95))
149
{
150
Phase
= 2;
151
if
(
Creature
* attumen =
me
->SummonCreature(
SUMMON_ATTUMEN
, 0.0f, 0.0f, 0.0f, 0.0f,
TempSummonType::TEMPSUMMON_TIMED_OR_DEAD_DESPAWN
, 30000))
152
{
153
Attumen
= attumen->GetGUID();
154
attumen->AI()->AttackStart(
me
->GetVictim());
155
SetMidnight
(attumen,
me
->GetGUID());
156
Talk
(
SAY_APPEAR
, attumen);
157
}
158
}
159
else
if
(
Phase
== 2 &&
HealthBelowPct
(25))
160
{
161
if
(
Unit
* pAttumen =
Unit::GetUnit
(*
me
,
Attumen
))
162
Mount
(pAttumen);
163
}
164
else
if
(
Phase
== 3)
165
{
166
if
(
Mount_Timer
)
167
{
168
if
(
Mount_Timer
<= diff)
169
{
170
Mount_Timer
= 0;
171
me
->SetVisible(
false
);
172
me
->GetMotionMaster()->MoveIdle();
173
if
(
Unit
* pAttumen =
Unit::GetUnit
(*
me
,
Attumen
))
174
{
175
pAttumen->SetDisplayId(
MOUNTED_DISPLAYID
);
176
pAttumen->RemoveFlag(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_NON_ATTACKABLE
);
177
if
(pAttumen->GetVictim())
178
{
179
pAttumen->GetMotionMaster()->MoveChase(pAttumen->GetVictim());
180
pAttumen->SetTarget(pAttumen->GetVictim()->GetGUID());
181
}
182
pAttumen->SetObjectScale(1);
183
}
184
}
else
Mount_Timer
-= diff;
185
}
186
}
187
188
if
(
Phase
!= 3)
189
DoMeleeAttackIfReady
();
190
}
191
192
void
Mount
(
Unit
* pAttumen)
193
{
194
Talk
(
SAY_MOUNT
, pAttumen);
195
Phase
= 3;
196
me
->SetFlag(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_NON_ATTACKABLE
);
197
pAttumen->
SetFlag
(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_NON_ATTACKABLE
);
198
float
angle =
me
->GetAngle(pAttumen);
199
float
distance =
me
->GetDistance2d(pAttumen);
200
float
newX =
me
->GetPositionX() + std::cos(angle)*(distance/2);
201
float
newY =
me
->GetPositionY() + std::sin(angle)*(distance/2);
202
float
newZ = 50;
203
//me->Relocate(newX, newY, newZ, angle);
204
//me->SendMonsterMove(newX, newY, newZ, 0, true, 1000);
205
me
->GetMotionMaster()->Clear();
206
me
->GetMotionMaster()->MovePoint(0, newX, newY, newZ);
207
distance += 10;
208
newX =
me
->GetPositionX() + std::cos(angle)*(distance/2);
209
newY =
me
->GetPositionY() + std::sin(angle)*(distance/2);
210
pAttumen->
GetMotionMaster
()->
Clear
();
211
pAttumen->
GetMotionMaster
()->
MovePoint
(0, newX, newY, newZ);
212
//pAttumen->Relocate(newX, newY, newZ, -angle);
213
//pAttumen->SendMonsterMove(newX, newY, newZ, 0, true, 1000);
214
Mount_Timer
= 1000;
215
}
216
217
void
SetMidnight
(
Creature
* pAttumen,
uint64
value)
218
{
219
CAST_AI
(
boss_attumen::boss_attumenAI
, pAttumen->
AI
())->Midnight = value;
220
}
221
};
222
};
223
224
void
boss_attumen::boss_attumenAI::UpdateAI
(
uint32
diff)
225
{
226
if
(
ResetTimer
)
227
{
228
if
(
ResetTimer
<= diff)
229
{
230
ResetTimer
= 0;
231
Unit
* pMidnight =
Unit::GetUnit
(*
me
,
Midnight
);
232
if
(pMidnight)
233
{
234
pMidnight->
RemoveFlag
(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_NON_ATTACKABLE
);
235
pMidnight->
SetVisible
(
true
);
236
}
237
Midnight
= 0;
238
me
->SetVisible(
false
);
239
me
->Kill(
me
);
240
}
else
ResetTimer
-= diff;
241
}
242
243
//Return since we have no target
244
if
(!
UpdateVictim
())
245
return
;
246
247
if
(
me
->HasFlag(
UNIT_FIELD_FLAGS
,
UNIT_FLAG_NON_ATTACKABLE
|
UNIT_FLAG_NOT_SELECTABLE
))
248
return
;
249
250
if
(
CleaveTimer
<= diff)
251
{
252
DoCastVictim
(
SPELL_SHADOWCLEAVE
);
253
CleaveTimer
= std::rand() % 15000 + 10000;
254
}
else
CleaveTimer
-= diff;
255
256
if
(
CurseTimer
<= diff)
257
{
258
DoCastVictim
(
SPELL_INTANGIBLE_PRESENCE
);
259
CurseTimer
= 30000;
260
}
else
CurseTimer
-= diff;
261
262
if
(
RandomYellTimer
<= diff)
263
{
264
Talk
(
SAY_RANDOM
);
265
RandomYellTimer
= std::rand() % 60000 + 30000;
266
}
else
RandomYellTimer
-= diff;
267
268
if
(
me
->GetUInt32Value(
UNIT_FIELD_DISPLAY_ID
) ==
MOUNTED_DISPLAYID
)
269
{
270
if
(
ChargeTimer
<= diff)
271
{
272
Unit
* target = NULL;
273
ThreatContainer::StorageType
const
&t_list =
me
->getThreatManager().getThreatList();
274
std::vector<Unit*> target_list;
275
for
(ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr)
276
{
277
target =
Unit::GetUnit
(*
me
, (*itr)->getUnitGuid());
278
if
(target && !target->
IsWithinDist
(
me
,
ATTACK_DISTANCE
,
false
))
279
target_list.push_back(target);
280
target = NULL;
281
}
282
if
(!target_list.empty())
283
target = *(target_list.begin()+rand()%target_list.size());
284
285
DoCast
(target,
SPELL_BERSERKER_CHARGE
);
286
ChargeTimer
= 20000;
287
}
else
ChargeTimer
-= diff;
288
}
289
else
290
{
291
if
(
HealthBelowPct
(25))
292
{
293
Creature
* pMidnight =
Unit::GetCreature
(*
me
,
Midnight
);
294
if
(pMidnight && pMidnight->
GetTypeId
() ==
TypeID::TYPEID_UNIT
)
295
{
296
CAST_AI
(
boss_midnight::boss_midnightAI
, (pMidnight->
AI
()))->Mount(
me
);
297
me
->SetHealth(pMidnight->
GetHealth
());
298
DoResetThreat
();
299
}
300
}
301
}
302
303
DoMeleeAttackIfReady
();
304
}
305
306
void
AddSC_boss_attumen
()
307
{
308
new
boss_attumen
();
309
new
boss_midnight
();
310
}
uint8
std::uint8_t uint8
Definition
Define.h:79
uint32
std::uint32_t uint32
Definition
Define.h:77
OVERRIDE
#define OVERRIDE
Definition
Define.h:60
uint64
std::uint64_t uint64
Definition
Define.h:76
ATTACK_DISTANCE
#define ATTACK_DISTANCE
Definition
Object.h:22
TypeID::TYPEID_UNIT
@ TYPEID_UNIT
Definition
Object.h:54
TempSummonType::TEMPSUMMON_TIMED_OR_DEAD_DESPAWN
@ TEMPSUMMON_TIMED_OR_DEAD_DESPAWN
Definition
Object.h:68
ScriptMgr.h
ScriptedCreature.h
CAST_AI
#define CAST_AI(a, b)
Definition
ScriptedCreature.h:14
MECHANIC_DISARM
@ MECHANIC_DISARM
Definition
SharedDefines.h:1529
SpellInfo.h
UNIT_FLAG_NON_ATTACKABLE
@ UNIT_FLAG_NON_ATTACKABLE
Definition
Unit.h:626
UNIT_FLAG_NOT_SELECTABLE
@ UNIT_FLAG_NOT_SELECTABLE
Definition
Unit.h:650
UNIT_FIELD_DISPLAY_ID
@ UNIT_FIELD_DISPLAY_ID
Definition
UpdateFields.h:89
UNIT_FIELD_FLAGS
@ UNIT_FIELD_FLAGS
Definition
UpdateFields.h:82
SAY_DEATH
#define SAY_DEATH
Definition
boss_commander_kolurg.cpp:30
SAY_KILL
#define SAY_KILL
Definition
boss_commander_kolurg.cpp:29
AddSC_boss_attumen
void AddSC_boss_attumen()
Definition
boss_midnight.cpp:306
Midnight
Midnight
Definition
boss_midnight.cpp:18
SAY_DEATH
@ SAY_DEATH
Definition
boss_midnight.cpp:25
SUMMON_ATTUMEN
@ SUMMON_ATTUMEN
Definition
boss_midnight.cpp:35
SPELL_SHADOWCLEAVE
@ SPELL_SHADOWCLEAVE
Definition
boss_midnight.cpp:28
SAY_DISARMED
@ SAY_DISARMED
Definition
boss_midnight.cpp:24
SAY_MIDNIGHT_KILL
@ SAY_MIDNIGHT_KILL
Definition
boss_midnight.cpp:19
SAY_KILL
@ SAY_KILL
Definition
boss_midnight.cpp:23
SAY_MOUNT
@ SAY_MOUNT
Definition
boss_midnight.cpp:21
SPELL_INTANGIBLE_PRESENCE
@ SPELL_INTANGIBLE_PRESENCE
Definition
boss_midnight.cpp:29
MOUNTED_DISPLAYID
@ MOUNTED_DISPLAYID
Definition
boss_midnight.cpp:32
SAY_APPEAR
@ SAY_APPEAR
Definition
boss_midnight.cpp:20
SAY_RANDOM
@ SAY_RANDOM
Definition
boss_midnight.cpp:26
SPELL_BERSERKER_CHARGE
@ SPELL_BERSERKER_CHARGE
Definition
boss_midnight.cpp:30
SAY_RANDOM
@ SAY_RANDOM
Definition
boss_nefarian.cpp:48
CreatureAI
Definition
CreatureAI.h:54
CreatureAI::Talk
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
Definition
CreatureAI.cpp:28
CreatureAI::UpdateVictim
bool UpdateVictim()
Definition
CreatureAI.cpp:192
CreatureAI::EnterEvadeMode
virtual void EnterEvadeMode()
Definition
CreatureAI.cpp:130
Creature
Definition
Creature.h:427
Creature::AI
CreatureAI * AI() const
Definition
Creature.h:483
CreatureScript::CreatureScript
CreatureScript(const char *name)
Definition
ScriptMgr.cpp:1436
MotionMaster::MovePoint
void MovePoint(uint32 id, Position const &pos, bool generatePath=true)
Definition
MotionMaster.h:136
MotionMaster::Clear
void Clear(bool reset=true)
Definition
MotionMaster.h:102
Object::GetTypeId
TypeID GetTypeId() const
Definition
Object.h:131
Object::SetFlag
void SetFlag(uint16 index, uint32 newFlag)
Definition
Object.cpp:1261
Object::RemoveFlag
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition
Object.cpp:1280
SpellInfo
Definition
SpellInfo.h:158
ThreatContainer::StorageType
std::list< HostileReference * > StorageType
Definition
ThreatManager.h:127
UnitAI::DoMeleeAttackIfReady
void DoMeleeAttackIfReady()
Definition
UnitAI.cpp:28
UnitAI::DoCast
void DoCast(uint32 spellId)
Definition
UnitAI.cpp:110
UnitAI::DoCastVictim
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition
UnitAI.cpp:168
Unit
Definition
Unit.h:1367
Unit::SetVisible
void SetVisible(bool x)
Definition
Unit.cpp:4163
Unit::GetMotionMaster
MotionMaster * GetMotionMaster()
Definition
Unit.h:2605
Unit::GetCreature
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition
Unit.cpp:4905
Unit::GetHealth
uint32 GetHealth() const
Definition
Unit.h:1600
Unit::GetUnit
static Unit * GetUnit(WorldObject &object, uint64 guid)
Definition
Unit.cpp:4895
WorldObject::IsWithinDist
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition
Object.cpp:1730
boss_attumen::boss_attumen
boss_attumen()
Definition
boss_midnight.cpp:41
boss_attumen::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
boss_midnight.cpp:43
boss_midnight
Definition
boss_midnight.cpp:105
boss_midnight::boss_midnight
boss_midnight()
Definition
boss_midnight.cpp:107
boss_midnight::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
boss_midnight.cpp:109
ScriptedAI::DoResetThreat
void DoResetThreat()
Definition
ScriptedCreature.cpp:260
ScriptedAI::me
Creature * me
Definition
ScriptedCreature.h:182
ScriptedAI::HealthBelowPct
bool HealthBelowPct(uint32 pct) const
Definition
ScriptedCreature.h:247
ScriptedAI::ScriptedAI
ScriptedAI(Creature *creature)
Definition
ScriptedCreature.cpp:85
boss_attumen::boss_attumenAI
Definition
boss_midnight.cpp:49
boss_attumen::boss_attumenAI::CleaveTimer
uint32 CleaveTimer
Definition
boss_midnight.cpp:63
boss_attumen::boss_attumenAI::UpdateAI
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Definition
boss_midnight.cpp:224
boss_attumen::boss_attumenAI::boss_attumenAI
boss_attumenAI(Creature *creature)
Definition
boss_midnight.cpp:50
boss_attumen::boss_attumenAI::CurseTimer
uint32 CurseTimer
Definition
boss_midnight.cpp:64
boss_attumen::boss_attumenAI::RandomYellTimer
uint32 RandomYellTimer
Definition
boss_midnight.cpp:65
boss_attumen::boss_attumenAI::KilledUnit
void KilledUnit(Unit *) OVERRIDE
Definition
boss_midnight.cpp:82
boss_attumen::boss_attumenAI::Phase
uint8 Phase
Definition
boss_midnight.cpp:62
boss_attumen::boss_attumenAI::JustDied
void JustDied(Unit *) OVERRIDE
Definition
boss_midnight.cpp:87
boss_attumen::boss_attumenAI::SpellHit
void SpellHit(Unit *, const SpellInfo *spell) OVERRIDE
Definition
boss_midnight.cpp:96
boss_attumen::boss_attumenAI::Reset
void Reset() OVERRIDE
Definition
boss_midnight.cpp:69
boss_attumen::boss_attumenAI::Midnight
uint64 Midnight
Definition
boss_midnight.cpp:61
boss_attumen::boss_attumenAI::EnterEvadeMode
void EnterEvadeMode() OVERRIDE
Definition
boss_midnight.cpp:74
boss_attumen::boss_attumenAI::ResetTimer
uint32 ResetTimer
Definition
boss_midnight.cpp:67
boss_attumen::boss_attumenAI::EnterCombat
void EnterCombat(Unit *) OVERRIDE
Definition
boss_midnight.cpp:80
boss_attumen::boss_attumenAI::ChargeTimer
uint32 ChargeTimer
Definition
boss_midnight.cpp:66
boss_midnight::boss_midnightAI
Definition
boss_midnight.cpp:115
boss_midnight::boss_midnightAI::Reset
void Reset() OVERRIDE
Definition
boss_midnight.cpp:122
boss_midnight::boss_midnightAI::EnterCombat
void EnterCombat(Unit *) OVERRIDE
Definition
boss_midnight.cpp:132
boss_midnight::boss_midnightAI::SetMidnight
void SetMidnight(Creature *pAttumen, uint64 value)
Definition
boss_midnight.cpp:217
boss_midnight::boss_midnightAI::Mount
void Mount(Unit *pAttumen)
Definition
boss_midnight.cpp:192
boss_midnight::boss_midnightAI::Attumen
uint64 Attumen
Definition
boss_midnight.cpp:118
boss_midnight::boss_midnightAI::UpdateAI
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Definition
boss_midnight.cpp:143
boss_midnight::boss_midnightAI::KilledUnit
void KilledUnit(Unit *) OVERRIDE
Definition
boss_midnight.cpp:134
boss_midnight::boss_midnightAI::Mount_Timer
uint32 Mount_Timer
Definition
boss_midnight.cpp:120
boss_midnight::boss_midnightAI::Phase
uint8 Phase
Definition
boss_midnight.cpp:119
boss_midnight::boss_midnightAI::boss_midnightAI
boss_midnightAI(Creature *creature)
Definition
boss_midnight.cpp:116
src
server
scripts
EasternKingdoms
Karazhan
boss_midnight.cpp
Generated on
for Project SkyFire Core by
1.17.0