Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
instance_karazhan.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: Instance_Karazhan
8SD%Complete: 70
9SDComment: Instance Script for Karazhan to help in various encounters. @todo GameObject visibility for Opera event.
10SDCategory: Karazhan
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "InstanceScript.h"
15#include "karazhan.h"
16
17#define MAX_ENCOUNTER 12
18
19/*
200 - Attumen + Midnight (optional)
211 - Moroes
222 - Maiden of Virtue (optional)
233 - Hyakiss the Lurker / Rokad the Ravager / Shadikith the Glider
244 - Opera Event
255 - Curator
266 - Shade of Aran (optional)
277 - Terestian Illhoof (optional)
288 - Netherspite (optional)
299 - Chess Event
3010 - Prince Malchezzar
3111 - Nightbane
32*/
33
35{
36public:
37 instance_karazhan() : InstanceMapScript("instance_karazhan", 532) { }
38
43
45 {
47
49 std::string strSaveData;
50
53
60 uint64 m_uiLibraryDoor; // Door at Shade of Aran
61 uint64 m_uiMassiveDoor; // Door at Netherspite
62 uint64 m_uiSideEntranceDoor; // Side Entrance
63 uint64 m_uiGamesmansDoor; // Door before Chess
64 uint64 m_uiGamesmansExitDoor; // Door after Chess
65 uint64 m_uiNetherspaceDoor; // Door at Malchezaar
69
71 {
72 memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
73
74 // 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered.
75 m_uiOperaEvent = std::rand() % 3 + 1;
77
81
85
94 ImageGUID = 0;
96 }
97
99 {
100 for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
101 if (m_auiEncounter[i] == IN_PROGRESS)
102 return true;
103
104 return false;
105 }
106
108 {
109 switch (creature->GetEntry())
110 {
111 case 17229: m_uiKilrekGUID = creature->GetGUID(); break;
112 case 15688: m_uiTerestianGUID = creature->GetGUID(); break;
113 case 15687: m_uiMoroesGUID = creature->GetGUID(); break;
114 }
115 }
116
117 void SetData(uint32 type, uint32 uiData) OVERRIDE
118 {
119 switch (type)
120 {
121 case TYPE_ATTUMEN: m_auiEncounter[0] = uiData; break;
122 case TYPE_MOROES:
123 if (m_auiEncounter[1] == DONE)
124 break;
125 m_auiEncounter[1] = uiData;
126 break;
127 case TYPE_MAIDEN: m_auiEncounter[2] = uiData; break;
128 case TYPE_OPTIONAL_BOSS: m_auiEncounter[3] = uiData; break;
129 case TYPE_OPERA:
130 m_auiEncounter[4] = uiData;
131 if (uiData == DONE)
133 break;
134 case TYPE_CURATOR: m_auiEncounter[5] = uiData; break;
135 case TYPE_ARAN: m_auiEncounter[6] = uiData; break;
136 case TYPE_TERESTIAN: m_auiEncounter[7] = uiData; break;
137 case TYPE_NETHERSPITE: m_auiEncounter[8] = uiData; break;
138 case TYPE_CHESS:
139 if (uiData == DONE)
141 m_auiEncounter[9] = uiData;
142 break;
143 case TYPE_MALCHEZZAR: m_auiEncounter[10] = uiData; break;
144 case TYPE_NIGHTBANE:
145 if (m_auiEncounter[11] != DONE)
146 m_auiEncounter[11] = uiData;
147 break;
149 if (uiData == SPECIAL)
151 else if (uiData == IN_PROGRESS)
153 break;
154 }
155
156 if (uiData == DONE)
157 {
159
160 std::ostringstream saveStream;
161 saveStream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' '
162 << m_auiEncounter[3] << ' ' << m_auiEncounter[4] << ' ' << m_auiEncounter[5] << ' ' << m_auiEncounter[6] << ' '
163 << m_auiEncounter[7] << ' ' << m_auiEncounter[8] << ' ' << m_auiEncounter[9] << ' ' << m_auiEncounter[10] << ' ' << m_auiEncounter[11];
164
165 strSaveData = saveStream.str();
166
167 SaveToDB();
169 }
170 }
171
172 void SetData64(uint32 identifier, uint64 data) OVERRIDE
173 {
174 switch (identifier)
175 {
176 case DATA_IMAGE_OF_MEDIVH: ImageGUID = data;
177 }
178 }
179
181 {
182 switch (go->GetEntry())
183 {
184 case 183932: m_uiCurtainGUID = go->GetGUID(); break;
185 case 184278:
186 m_uiStageDoorLeftGUID = go->GetGUID();
187 if (m_auiEncounter[4] == DONE)
188 go->SetGoState(GOState::GO_STATE_ACTIVE);
189 break;
190 case 184279:
191 m_uiStageDoorRightGUID = go->GetGUID();
192 if (m_auiEncounter[4] == DONE)
193 go->SetGoState(GOState::GO_STATE_ACTIVE);
194 break;
195 case 184517: m_uiLibraryDoor = go->GetGUID(); break;
196 case 185521: m_uiMassiveDoor = go->GetGUID(); break;
197 case 184276: m_uiGamesmansDoor = go->GetGUID(); break;
198 case 184277: m_uiGamesmansExitDoor = go->GetGUID(); break;
199 case 185134: m_uiNetherspaceDoor = go->GetGUID(); break;
200 case 184274: MastersTerraceDoor[0] = go->GetGUID(); break;
201 case 184280: MastersTerraceDoor[1] = go->GetGUID(); break;
202 case 184275:
203 m_uiSideEntranceDoor = go->GetGUID();
204 if (m_auiEncounter[4] == DONE)
206 else
207 go->RemoveFlag(GAMEOBJECT_FIELD_FLAGS, GO_FLAG_LOCKED);
208 break;
209 case 185119: DustCoveredChest = go->GetGUID(); break;
210 }
211
212 switch (m_uiOperaEvent)
213 {
215 case EVENT_OZ:
216 break;
217
218 case EVENT_HOOD:
219 break;
220
221 case EVENT_RAJ:
222 break;
223 }
224 }
225
226 std::string GetSaveData() OVERRIDE
227 {
228 return strSaveData;
229 }
230
232 {
233 switch (uiData)
234 {
235 case TYPE_ATTUMEN: return m_auiEncounter[0];
236 case TYPE_MOROES: return m_auiEncounter[1];
237 case TYPE_MAIDEN: return m_auiEncounter[2];
238 case TYPE_OPTIONAL_BOSS: return m_auiEncounter[3];
239 case TYPE_OPERA: return m_auiEncounter[4];
240 case TYPE_CURATOR: return m_auiEncounter[5];
241 case TYPE_ARAN: return m_auiEncounter[6];
242 case TYPE_TERESTIAN: return m_auiEncounter[7];
243 case TYPE_NETHERSPITE: return m_auiEncounter[8];
244 case TYPE_CHESS: return m_auiEncounter[9];
245 case TYPE_MALCHEZZAR: return m_auiEncounter[10];
246 case TYPE_NIGHTBANE: return m_auiEncounter[11];
249 }
250
251 return 0;
252 }
253
277
278 void Load(char const* chrIn) OVERRIDE
279 {
280 if (!chrIn)
281 {
283 return;
284 }
285
286 OUT_LOAD_INST_DATA(chrIn);
287 std::istringstream loadStream(chrIn);
288
289 loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]
292 for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
293 if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
296 }
297 };
298};
299
301{
302 new instance_karazhan();
303}
@ DAY
Definition Common.h:121
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ GO_STATE_ACTIVE
Definition GameObject.h:576
#define OUT_LOAD_INST_DATA_FAIL
@ IN_PROGRESS
@ DONE
@ SPECIAL
@ NOT_STARTED
#define OUT_SAVE_INST_DATA_COMPLETE
#define OUT_LOAD_INST_DATA_COMPLETE
#define OUT_SAVE_INST_DATA
#define OUT_LOAD_INST_DATA(a)
@ GO_FLAG_LOCKED
@ GAMEOBJECT_FIELD_FLAGS
InstanceMapScript(const char *name, uint32 mapId)
InstanceScript(Map *map)
void UpdateEncounterState(EncounterCreditType type, uint32 creditEntry, Unit *source)
void DoRespawnGameObject(uint64 guid, uint32 timeToDespawn=MINUTE)
Definition Map.h:238
InstanceScript * GetInstanceScript(InstanceMap *map) const OVERRIDE
#define MAX_ENCOUNTER
void AddSC_instance_karazhan()
@ EVENT_HOOD
Definition karazhan.h:48
@ EVENT_OZ
Definition karazhan.h:47
@ EVENT_RAJ
Definition karazhan.h:49
@ DATA_KILREK
Definition karazhan.h:27
@ DATA_GO_STAGEDOORRIGHT
Definition karazhan.h:32
@ DATA_GO_CURTAINS
Definition karazhan.h:30
@ TYPE_MAIDEN
Definition karazhan.h:13
@ TYPE_OPTIONAL_BOSS
Definition karazhan.h:14
@ DATA_GO_MASSIVE_DOOR
Definition karazhan.h:34
@ DATA_GO_STAGEDOORLEFT
Definition karazhan.h:31
@ DATA_GO_GAME_EXIT_DOOR
Definition karazhan.h:37
@ TYPE_MOROES
Definition karazhan.h:12
@ TYPE_CHESS
Definition karazhan.h:20
@ TYPE_NETHERSPITE
Definition karazhan.h:19
@ DATA_IMAGE_OF_MEDIVH
Definition karazhan.h:39
@ TYPE_MALCHEZZAR
Definition karazhan.h:21
@ DATA_MASTERS_TERRACE_DOOR_1
Definition karazhan.h:40
@ DATA_TERESTIAN
Definition karazhan.h:28
@ DATA_GO_GAME_DOOR
Definition karazhan.h:36
@ TYPE_OPERA
Definition karazhan.h:15
@ TYPE_TERESTIAN
Definition karazhan.h:18
@ TYPE_ATTUMEN
Definition karazhan.h:11
@ DATA_MOROES
Definition karazhan.h:29
@ DATA_GO_SIDE_ENTRANCE_DOOR
Definition karazhan.h:42
@ DATA_GO_LIBRARY_DOOR
Definition karazhan.h:33
@ TYPE_CURATOR
Definition karazhan.h:16
@ TYPE_ARAN
Definition karazhan.h:17
@ DATA_MASTERS_TERRACE_DOOR_2
Definition karazhan.h:41
@ TYPE_NIGHTBANE
Definition karazhan.h:22
@ DATA_OPERA_OZ_DEATHCOUNT
Definition karazhan.h:25
@ DATA_OPERA_PERFORMANCE
Definition karazhan.h:24
@ DATA_GO_NETHER_DOOR
Definition karazhan.h:35
void SetData64(uint32 identifier, uint64 data) OVERRIDE
void SetData(uint32 type, uint32 uiData) OVERRIDE