Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
instance_sunwell_plateau.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_Sunwell_Plateau
8
SD%Complete: 25
9
SDComment: VERIFY SCRIPT
10
SDCategory: Sunwell_Plateau
11
EndScriptData */
12
13
#include "
ScriptMgr.h
"
14
#include "
InstanceScript.h
"
15
#include "
sunwell_plateau.h
"
16
#include "
Player.h
"
17
18
#define MAX_ENCOUNTER 6
19
20
/* Sunwell Plateau:
21
0 - Kalecgos and Sathrovarr
22
1 - Brutallus
23
2 - Felmyst
24
3 - Eredar Twins (Alythess and Sacrolash)
25
4 - M'uru
26
5 - Kil'Jaeden
27
*/
28
29
class
instance_sunwell_plateau
:
public
InstanceMapScript
30
{
31
public
:
32
instance_sunwell_plateau
() :
InstanceMapScript
(
"instance_sunwell_plateau"
, 580) { }
33
34
InstanceScript
*
GetInstanceScript
(
InstanceMap
* map)
const
OVERRIDE
35
{
36
return
new
instance_sunwell_plateau_InstanceMapScript
(map);
37
}
38
39
struct
instance_sunwell_plateau_InstanceMapScript
:
public
InstanceScript
40
{
41
instance_sunwell_plateau_InstanceMapScript
(
Map
* map) :
InstanceScript
(map) { }
42
43
uint32
m_auiEncounter
[
MAX_ENCOUNTER
];
44
46
uint64
Kalecgos_Dragon
;
47
uint64
Kalecgos_Human
;
48
uint64
Sathrovarr
;
49
uint64
Brutallus
;
50
uint64
Madrigosa
;
51
uint64
Felmyst
;
52
uint64
Alythess
;
53
uint64
Sacrolash
;
54
uint64
Muru
;
55
uint64
KilJaeden
;
56
uint64
KilJaedenController
;
57
uint64
Anveena
;
58
uint64
KalecgosKJ
;
59
uint32
SpectralPlayers
;
60
62
uint64
ForceField
;
// Kalecgos Encounter
63
uint64
KalecgosWall
[2];
64
uint64
FireBarrier
;
// Felmysts Encounter
65
uint64
MurusGate
[2];
// Murus Encounter
66
67
/*** Misc ***/
68
uint32
SpectralRealmTimer
;
69
std::vector<uint64>
SpectralRealmList
;
70
71
void
Initialize
()
OVERRIDE
72
{
73
memset(&
m_auiEncounter
, 0,
sizeof
(
m_auiEncounter
));
74
75
/*** Creatures ***/
76
Kalecgos_Dragon
= 0;
77
Kalecgos_Human
= 0;
78
Sathrovarr
= 0;
79
Brutallus
= 0;
80
Madrigosa
= 0;
81
Felmyst
= 0;
82
Alythess
= 0;
83
Sacrolash
= 0;
84
Muru
= 0;
85
KilJaeden
= 0;
86
KilJaedenController
= 0;
87
Anveena
= 0;
88
KalecgosKJ
= 0;
89
SpectralPlayers
= 0;
90
91
/*** GameObjects ***/
92
ForceField
= 0;
93
FireBarrier
= 0;
94
MurusGate
[0] = 0;
95
MurusGate
[1] = 0;
96
KalecgosWall
[0] = 0;
97
KalecgosWall
[1] = 0;
98
99
/*** Misc ***/
100
SpectralRealmTimer
= 5000;
101
}
102
103
bool
IsEncounterInProgress
() const
OVERRIDE
104
{
105
for
(
uint8
i = 0; i <
MAX_ENCOUNTER
; ++i)
106
if
(
m_auiEncounter
[i] ==
IN_PROGRESS
)
107
return
true
;
108
109
return
false
;
110
}
111
112
Player
const
*
GetPlayerInMap
()
const
113
{
114
Map::PlayerList
const
& players =
instance
->GetPlayers();
115
116
if
(!players.
isEmpty
())
117
{
118
for
(
Map::PlayerList::const_iterator
itr = players.
begin
(); itr != players.
end
(); ++itr)
119
{
120
Player
* player = itr->GetSource();
121
if
(player && !player->
HasAura
(45839, 0))
122
return
player;
123
}
124
}
125
else
126
SF_LOG_DEBUG
(
"scripts"
,
"Instance Sunwell Plateau: GetPlayerInMap, but PlayerList is empty!"
);
127
128
return
NULL;
129
}
130
131
void
OnCreatureCreate
(
Creature
* creature)
OVERRIDE
132
{
133
switch
(creature->GetEntry())
134
{
135
case
24850:
Kalecgos_Dragon
= creature->GetGUID();
break
;
136
case
24891:
Kalecgos_Human
= creature->GetGUID();
break
;
137
case
24892:
Sathrovarr
= creature->GetGUID();
break
;
138
case
24882:
Brutallus
= creature->GetGUID();
break
;
139
case
24895:
Madrigosa
= creature->GetGUID();
break
;
140
case
25038:
Felmyst
= creature->GetGUID();
break
;
141
case
25166:
Alythess
= creature->GetGUID();
break
;
142
case
25165:
Sacrolash
= creature->GetGUID();
break
;
143
case
25741:
Muru
= creature->GetGUID();
break
;
144
case
25315:
KilJaeden
= creature->GetGUID();
break
;
145
case
25608:
KilJaedenController
= creature->GetGUID();
break
;
146
case
26046:
Anveena
= creature->GetGUID();
break
;
147
case
25319:
KalecgosKJ
= creature->GetGUID();
break
;
148
}
149
}
150
151
void
OnGameObjectCreate
(
GameObject
* go)
OVERRIDE
152
{
153
switch
(go->GetEntry())
154
{
155
case
188421:
ForceField
= go->GetGUID();
break
;
156
case
188523:
KalecgosWall
[0] = go->GetGUID();
break
;
157
case
188524:
KalecgosWall
[0] = go->GetGUID();
break
;
158
case
188075:
159
if
(
m_auiEncounter
[2] ==
DONE
)
160
HandleGameObject
(0,
true
, go);
161
FireBarrier
= go->GetGUID();
162
break
;
163
case
187990:
MurusGate
[0] = go->GetGUID();
break
;
164
case
188118:
165
if
(
m_auiEncounter
[4] ==
DONE
)
166
HandleGameObject
(0,
true
, go);
167
MurusGate
[1]= go->GetGUID();
168
break
;
169
}
170
}
171
172
uint32
GetData
(
uint32
id
)
const
OVERRIDE
173
{
174
switch
(
id
)
175
{
176
case
DATA_KALECGOS_EVENT
:
return
m_auiEncounter
[0];
177
case
DATA_BRUTALLUS_EVENT
:
return
m_auiEncounter
[1];
178
case
DATA_FELMYST_EVENT
:
return
m_auiEncounter
[2];
179
case
DATA_EREDAR_TWINS_EVENT
:
return
m_auiEncounter
[3];
180
case
DATA_MURU_EVENT
:
return
m_auiEncounter
[4];
181
case
DATA_KILJAEDEN_EVENT
:
return
m_auiEncounter
[5];
182
}
183
return
0;
184
}
185
186
uint64
GetData64
(
uint32
id
)
const
OVERRIDE
187
{
188
switch
(
id
)
189
{
190
case
DATA_KALECGOS_DRAGON
:
return
Kalecgos_Dragon
;
191
case
DATA_KALECGOS_HUMAN
:
return
Kalecgos_Human
;
192
case
DATA_SATHROVARR
:
return
Sathrovarr
;
193
case
DATA_GO_FORCEFIELD
:
return
ForceField
;
194
case
DATA_BRUTALLUS
:
return
Brutallus
;
195
case
DATA_MADRIGOSA
:
return
Madrigosa
;
196
case
DATA_FELMYST
:
return
Felmyst
;
197
case
DATA_ALYTHESS
:
return
Alythess
;
198
case
DATA_SACROLASH
:
return
Sacrolash
;
199
case
DATA_MURU
:
return
Muru
;
200
case
DATA_KILJAEDEN
:
return
KilJaeden
;
201
case
DATA_KILJAEDEN_CONTROLLER
:
return
KilJaedenController
;
202
case
DATA_ANVEENA
:
return
Anveena
;
203
case
DATA_KALECGOS_KJ
:
return
KalecgosKJ
;
204
case
DATA_PLAYER_GUID
:
205
Player
const
* target =
GetPlayerInMap
();
206
return
target ? target->
GetGUID
() : 0;
207
}
208
return
0;
209
}
210
211
void
SetData
(
uint32
id
,
uint32
data)
OVERRIDE
212
{
213
switch
(
id
)
214
{
215
case
DATA_KALECGOS_EVENT
:
216
{
217
if
(data ==
NOT_STARTED
|| data ==
DONE
)
218
{
219
HandleGameObject
(
ForceField
,
true
);
220
HandleGameObject
(
KalecgosWall
[0],
true
);
221
HandleGameObject
(
KalecgosWall
[1],
true
);
222
}
223
else
if
(data ==
IN_PROGRESS
)
224
{
225
HandleGameObject
(
ForceField
,
false
);
226
HandleGameObject
(
KalecgosWall
[0],
false
);
227
HandleGameObject
(
KalecgosWall
[1],
false
);
228
}
229
m_auiEncounter
[0] = data;
230
}
231
break
;
232
case
DATA_BRUTALLUS_EVENT
:
m_auiEncounter
[1] = data;
break
;
233
case
DATA_FELMYST_EVENT
:
234
if
(data ==
DONE
)
235
HandleGameObject
(
FireBarrier
,
true
);
236
m_auiEncounter
[2] = data;
break
;
237
case
DATA_EREDAR_TWINS_EVENT
:
m_auiEncounter
[3] = data;
break
;
238
case
DATA_MURU_EVENT
:
239
switch
(data)
240
{
241
case
DONE
:
242
HandleGameObject
(
MurusGate
[0],
true
);
243
HandleGameObject
(
MurusGate
[1],
true
);
244
break
;
245
case
IN_PROGRESS
:
246
HandleGameObject
(
MurusGate
[0],
false
);
247
HandleGameObject
(
MurusGate
[1],
false
);
248
break
;
249
case
NOT_STARTED
:
250
HandleGameObject
(
MurusGate
[0],
true
);
251
HandleGameObject
(
MurusGate
[1],
false
);
252
break
;
253
}
254
m_auiEncounter
[4] = data;
break
;
255
case
DATA_KILJAEDEN_EVENT
:
m_auiEncounter
[5] = data;
break
;
256
}
257
258
if
(data ==
DONE
)
259
SaveToDB
();
260
}
261
262
std::string
GetSaveData
()
OVERRIDE
263
{
264
OUT_SAVE_INST_DATA
;
265
std::ostringstream stream;
266
stream <<
m_auiEncounter
[0] <<
' '
<<
m_auiEncounter
[1] <<
' '
<<
m_auiEncounter
[2] <<
' '
<<
m_auiEncounter
[3] <<
' '
267
<<
m_auiEncounter
[4] <<
' '
<<
m_auiEncounter
[5];
268
269
OUT_SAVE_INST_DATA_COMPLETE
;
270
return
stream.str();
271
}
272
273
void
Load
(
char
const
* in)
OVERRIDE
274
{
275
if
(!in)
276
{
277
OUT_LOAD_INST_DATA_FAIL
;
278
return
;
279
}
280
281
OUT_LOAD_INST_DATA
(in);
282
std::istringstream stream(in);
283
stream >>
m_auiEncounter
[0] >>
m_auiEncounter
[1] >>
m_auiEncounter
[2] >>
m_auiEncounter
[3]
284
>>
m_auiEncounter
[4] >>
m_auiEncounter
[5];
285
for
(
uint8
i = 0; i <
MAX_ENCOUNTER
; ++i)
286
if
(
m_auiEncounter
[i] ==
IN_PROGRESS
)
// Do not load an encounter as "In Progress" - reset it instead.
287
m_auiEncounter
[i] =
NOT_STARTED
;
288
OUT_LOAD_INST_DATA_COMPLETE
;
289
}
290
};
291
};
292
293
void
AddSC_instance_sunwell_plateau
()
294
{
295
new
instance_sunwell_plateau
();
296
}
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
InstanceScript.h
OUT_LOAD_INST_DATA_FAIL
#define OUT_LOAD_INST_DATA_FAIL
Definition
InstanceScript.h:18
IN_PROGRESS
@ IN_PROGRESS
Definition
InstanceScript.h:47
DONE
@ DONE
Definition
InstanceScript.h:49
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
SF_LOG_DEBUG
#define SF_LOG_DEBUG(filterType__,...)
Definition
Log.h:134
Player.h
ScriptMgr.h
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::instance
Map * instance
Definition
InstanceScript.h:129
InstanceScript::SaveToDB
void SaveToDB()
Definition
InstanceScript.cpp:20
InstanceScript::HandleGameObject
void HandleGameObject(uint64 guid, bool open, GameObject *go=NULL)
Definition
InstanceScript.cpp:33
LinkedListHead::isEmpty
bool isEmpty() const
Definition
LinkedList.h:86
Map
Definition
Map.h:238
Map::PlayerList
MapRefManager PlayerList
Definition
Map.h:406
MapRefManager::end
iterator end()
Definition
MapRefManager.h:25
MapRefManager::begin
iterator begin()
Definition
MapRefManager.h:24
MapRefManager::const_iterator
LinkedListHead::Iterator< MapReference const > const_iterator
Definition
MapRefManager.h:17
Object::GetGUID
uint64 GetGUID() const
Definition
Object.h:119
Player
Definition
Player.h:1289
Unit::HasAura
bool HasAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
Definition
UnitAuraState.cpp:1182
instance_sunwell_plateau
Definition
instance_sunwell_plateau.cpp:30
instance_sunwell_plateau::instance_sunwell_plateau
instance_sunwell_plateau()
Definition
instance_sunwell_plateau.cpp:32
instance_sunwell_plateau::GetInstanceScript
InstanceScript * GetInstanceScript(InstanceMap *map) const OVERRIDE
Definition
instance_sunwell_plateau.cpp:34
AddSC_instance_sunwell_plateau
void AddSC_instance_sunwell_plateau()
Definition
instance_sunwell_plateau.cpp:293
MAX_ENCOUNTER
#define MAX_ENCOUNTER
Definition
instance_sunwell_plateau.cpp:18
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript
Definition
instance_sunwell_plateau.cpp:40
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::GetData
uint32 GetData(uint32 id) const OVERRIDE
Definition
instance_sunwell_plateau.cpp:172
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::FireBarrier
uint64 FireBarrier
Definition
instance_sunwell_plateau.cpp:64
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::SpectralPlayers
uint32 SpectralPlayers
Definition
instance_sunwell_plateau.cpp:59
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::KilJaedenController
uint64 KilJaedenController
Definition
instance_sunwell_plateau.cpp:56
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Alythess
uint64 Alythess
Definition
instance_sunwell_plateau.cpp:52
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::ForceField
uint64 ForceField
Definition
instance_sunwell_plateau.cpp:62
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::MurusGate
uint64 MurusGate[2]
Definition
instance_sunwell_plateau.cpp:65
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Initialize
void Initialize() OVERRIDE
Definition
instance_sunwell_plateau.cpp:71
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::KilJaeden
uint64 KilJaeden
Definition
instance_sunwell_plateau.cpp:55
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::SetData
void SetData(uint32 id, uint32 data) OVERRIDE
Definition
instance_sunwell_plateau.cpp:211
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::SpectralRealmTimer
uint32 SpectralRealmTimer
Definition
instance_sunwell_plateau.cpp:68
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::SpectralRealmList
std::vector< uint64 > SpectralRealmList
Definition
instance_sunwell_plateau.cpp:69
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Brutallus
uint64 Brutallus
Definition
instance_sunwell_plateau.cpp:49
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Sathrovarr
uint64 Sathrovarr
Definition
instance_sunwell_plateau.cpp:48
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Felmyst
uint64 Felmyst
Definition
instance_sunwell_plateau.cpp:51
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::KalecgosKJ
uint64 KalecgosKJ
Definition
instance_sunwell_plateau.cpp:58
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Anveena
uint64 Anveena
Definition
instance_sunwell_plateau.cpp:57
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::GetData64
uint64 GetData64(uint32 id) const OVERRIDE
Definition
instance_sunwell_plateau.cpp:186
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::KalecgosWall
uint64 KalecgosWall[2]
Definition
instance_sunwell_plateau.cpp:63
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::GetSaveData
std::string GetSaveData() OVERRIDE
Definition
instance_sunwell_plateau.cpp:262
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Kalecgos_Human
uint64 Kalecgos_Human
Definition
instance_sunwell_plateau.cpp:47
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::IsEncounterInProgress
bool IsEncounterInProgress() const OVERRIDE
Definition
instance_sunwell_plateau.cpp:103
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Muru
uint64 Muru
Definition
instance_sunwell_plateau.cpp:54
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::instance_sunwell_plateau_InstanceMapScript
instance_sunwell_plateau_InstanceMapScript(Map *map)
Definition
instance_sunwell_plateau.cpp:41
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::GetPlayerInMap
Player const * GetPlayerInMap() const
Definition
instance_sunwell_plateau.cpp:112
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Load
void Load(char const *in) OVERRIDE
Definition
instance_sunwell_plateau.cpp:273
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Sacrolash
uint64 Sacrolash
Definition
instance_sunwell_plateau.cpp:53
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::m_auiEncounter
uint32 m_auiEncounter[MAX_ENCOUNTER]
Definition
instance_sunwell_plateau.cpp:43
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Madrigosa
uint64 Madrigosa
Definition
instance_sunwell_plateau.cpp:50
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::OnCreatureCreate
void OnCreatureCreate(Creature *creature) OVERRIDE
Definition
instance_sunwell_plateau.cpp:131
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::Kalecgos_Dragon
uint64 Kalecgos_Dragon
Definition
instance_sunwell_plateau.cpp:46
instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::OnGameObjectCreate
void OnGameObjectCreate(GameObject *go) OVERRIDE
Definition
instance_sunwell_plateau.cpp:151
sunwell_plateau.h
DATA_KILJAEDEN_CONTROLLER
@ DATA_KILJAEDEN_CONTROLLER
Definition
sunwell_plateau.h:33
DATA_BRUTALLUS
@ DATA_BRUTALLUS
Definition
sunwell_plateau.h:26
DATA_MURU
@ DATA_MURU
Definition
sunwell_plateau.h:31
DATA_SATHROVARR
@ DATA_SATHROVARR
Definition
sunwell_plateau.h:25
DATA_KILJAEDEN
@ DATA_KILJAEDEN
Definition
sunwell_plateau.h:32
DATA_FELMYST
@ DATA_FELMYST
Definition
sunwell_plateau.h:28
DATA_ALYTHESS
@ DATA_ALYTHESS
Definition
sunwell_plateau.h:29
DATA_ANVEENA
@ DATA_ANVEENA
Definition
sunwell_plateau.h:34
DATA_KALECGOS_HUMAN
@ DATA_KALECGOS_HUMAN
Definition
sunwell_plateau.h:24
DATA_GO_FORCEFIELD
@ DATA_GO_FORCEFIELD
Definition
sunwell_plateau.h:38
DATA_SACROLASH
@ DATA_SACROLASH
Definition
sunwell_plateau.h:30
DATA_KALECGOS_DRAGON
@ DATA_KALECGOS_DRAGON
Definition
sunwell_plateau.h:23
DATA_PLAYER_GUID
@ DATA_PLAYER_GUID
Definition
sunwell_plateau.h:45
DATA_KALECGOS_KJ
@ DATA_KALECGOS_KJ
Definition
sunwell_plateau.h:35
DATA_MADRIGOSA
@ DATA_MADRIGOSA
Definition
sunwell_plateau.h:27
DATA_MURU_EVENT
@ DATA_MURU_EVENT
Definition
sunwell_plateau.h:16
DATA_FELMYST_EVENT
@ DATA_FELMYST_EVENT
Definition
sunwell_plateau.h:14
DATA_KALECGOS_EVENT
@ DATA_KALECGOS_EVENT
Definition
sunwell_plateau.h:12
DATA_EREDAR_TWINS_EVENT
@ DATA_EREDAR_TWINS_EVENT
Definition
sunwell_plateau.h:15
DATA_BRUTALLUS_EVENT
@ DATA_BRUTALLUS_EVENT
Definition
sunwell_plateau.h:13
DATA_KILJAEDEN_EVENT
@ DATA_KILJAEDEN_EVENT
Definition
sunwell_plateau.h:17
src
server
scripts
EasternKingdoms
SunwellPlateau
instance_sunwell_plateau.cpp
Generated on
for Project SkyFire Core by
1.17.0