Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
boss_ossirian.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 "
ruins_of_ahnqiraj.h
"
9
#include "
Player.h
"
10
#include "
SpellInfo.h
"
11
#include "
WorldPacket.h
"
12
#include "
Opcodes.h
"
13
14
enum
Texts
15
{
16
SAY_SUPREME
= 0,
17
SAY_INTRO
= 1,
18
SAY_AGGRO
= 2,
19
SAY_SLAY
= 3,
20
SAY_DEATH
= 4
21
};
22
23
enum
Spells
24
{
25
SPELL_SILENCE
= 25195,
26
SPELL_CYCLONE
= 25189,
27
SPELL_STOMP
= 25188,
28
SPELL_SUPREME
= 25176,
29
SPELL_SUMMON
= 20477,
30
SPELL_SAND_STORM
= 25160,
31
SPELL_SUMMON_CRYSTAL
= 25192
32
};
33
34
enum
Actions
35
{
36
ACTION_TRIGGER_WEAKNESS
= 1
37
};
38
39
enum
Events
40
{
41
EVENT_SILENCE
= 1,
42
EVENT_CYCLONE
= 2,
43
EVENT_STOMP
= 3
44
};
45
46
uint8
const
NUM_CRYSTALS
= 9;
47
48
// You spin me right round, baby
49
// right round like a record, baby
50
// right round round round
51
Position
CrystalCoordinates
[
NUM_CRYSTALS
] =
52
{
53
{ -9394.230469f, 1951.808594f, 85.97733f, 0.0f },
54
{ -9357.931641f, 1930.596802f, 85.556198f, 0.0f },
55
{ -9383.113281f, 2011.042725f, 85.556389f, 0.0f },
56
{ -9243.36f, 1979.04f, 85.556f, 0.0f },
57
{ -9281.68f, 1886.66f, 85.5558f, 0.0f },
58
{ -9241.8f, 1806.39f, 85.5557f, 0.0f },
59
{ -9366.78f, 1781.76f, 85.5561f, 0.0f },
60
{ -9430.37f, 1786.86f, 85.557f, 0.0f },
61
{ -9406.73f, 1863.13f, 85.5558f, 0.0f }
62
};
63
64
float
RoomRadius
= 165.0f;
65
uint8
const
NUM_TORNADOS
= 5;
66
uint8
const
NUM_WEAKNESS
= 5;
67
uint32
const
SpellWeakness
[
NUM_WEAKNESS
] = { 25177, 25178, 25180, 25181, 25183 };
68
Position
const
RoomCenter
= { -9343.041992f, 1923.278198f, 85.555984f, 0.0 };
69
70
class
boss_ossirian
:
public
CreatureScript
71
{
72
public
:
73
boss_ossirian
() :
CreatureScript
(
"boss_ossirian"
) { }
74
75
struct
boss_ossirianAI
:
public
BossAI
76
{
77
boss_ossirianAI
(
Creature
* creature) :
BossAI
(creature,
DATA_OSSIRIAN
)
78
{
79
SaidIntro
=
false
;
80
}
81
82
uint64
TriggerGUID
;
83
uint64
CrystalGUID
;
84
uint8
CrystalIterator
;
85
bool
SaidIntro
;
86
87
void
Reset
()
OVERRIDE
88
{
89
_Reset
();
90
CrystalIterator
= 0;
91
TriggerGUID
= 0;
92
CrystalGUID
= 0;
93
}
94
95
void
SpellHit
(
Unit
* caster,
SpellInfo
const
* spell)
OVERRIDE
96
{
97
for
(
uint8
i = 0; i <
NUM_WEAKNESS
; ++i)
98
{
99
if
(spell->Id ==
SpellWeakness
[i])
100
{
101
me
->RemoveAurasDueToSpell(
SPELL_SUPREME
);
102
((
TempSummon
*)caster)->UnSummon();
103
SpawnNextCrystal
();
104
}
105
}
106
}
107
108
void
DoAction
(
int32
action)
OVERRIDE
109
{
110
if
(action ==
ACTION_TRIGGER_WEAKNESS
)
111
if
(
Creature
* Trigger =
me
->GetMap()->GetCreature(
TriggerGUID
))
112
if
(!Trigger->HasUnitState(
UNIT_STATE_CASTING
))
113
Trigger->CastSpell(Trigger,
SpellWeakness
[std::rand() % 4],
false
);
114
}
115
116
void
EnterCombat
(
Unit
*
/*who*/
)
OVERRIDE
117
{
118
_EnterCombat
();
119
events
.Reset();
120
events
.ScheduleEvent(
EVENT_SILENCE
, 30000);
121
events
.ScheduleEvent(
EVENT_CYCLONE
, 20000);
122
events
.ScheduleEvent(
EVENT_STOMP
, 30000);
123
124
DoCast
(
me
,
SPELL_SUPREME
);
125
Talk
(
SAY_AGGRO
);
126
127
if
(
instance
)
128
{
129
Map
* map =
me
->GetMap();
130
if
(!map->
IsRaid
())
131
return
;
132
133
WorldPacket
data(
SMSG_WEATHER
, 4 + 4 + 1);
134
data <<
uint32
(
WEATHER_STATE_HEAVY_SANDSTORM
);
// WeatherID
135
data << float(1.0f);
// Intensity
136
data.
WriteBit
(
false
);
// Abrupt
137
data.
FlushBits
();
138
map->
SendToPlayers
(&data);
139
140
for
(
uint8
i = 0; i <
NUM_TORNADOS
; ++i)
141
{
142
Position
Point;
143
me
->GetRandomPoint(
RoomCenter
,
RoomRadius
, Point);
144
if
(
Creature
* Tornado =
me
->GetMap()->SummonCreature(
NPC_SAND_VORTEX
, Point))
145
Tornado->CastSpell(Tornado,
SPELL_SAND_STORM
,
true
);
146
}
147
148
SpawnNextCrystal
();
149
}
150
}
151
152
void
KilledUnit
(
Unit
*
/*victim*/
)
OVERRIDE
153
{
154
Talk
(
SAY_SLAY
);
155
}
156
157
void
EnterEvadeMode
()
OVERRIDE
158
{
159
Cleanup
();
160
summons
.DespawnAll();
161
BossAI::EnterEvadeMode
();
162
}
163
164
void
JustDied
(
Unit
*
/*killer*/
)
OVERRIDE
165
{
166
Cleanup
();
167
_JustDied
();
168
}
169
170
void
Cleanup
()
171
{
172
if
(
GameObject
* Crystal =
me
->GetMap()->GetGameObject(
CrystalGUID
))
173
Crystal->Use(
me
);
174
}
175
176
void
SpawnNextCrystal
()
177
{
178
if
(
CrystalIterator
==
NUM_CRYSTALS
)
179
CrystalIterator
= 0;
180
181
if
(
Creature
* Trigger =
me
->GetMap()->SummonCreature(
NPC_OSSIRIAN_TRIGGER
,
CrystalCoordinates
[
CrystalIterator
]))
182
{
183
TriggerGUID
= Trigger->GetGUID();
184
if
(
GameObject
* Crystal = Trigger->
SummonGameObject
(
GO_OSSIRIAN_CRYSTAL
,
185
CrystalCoordinates
[
CrystalIterator
].GetPositionX(),
186
CrystalCoordinates
[
CrystalIterator
].GetPositionY(),
187
CrystalCoordinates
[
CrystalIterator
].GetPositionZ(),
188
0, 0, 0, 0, 0,
uint32
(-1)))
189
{
190
CrystalGUID
= Crystal->GetGUID();
191
++
CrystalIterator
;
192
}
193
}
194
}
195
196
void
MoveInLineOfSight
(
Unit
* who)
OVERRIDE
197
198
{
199
if
(!
SaidIntro
)
200
{
201
Talk
(
SAY_INTRO
);
202
SaidIntro
=
true
;
203
}
204
BossAI::MoveInLineOfSight
(who);
205
}
206
207
void
UpdateAI
(
uint32
diff)
OVERRIDE
208
{
209
if
(!
UpdateVictim
())
210
return
;
211
212
events
.Update(diff);
213
214
// No kiting!
215
if
(
me
->GetDistance(
me
->GetVictim()) > 60.00f &&
me
->GetDistance(
me
->GetVictim()) < 120.00f)
216
DoCastVictim
(
SPELL_SUMMON
);
217
218
bool
ApplySupreme =
true
;
219
220
if
(
me
->HasAura(
SPELL_SUPREME
))
221
ApplySupreme =
false
;
222
else
223
{
224
for
(
uint8
i = 0; i <
NUM_WEAKNESS
; ++i)
225
{
226
if
(
me
->HasAura(
SpellWeakness
[i]))
227
{
228
ApplySupreme =
false
;
229
break
;
230
}
231
}
232
}
233
234
if
(ApplySupreme)
235
{
236
DoCast
(
me
,
SPELL_SUPREME
);
237
Talk
(
SAY_SUPREME
);
238
}
239
240
while
(
uint32
eventId =
events
.ExecuteEvent())
241
{
242
switch
(eventId)
243
{
244
case
EVENT_SILENCE
:
245
DoCast
(
me
,
SPELL_SILENCE
);
246
events
.ScheduleEvent(
EVENT_SILENCE
, std::rand() % 30000 + 20000);
247
break
;
248
case
EVENT_CYCLONE
:
249
DoCastVictim
(
SPELL_CYCLONE
);
250
events
.ScheduleEvent(
EVENT_CYCLONE
, 20000);
251
break
;
252
case
EVENT_STOMP
:
253
DoCast
(
me
,
SPELL_STOMP
);
254
events
.ScheduleEvent(
EVENT_STOMP
, 30000);
255
break
;
256
default
:
257
break
;
258
}
259
}
260
261
DoMeleeAttackIfReady
();
262
}
263
};
264
265
CreatureAI
*
GetAI
(
Creature
* creature)
const
OVERRIDE
266
{
267
return
new
boss_ossirianAI
(creature);
268
}
269
};
270
271
class
go_ossirian_crystal
:
public
GameObjectScript
272
{
273
public
:
274
go_ossirian_crystal
() :
GameObjectScript
(
"go_ossirian_crystal"
) { }
275
276
bool
OnGossipHello
(
Player
* player,
GameObject
*
/*go*/
)
OVERRIDE
277
{
278
InstanceScript
* Instance = player->GetInstanceScript();
279
if
(!Instance)
280
return
false
;
281
282
Creature
* Ossirian = player->
FindNearestCreature
(
NPC_OSSIRIAN
, 30.0f);
283
if
(!Ossirian || Instance->
GetBossState
(
DATA_OSSIRIAN
) !=
IN_PROGRESS
)
284
return
false
;
285
286
Ossirian->
AI
()->
DoAction
(
ACTION_TRIGGER_WEAKNESS
);
287
return
true
;
288
}
289
};
290
291
void
AddSC_boss_ossirian
()
292
{
293
new
boss_ossirian
();
294
new
go_ossirian_crystal
();
295
}
Actions
Actions
Definition
BattlegroundIC.h:186
Spells
Spells
Definition
BattlegroundIC.h:645
int32
std::int32_t int32
Definition
Define.h:73
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
IN_PROGRESS
@ IN_PROGRESS
Definition
InstanceScript.h:47
Opcodes.h
Player.h
ScriptMgr.h
ScriptedCreature.h
SpellInfo.h
UNIT_STATE_CASTING
@ UNIT_STATE_CASTING
Definition
Unit.h:527
WorldPacket.h
Events
Events
Definition
alterac_valley.cpp:40
Texts
Texts
Definition
boss_alizabal.cpp:13
SAY_SLAY
@ SAY_SLAY
Definition
boss_alizabal.cpp:20
SAY_INTRO
@ SAY_INTRO
Definition
boss_alizabal.cpp:14
SPELL_SAND_STORM
@ SPELL_SAND_STORM
Definition
boss_ancient_stone_keeper.cpp:18
SPELL_SILENCE
@ SPELL_SILENCE
Definition
boss_baroness_anastari.cpp:21
SAY_DEATH
#define SAY_DEATH
Definition
boss_commander_kolurg.cpp:30
SAY_AGGRO
#define SAY_AGGRO
Definition
boss_commander_kolurg.cpp:28
ACTION_TRIGGER_WEAKNESS
@ ACTION_TRIGGER_WEAKNESS
Definition
boss_ossirian.cpp:36
SPELL_STOMP
@ SPELL_STOMP
Definition
boss_ossirian.cpp:27
SPELL_SILENCE
@ SPELL_SILENCE
Definition
boss_ossirian.cpp:25
SPELL_SUMMON_CRYSTAL
@ SPELL_SUMMON_CRYSTAL
Definition
boss_ossirian.cpp:31
SPELL_SAND_STORM
@ SPELL_SAND_STORM
Definition
boss_ossirian.cpp:30
SPELL_CYCLONE
@ SPELL_CYCLONE
Definition
boss_ossirian.cpp:26
SPELL_SUPREME
@ SPELL_SUPREME
Definition
boss_ossirian.cpp:28
SPELL_SUMMON
@ SPELL_SUMMON
Definition
boss_ossirian.cpp:29
NUM_TORNADOS
uint8 const NUM_TORNADOS
Definition
boss_ossirian.cpp:65
CrystalCoordinates
Position CrystalCoordinates[NUM_CRYSTALS]
Definition
boss_ossirian.cpp:51
SAY_AGGRO
@ SAY_AGGRO
Definition
boss_ossirian.cpp:18
SAY_SLAY
@ SAY_SLAY
Definition
boss_ossirian.cpp:19
SAY_SUPREME
@ SAY_SUPREME
Definition
boss_ossirian.cpp:16
SAY_INTRO
@ SAY_INTRO
Definition
boss_ossirian.cpp:17
RoomCenter
Position const RoomCenter
Definition
boss_ossirian.cpp:68
NUM_CRYSTALS
uint8 const NUM_CRYSTALS
Definition
boss_ossirian.cpp:46
RoomRadius
float RoomRadius
Definition
boss_ossirian.cpp:64
SpellWeakness
uint32 const SpellWeakness[NUM_WEAKNESS]
Definition
boss_ossirian.cpp:67
AddSC_boss_ossirian
void AddSC_boss_ossirian()
Definition
boss_ossirian.cpp:291
EVENT_CYCLONE
@ EVENT_CYCLONE
Definition
boss_ossirian.cpp:42
EVENT_STOMP
@ EVENT_STOMP
Definition
boss_ossirian.cpp:43
EVENT_SILENCE
@ EVENT_SILENCE
Definition
boss_ossirian.cpp:41
NUM_WEAKNESS
uint8 const NUM_WEAKNESS
Definition
boss_ossirian.cpp:66
EVENT_STOMP
@ EVENT_STOMP
Definition
boss_razorgore.cpp:46
SPELL_STOMP
@ SPELL_STOMP
Definition
chapter5.cpp:158
BossAI::instance
InstanceScript *const instance
Definition
ScriptedCreature.h:383
BossAI::summons
SummonList summons
Definition
ScriptedCreature.h:440
BossAI::events
EventMap events
Definition
ScriptedCreature.h:439
BossAI::BossAI
BossAI(Creature *creature, uint32 bossId)
Definition
ScriptedCreature.cpp:456
BossAI::_JustDied
void _JustDied()
Definition
ScriptedCreature.cpp:474
BossAI::_Reset
void _Reset()
Definition
ScriptedCreature.cpp:462
BossAI::_EnterCombat
void _EnterCombat()
Definition
ScriptedCreature.cpp:485
ByteBuffer::WriteBit
bool WriteBit(uint32 bit)
Definition
ByteBuffer.h:164
ByteBuffer::FlushBits
void FlushBits()
Definition
ByteBuffer.h:154
CreatureAI
Definition
CreatureAI.h:54
CreatureAI::MoveInLineOfSight
virtual void MoveInLineOfSight(Unit *)
Definition
CreatureAI.cpp:114
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
GameObject
Definition
GameObject.h:629
GameObjectScript::GameObjectScript
GameObjectScript(const char *name)
Definition
ScriptMgr.cpp:1442
InstanceScript
Definition
InstanceScript.h:123
InstanceScript::GetBossState
EncounterState GetBossState(uint32 id) const
Definition
InstanceScript.h:185
Map
Definition
Map.h:238
Map::IsRaid
bool IsRaid() const
Definition
Map.h:372
Map::SendToPlayers
void SendToPlayers(WorldPacket const *data) const
Definition
Map.cpp:2525
Player
Definition
Player.h:1289
SpellInfo
Definition
SpellInfo.h:158
TempSummon
Definition
TemporarySummon.h:27
UnitAI::DoAction
virtual void DoAction(int32)
Definition
UnitAI.h:126
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
WorldObject::FindNearestCreature
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition
Object.cpp:2801
WorldObject::SummonGameObject
GameObject * SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime)
Definition
Object.cpp:2729
WorldPacket
Definition
WorldPacket.h:16
boss_ossirian
Definition
boss_ossirian.cpp:71
boss_ossirian::GetAI
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Definition
boss_ossirian.cpp:265
boss_ossirian::boss_ossirian
boss_ossirian()
Definition
boss_ossirian.cpp:73
go_ossirian_crystal
Definition
boss_ossirian.cpp:272
go_ossirian_crystal::go_ossirian_crystal
go_ossirian_crystal()
Definition
boss_ossirian.cpp:274
go_ossirian_crystal::OnGossipHello
bool OnGossipHello(Player *player, GameObject *) OVERRIDE
Definition
boss_ossirian.cpp:276
SMSG_WEATHER
@ SMSG_WEATHER
Definition
Opcodes.h:1065
WEATHER_STATE_HEAVY_SANDSTORM
@ WEATHER_STATE_HEAVY_SANDSTORM
Definition
Weather.h:45
ruins_of_ahnqiraj.h
GO_OSSIRIAN_CRYSTAL
@ GO_OSSIRIAN_CRYSTAL
Definition
ruins_of_ahnqiraj.h:43
NPC_OSSIRIAN_TRIGGER
@ NPC_OSSIRIAN_TRIGGER
Definition
ruins_of_ahnqiraj.h:34
NPC_SAND_VORTEX
@ NPC_SAND_VORTEX
Definition
ruins_of_ahnqiraj.h:33
NPC_OSSIRIAN
@ NPC_OSSIRIAN
Definition
ruins_of_ahnqiraj.h:29
DATA_OSSIRIAN
@ DATA_OSSIRIAN
Definition
ruins_of_ahnqiraj.h:16
Position
Definition
Object.h:274
ScriptedAI::me
Creature * me
Definition
ScriptedCreature.h:182
boss_ossirian::boss_ossirianAI
Definition
boss_ossirian.cpp:76
boss_ossirian::boss_ossirianAI::SpawnNextCrystal
void SpawnNextCrystal()
Definition
boss_ossirian.cpp:176
boss_ossirian::boss_ossirianAI::CrystalIterator
uint8 CrystalIterator
Definition
boss_ossirian.cpp:84
boss_ossirian::boss_ossirianAI::UpdateAI
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
Definition
boss_ossirian.cpp:207
boss_ossirian::boss_ossirianAI::SaidIntro
bool SaidIntro
Definition
boss_ossirian.cpp:85
boss_ossirian::boss_ossirianAI::Reset
void Reset() OVERRIDE
Definition
boss_ossirian.cpp:87
boss_ossirian::boss_ossirianAI::EnterCombat
void EnterCombat(Unit *) OVERRIDE
Definition
boss_ossirian.cpp:116
boss_ossirian::boss_ossirianAI::DoAction
void DoAction(int32 action) OVERRIDE
Definition
boss_ossirian.cpp:108
boss_ossirian::boss_ossirianAI::SpellHit
void SpellHit(Unit *caster, SpellInfo const *spell) OVERRIDE
Definition
boss_ossirian.cpp:95
boss_ossirian::boss_ossirianAI::CrystalGUID
uint64 CrystalGUID
Definition
boss_ossirian.cpp:83
boss_ossirian::boss_ossirianAI::KilledUnit
void KilledUnit(Unit *) OVERRIDE
Definition
boss_ossirian.cpp:152
boss_ossirian::boss_ossirianAI::EnterEvadeMode
void EnterEvadeMode() OVERRIDE
Definition
boss_ossirian.cpp:157
boss_ossirian::boss_ossirianAI::Cleanup
void Cleanup()
Definition
boss_ossirian.cpp:170
boss_ossirian::boss_ossirianAI::MoveInLineOfSight
void MoveInLineOfSight(Unit *who) OVERRIDE
Definition
boss_ossirian.cpp:196
boss_ossirian::boss_ossirianAI::TriggerGUID
uint64 TriggerGUID
Definition
boss_ossirian.cpp:82
boss_ossirian::boss_ossirianAI::boss_ossirianAI
boss_ossirianAI(Creature *creature)
Definition
boss_ossirian.cpp:77
boss_ossirian::boss_ossirianAI::JustDied
void JustDied(Unit *) OVERRIDE
Definition
boss_ossirian.cpp:164
src
server
scripts
Kalimdor
RuinsOfAhnQiraj
boss_ossirian.cpp
Generated on
for Project SkyFire Core by
1.17.0