Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
instance_onyxias_lair.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: Instance_Onyxias_Lair
8
SD%Complete: 100
9
SDComment:
10
SDCategory: Onyxia's Lair
11
EndScriptData */
12
13
#include "
ScriptMgr.h
"
14
#include "
InstanceScript.h
"
15
#include "
Cell.h
"
16
#include "
CellImpl.h
"
17
#include "
GridNotifiers.h
"
18
#include "
GridNotifiersImpl.h
"
19
#include "
onyxias_lair.h
"
20
#include "
TemporarySummon.h
"
21
22
class
instance_onyxias_lair
:
public
InstanceMapScript
23
{
24
public
:
25
instance_onyxias_lair
() :
InstanceMapScript
(
"instance_onyxias_lair"
, 249) { }
26
27
InstanceScript
*
GetInstanceScript
(
InstanceMap
* map)
const
OVERRIDE
28
{
29
return
new
instance_onyxias_lair_InstanceMapScript
(map);
30
}
31
32
struct
instance_onyxias_lair_InstanceMapScript
:
public
InstanceScript
33
{
34
instance_onyxias_lair_InstanceMapScript
(
Map
* map) :
InstanceScript
(map) { }
35
36
//Eruption is a BFS graph problem
37
//One map to remember all floor, one map to keep floor that still need to erupt and one queue to know what needs to be removed
38
39
void
Initialize
()
OVERRIDE
40
{
41
SetBossNumber
(
EncounterCount
);
42
43
onyxiaGUID
= 0;
44
onyxiaLiftoffTimer
= 0;
45
manyWhelpsCounter
= 0;
46
eruptTimer
= 0;
47
48
achievManyWhelpsHandleIt
=
false
;
49
achievSheDeepBreathMore
=
true
;
50
}
51
52
void
OnCreatureCreate
(
Creature
* creature)
OVERRIDE
53
{
54
switch
(creature->GetEntry())
55
{
56
case
NPC_ONYXIA
:
57
onyxiaGUID
= creature->GetGUID();
58
break
;
59
}
60
}
61
62
void
OnGameObjectCreate
(
GameObject
* go)
OVERRIDE
63
{
64
if
((go->GetGOInfo()->displayId == 4392 || go->GetGOInfo()->displayId == 4472) && go->GetGOInfo()->trap.spellId == 17731)
65
{
66
FloorEruptionGUID
[0].insert(std::make_pair(go->GetGUID(), 0));
67
return
;
68
}
69
70
switch
(go->GetEntry())
71
{
72
case
GO_WHELP_SPAWNER
:
73
Position
goPos;
74
go->
GetPosition
(&goPos);
75
if
(
Creature
* temp = go->
SummonCreature
(
NPC_WHELP
, goPos,
TempSummonType::TEMPSUMMON_CORPSE_DESPAWN
))
76
{
77
temp->SetInCombatWithZone();
78
++
manyWhelpsCounter
;
79
}
80
break
;
81
}
82
}
83
84
void
OnGameObjectRemove
(
GameObject
* go)
OVERRIDE
85
{
86
if
((go->GetGOInfo()->displayId == 4392 || go->GetGOInfo()->displayId == 4472) && go->GetGOInfo()->trap.spellId == 17731)
87
{
88
FloorEruptionGUID
[0].erase(go->GetGUID());
89
return
;
90
}
91
}
92
93
void
FloorEruption
(
uint64
floorEruptedGUID)
94
{
95
if
(
GameObject
* floorEruption =
instance
->GetGameObject(floorEruptedGUID))
96
{
97
//THIS GOB IS A TRAP - What shall i do? =(
98
//Cast it spell? Copyed Heigan method
99
floorEruption->SendCustomAnim(floorEruption->GetGoAnimProgress());
100
floorEruption->CastSpell(NULL,
DifficultyID
(
instance
->GetSpawnMode()) ==
DIFFICULTY_10MAN_NORMAL
? 17731 : 69294);
//pFloorEruption->GetGOInfo()->trap.spellId
101
102
//Get all immediatly nearby floors
103
std::list<GameObject*> nearFloorList;
104
Skyfire::GameObjectInRangeCheck
check(floorEruption->GetPositionX(), floorEruption->GetPositionY(), floorEruption->GetPositionZ(), 15);
105
Skyfire::GameObjectListSearcher<Skyfire::GameObjectInRangeCheck>
searcher(floorEruption, nearFloorList, check);
106
floorEruption->VisitNearbyGridObject(999, searcher);
107
//remove all that are not present on FloorEruptionGUID[1] and update treeLen on each GUID
108
for
(std::list<GameObject*>::const_iterator itr = nearFloorList.begin(); itr != nearFloorList.end(); ++itr)
109
{
110
if
(((*itr)->GetGOInfo()->displayId == 4392 || (*itr)->GetGOInfo()->displayId == 4472) && (*itr)->GetGOInfo()->trap.spellId == 17731)
111
{
112
uint64
nearFloorGUID = (*itr)->GetGUID();
113
if
(
FloorEruptionGUID
[1].find(nearFloorGUID) !=
FloorEruptionGUID
[1].end() && (*
FloorEruptionGUID
[1].find(nearFloorGUID)).second == 0)
114
{
115
(*
FloorEruptionGUID
[1].find(nearFloorGUID)).second = (*
FloorEruptionGUID
[1].find(floorEruptedGUID)).second+1;
116
FloorEruptionGUIDQueue
.push(nearFloorGUID);
117
}
118
}
119
}
120
}
121
FloorEruptionGUID
[1].erase(floorEruptedGUID);
122
}
123
124
bool
SetBossState
(
uint32
type,
EncounterState
state)
OVERRIDE
125
{
126
if
(!
InstanceScript::SetBossState
(type, state))
127
return
false
;
128
129
switch
(type)
130
{
131
case
DATA_ONYXIA
:
132
if
(state ==
IN_PROGRESS
)
133
SetBossState
(
DATA_SHE_DEEP_BREATH_MORE
,
IN_PROGRESS
);
134
break
;
135
}
136
return
true
;
137
}
138
139
void
SetData
(
uint32
type,
uint32
data)
OVERRIDE
140
{
141
switch
(type)
142
{
143
case
DATA_ONYXIA_PHASE
:
144
if
(data ==
PHASE_BREATH
)
//Used to mark the liftoff phase
145
{
146
achievManyWhelpsHandleIt
=
false
;
147
manyWhelpsCounter
= 0;
148
onyxiaLiftoffTimer
= 10000;
149
}
150
break
;
151
case
DATA_SHE_DEEP_BREATH_MORE
:
152
if
(data ==
IN_PROGRESS
)
153
{
154
achievSheDeepBreathMore
=
true
;
155
}
156
else
if
(data ==
FAIL
)
157
{
158
achievSheDeepBreathMore
=
false
;
159
}
160
break
;
161
}
162
}
163
164
void
SetData64
(
uint32
type,
uint64
data)
OVERRIDE
165
{
166
switch
(type)
167
{
168
case
DATA_FLOOR_ERUPTION_GUID
:
169
FloorEruptionGUID
[1] =
FloorEruptionGUID
[0];
170
FloorEruptionGUIDQueue
.push(data);
171
eruptTimer
= 2500;
172
break
;
173
}
174
}
175
176
uint64
GetData64
(
uint32
data)
const
OVERRIDE
177
{
178
switch
(data)
179
{
180
case
NPC_ONYXIA
:
181
return
onyxiaGUID
;
182
}
183
184
return
0;
185
}
186
187
void
Update
(
uint32
diff)
OVERRIDE
188
{
189
if
(
GetBossState
(
DATA_ONYXIA
) ==
IN_PROGRESS
)
190
{
191
if
(
onyxiaLiftoffTimer
&&
onyxiaLiftoffTimer
<= diff)
192
{
193
onyxiaLiftoffTimer
= 0;
194
if
(
manyWhelpsCounter
>= 50)
195
achievManyWhelpsHandleIt
=
true
;
196
}
else
onyxiaLiftoffTimer
-= diff;
197
}
198
199
if
(!
FloorEruptionGUIDQueue
.empty())
200
{
201
if
(
eruptTimer
<= diff)
202
{
203
uint32
treeHeight = 0;
204
do
205
{
206
treeHeight = (*
FloorEruptionGUID
[1].find(
FloorEruptionGUIDQueue
.front())).second;
207
FloorEruption
(
FloorEruptionGUIDQueue
.front());
208
FloorEruptionGUIDQueue
.pop();
209
}
while
(!
FloorEruptionGUIDQueue
.empty() && (*
FloorEruptionGUID
[1].find(
FloorEruptionGUIDQueue
.front())).second == treeHeight);
210
eruptTimer
= 1000;
211
}
212
else
213
eruptTimer
-= diff;
214
}
215
}
216
217
bool
CheckAchievementCriteriaMeet
(
uint32
criteriaId,
Player
const
*
/*source*/
,
Unit
const
*
/*target = NULL*/
,
uint32
/*miscValue1 = 0*/
)
OVERRIDE
218
{
219
switch
(criteriaId)
220
{
221
case
ACHIEV_CRITERIA_MANY_WHELPS_10_PLAYER
:
// Criteria for achievement 4403: Many Whelps! Handle It! (10 player) Hatch 50 eggs in 10s
222
case
ACHIEV_CRITERIA_MANY_WHELPS_25_PLAYER
:
// Criteria for achievement 4406: Many Whelps! Handle It! (25 player) Hatch 50 eggs in 10s
223
return
achievManyWhelpsHandleIt
;
224
case
ACHIEV_CRITERIA_DEEP_BREATH_10_PLAYER
:
// Criteria for achievement 4404: She Deep Breaths More (10 player) Everybody evade Deep Breath
225
case
ACHIEV_CRITERIA_DEEP_BREATH_25_PLAYER
:
// Criteria for achievement 4407: She Deep Breaths More (25 player) Everybody evade Deep Breath
226
return
achievSheDeepBreathMore
;
227
}
228
return
false
;
229
}
230
231
std::string
GetSaveData
()
OVERRIDE
232
{
233
OUT_SAVE_INST_DATA
;
234
235
std::ostringstream saveStream;
236
saveStream <<
"O L "
<<
GetBossSaveData
();
237
238
OUT_SAVE_INST_DATA_COMPLETE
;
239
return
saveStream.str();
240
}
241
242
void
Load
(
const
char
* strIn)
OVERRIDE
243
{
244
if
(!strIn)
245
{
246
OUT_LOAD_INST_DATA_FAIL
;
247
return
;
248
}
249
250
OUT_LOAD_INST_DATA
(strIn);
251
252
char
dataHead1, dataHead2;
253
254
std::istringstream loadStream(strIn);
255
loadStream >> dataHead1 >> dataHead2;
256
257
if
(dataHead1 ==
'O'
&& dataHead2 ==
'L'
)
258
{
259
for
(
uint8
i = 0; i <
EncounterCount
; ++i)
260
{
261
uint32
tmpState;
262
loadStream >> tmpState;
263
if
(tmpState ==
IN_PROGRESS
|| tmpState >
SPECIAL
)
264
tmpState =
NOT_STARTED
;
265
266
SetBossState
(i,
EncounterState
(tmpState));
267
}
268
}
269
else
270
OUT_LOAD_INST_DATA_FAIL
;
271
272
OUT_LOAD_INST_DATA_COMPLETE
;
273
}
274
275
protected
:
276
std::map<uint64, uint32>
FloorEruptionGUID
[2];
277
std::queue<uint64>
FloorEruptionGUIDQueue
;
278
uint64
onyxiaGUID
;
279
uint32
onyxiaLiftoffTimer
;
280
uint32
manyWhelpsCounter
;
281
uint32
eruptTimer
;
282
bool
achievManyWhelpsHandleIt
;
283
bool
achievSheDeepBreathMore
;
284
};
285
};
286
287
void
AddSC_instance_onyxias_lair
()
288
{
289
new
instance_onyxias_lair
();
290
}
Cell.h
CellImpl.h
DifficultyID
DifficultyID
Definition
DBCEnums.h:330
DIFFICULTY_10MAN_NORMAL
@ DIFFICULTY_10MAN_NORMAL
Definition
DBCEnums.h:334
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
GridNotifiers.h
GridNotifiersImpl.h
InstanceScript.h
OUT_LOAD_INST_DATA_FAIL
#define OUT_LOAD_INST_DATA_FAIL
Definition
InstanceScript.h:18
EncounterState
EncounterState
Definition
InstanceScript.h:45
IN_PROGRESS
@ IN_PROGRESS
Definition
InstanceScript.h:47
FAIL
@ FAIL
Definition
InstanceScript.h:48
SPECIAL
@ SPECIAL
Definition
InstanceScript.h:50
NOT_STARTED
@ NOT_STARTED
Definition
InstanceScript.h:46
OUT_SAVE_INST_DATA_COMPLETE
#define OUT_SAVE_INST_DATA_COMPLETE
Definition
InstanceScript.h:15
OUT_LOAD_INST_DATA_COMPLETE
#define OUT_LOAD_INST_DATA_COMPLETE
Definition
InstanceScript.h:17
OUT_SAVE_INST_DATA
#define OUT_SAVE_INST_DATA
Definition
InstanceScript.h:14
OUT_LOAD_INST_DATA
#define OUT_LOAD_INST_DATA(a)
Definition
InstanceScript.h:16
TempSummonType::TEMPSUMMON_CORPSE_DESPAWN
@ TEMPSUMMON_CORPSE_DESPAWN
Definition
Object.h:72
ScriptMgr.h
TemporarySummon.h
EncounterCount
uint32 const EncounterCount
Definition
baradin_hold.h:15
GO_WHELP_SPAWNER
@ GO_WHELP_SPAWNER
Definition
blackrock_spire.h:76
Creature
Definition
Creature.h:427
GameObject
Definition
GameObject.h:629
InstanceMap
Definition
Map.h:637
InstanceMapScript::InstanceMapScript
InstanceMapScript(const char *name, uint32 mapId)
Definition
ScriptMgr.cpp:1412
InstanceScript
Definition
InstanceScript.h:123
InstanceScript::InstanceScript
InstanceScript(Map *map)
Definition
InstanceScript.h:125
InstanceScript::SetBossNumber
void SetBossNumber(uint32 number)
Definition
InstanceScript.h:212
InstanceScript::SetBossState
virtual bool SetBossState(uint32 id, EncounterState state)
Definition
InstanceScript.cpp:182
InstanceScript::instance
Map * instance
Definition
InstanceScript.h:129
InstanceScript::GetBossSaveData
std::string GetBossSaveData()
Definition
InstanceScript.cpp:239
InstanceScript::GetBossState
EncounterState GetBossState(uint32 id) const
Definition
InstanceScript.h:185
Map
Definition
Map.h:238
Player
Definition
Player.h:1289
Skyfire::GameObjectInRangeCheck
Definition
GridNotifiers.h:1335
Unit
Definition
Unit.h:1367
WorldObject::SummonCreature
TempSummon * SummonCreature(uint32 id, Position const &pos, TempSummonType spwtype=TempSummonType::TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0) const
Definition
Object.cpp:2703
instance_onyxias_lair
Definition
instance_onyxias_lair.cpp:23
instance_onyxias_lair::instance_onyxias_lair
instance_onyxias_lair()
Definition
instance_onyxias_lair.cpp:25
instance_onyxias_lair::GetInstanceScript
InstanceScript * GetInstanceScript(InstanceMap *map) const OVERRIDE
Definition
instance_onyxias_lair.cpp:27
AddSC_instance_onyxias_lair
void AddSC_instance_onyxias_lair()
Definition
instance_onyxias_lair.cpp:287
onyxias_lair.h
PHASE_BREATH
@ PHASE_BREATH
Definition
onyxias_lair.h:32
DATA_FLOOR_ERUPTION_GUID
@ DATA_FLOOR_ERUPTION_GUID
Definition
onyxias_lair.h:26
DATA_SHE_DEEP_BREATH_MORE
@ DATA_SHE_DEEP_BREATH_MORE
Definition
onyxias_lair.h:19
DATA_ONYXIA_PHASE
@ DATA_ONYXIA_PHASE
Definition
onyxias_lair.h:18
NPC_WHELP
@ NPC_WHELP
Definition
onyxias_lair.h:38
NPC_ONYXIA
@ NPC_ONYXIA
Definition
onyxias_lair.h:40
ACHIEV_CRITERIA_MANY_WHELPS_10_PLAYER
@ ACHIEV_CRITERIA_MANY_WHELPS_10_PLAYER
Definition
onyxias_lair.h:51
ACHIEV_CRITERIA_DEEP_BREATH_25_PLAYER
@ ACHIEV_CRITERIA_DEEP_BREATH_25_PLAYER
Definition
onyxias_lair.h:54
ACHIEV_CRITERIA_DEEP_BREATH_10_PLAYER
@ ACHIEV_CRITERIA_DEEP_BREATH_10_PLAYER
Definition
onyxias_lair.h:53
ACHIEV_CRITERIA_MANY_WHELPS_25_PLAYER
@ ACHIEV_CRITERIA_MANY_WHELPS_25_PLAYER
Definition
onyxias_lair.h:52
DATA_ONYXIA
@ DATA_ONYXIA
Definition
onyxias_lair.h:13
Position
Definition
Object.h:274
Position::GetPosition
void GetPosition(float &x, float &y) const
Definition
Object.h:333
Skyfire::GameObjectListSearcher
Definition
GridNotifiers.h:325
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript
Definition
instance_onyxias_lair.cpp:33
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::SetData64
void SetData64(uint32 type, uint64 data) OVERRIDE
Definition
instance_onyxias_lair.cpp:164
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::achievSheDeepBreathMore
bool achievSheDeepBreathMore
Definition
instance_onyxias_lair.cpp:283
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::manyWhelpsCounter
uint32 manyWhelpsCounter
Definition
instance_onyxias_lair.cpp:280
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::instance_onyxias_lair_InstanceMapScript
instance_onyxias_lair_InstanceMapScript(Map *map)
Definition
instance_onyxias_lair.cpp:34
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::onyxiaGUID
uint64 onyxiaGUID
Definition
instance_onyxias_lair.cpp:278
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::CheckAchievementCriteriaMeet
bool CheckAchievementCriteriaMeet(uint32 criteriaId, Player const *, Unit const *, uint32) OVERRIDE
Definition
instance_onyxias_lair.cpp:217
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::FloorEruptionGUIDQueue
std::queue< uint64 > FloorEruptionGUIDQueue
Definition
instance_onyxias_lair.cpp:277
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::eruptTimer
uint32 eruptTimer
Definition
instance_onyxias_lair.cpp:281
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::OnGameObjectCreate
void OnGameObjectCreate(GameObject *go) OVERRIDE
Definition
instance_onyxias_lair.cpp:62
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::SetData
void SetData(uint32 type, uint32 data) OVERRIDE
Definition
instance_onyxias_lair.cpp:139
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::FloorEruptionGUID
std::map< uint64, uint32 > FloorEruptionGUID[2]
Definition
instance_onyxias_lair.cpp:276
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::achievManyWhelpsHandleIt
bool achievManyWhelpsHandleIt
Definition
instance_onyxias_lair.cpp:282
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::FloorEruption
void FloorEruption(uint64 floorEruptedGUID)
Definition
instance_onyxias_lair.cpp:93
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::Initialize
void Initialize() OVERRIDE
Definition
instance_onyxias_lair.cpp:39
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::GetData64
uint64 GetData64(uint32 data) const OVERRIDE
Definition
instance_onyxias_lair.cpp:176
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::GetSaveData
std::string GetSaveData() OVERRIDE
Definition
instance_onyxias_lair.cpp:231
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::SetBossState
bool SetBossState(uint32 type, EncounterState state) OVERRIDE
Definition
instance_onyxias_lair.cpp:124
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::OnGameObjectRemove
void OnGameObjectRemove(GameObject *go) OVERRIDE
Definition
instance_onyxias_lair.cpp:84
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::Update
void Update(uint32 diff) OVERRIDE
Definition
instance_onyxias_lair.cpp:187
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::Load
void Load(const char *strIn) OVERRIDE
Definition
instance_onyxias_lair.cpp:242
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::onyxiaLiftoffTimer
uint32 onyxiaLiftoffTimer
Definition
instance_onyxias_lair.cpp:279
instance_onyxias_lair::instance_onyxias_lair_InstanceMapScript::OnCreatureCreate
void OnCreatureCreate(Creature *creature) OVERRIDE
Definition
instance_onyxias_lair.cpp:52
src
server
scripts
Kalimdor
OnyxiasLair
instance_onyxias_lair.cpp
Generated on
for Project SkyFire Core by
1.17.0