Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
instance_blood_furnace.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_Blood_Furnace
8SD%Complete: 85
9SDComment:
10SDCategory: Hellfire Citadel, Blood Furnace
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "InstanceScript.h"
15#include "blood_furnace.h"
16#include "CreatureAI.h"
17
18#define ENTRY_SEWER1 181823
19#define ENTRY_SEWER2 181766
20#define MAX_ENCOUNTER 3
21
23{
24 public:
26 : InstanceMapScript("instance_blood_furnace", 542) { }
27
29 {
31
35
42
51
52 std::set<uint64> PrisonersCell5;
53 std::set<uint64> PrisonersCell6;
54 std::set<uint64> PrisonersCell7;
55 std::set<uint64> PrisonersCell8;
56
61
63
65 std::string str_data;
66
68 {
69 memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
70
71 The_MakerGUID = 0;
72 BroggokGUID = 0;
74
75 Door1GUID = 0;
76 Door2GUID = 0;
77 Door3GUID = 0;
78 Door4GUID = 0;
79 Door5GUID = 0;
80 Door6GUID = 0;
81
90
91 PrisonersCell5.clear();
92 PrisonersCell6.clear();
93 PrisonersCell7.clear();
94 PrisonersCell8.clear();
95
100
102 }
103
105 {
106 switch (creature->GetEntry())
107 {
108 case 17381:
109 The_MakerGUID = creature->GetGUID();
110 break;
111 case 17380:
112 BroggokGUID = creature->GetGUID();
113 break;
114 case 17377:
115 Kelidan_The_BreakerGUID = creature->GetGUID();
116 break;
117 case 17398:
118 StorePrisoner(creature);
119 break;
120 }
121 }
122
124 {
125 if (unit && unit->GetTypeId() == TypeID::TYPEID_UNIT && unit->GetEntry() == 17398)
126 PrisonerDied(unit->GetGUID());
127 }
128
130 {
131 if (go->GetEntry() == 181766) //Final exit door
132 Door1GUID = go->GetGUID();
133 if (go->GetEntry() == 181811) //The Maker Front door
134 Door2GUID = go->GetGUID();
135 if (go->GetEntry() == 181812) //The Maker Rear door
136 Door3GUID = go->GetGUID();
137 if (go->GetEntry() == 181822) //Broggok Front door
138 Door4GUID = go->GetGUID();
139 if (go->GetEntry() == 181819) //Broggok Rear door
140 Door5GUID = go->GetGUID();
141 if (go->GetEntry() == 181823) //Kelidan exit door
142 Door6GUID = go->GetGUID();
143
144 if (go->GetEntry() == 181813) //The Maker prison cell front right
145 PrisonCell1GUID = go->GetGUID();
146 if (go->GetEntry() == 181814) //The Maker prison cell back right
147 PrisonCell2GUID = go->GetGUID();
148 if (go->GetEntry() == 181816) //The Maker prison cell front left
149 PrisonCell3GUID = go->GetGUID();
150 if (go->GetEntry() == 181815) //The Maker prison cell back left
151 PrisonCell4GUID = go->GetGUID();
152 if (go->GetEntry() == 181821) //Broggok prison cell front right
153 PrisonCell5GUID = go->GetGUID();
154 if (go->GetEntry() == 181818) //Broggok prison cell back right
155 PrisonCell6GUID = go->GetGUID();
156 if (go->GetEntry() == 181820) //Broggok prison cell front left
157 PrisonCell7GUID = go->GetGUID();
158 if (go->GetEntry() == 181817) //Broggok prison cell back left
159 PrisonCell8GUID = go->GetGUID();
160
161 if (go->GetEntry() == 181982)
162 BroggokLeverGUID = go->GetGUID(); //Broggok lever
163 }
164
166 {
167 switch (data)
168 {
169 case DATA_THE_MAKER: return The_MakerGUID;
170 case DATA_BROGGOK: return BroggokGUID;
172 case DATA_DOOR1: return Door1GUID;
173 case DATA_DOOR2: return Door2GUID;
174 case DATA_DOOR3: return Door3GUID;
175 case DATA_DOOR4: return Door4GUID;
176 case DATA_DOOR5: return Door5GUID;
177 case DATA_DOOR6: return Door6GUID;
187 }
188 return 0;
189 }
190
191 void SetData(uint32 type, uint32 data) OVERRIDE
192 {
193 switch (type)
194 {
196 m_auiEncounter[0] = data;
197 break;
199 m_auiEncounter[1] = data;
200 UpdateBroggokEvent(data);
201 break;
203 m_auiEncounter[2] = data;
204 break;
205 }
206
207 if (data == DONE)
208 {
210
211 std::ostringstream saveStream;
212 saveStream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2];
213
214 str_data = saveStream.str();
215
216 SaveToDB();
218 }
219 }
220
222 {
223 switch (type)
224 {
225 case TYPE_THE_MAKER_EVENT: return m_auiEncounter[0];
226 case TYPE_BROGGOK_EVENT: return m_auiEncounter[1];
228 }
229 return 0;
230 }
231
232 const char* Save()
233 {
234 return str_data.c_str();
235 }
236
237 void Load(const char* in) OVERRIDE
238 {
239 if (!in)
240 {
242 return;
243 }
244
246
247 std::istringstream loadStream(in);
248 loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2];
249
250 for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
253
255 }
256
258 {
259 switch (data)
260 {
261 case IN_PROGRESS:
264 break;
265 case NOT_STARTED:
266 ResetPrisons();
269 if (GameObject* lever = instance->GetGameObject(BroggokLeverGUID))
270 lever->Respawn();
271 break;
272 }
273 }
274
293
294 void ResetPrisoners(const std::set<uint64>& prisoners)
295 {
296 for (std::set<uint64>::const_iterator i = prisoners.begin(); i != prisoners.end(); ++i)
297 if (Creature* prisoner = instance->GetCreature(*i))
298 ResetPrisoner(prisoner);
299 }
300
301 void ResetPrisoner(Creature* prisoner)
302 {
303 if (!prisoner->IsAlive())
304 prisoner->Respawn(true);
306 }
307
308 void StorePrisoner(Creature* creature)
309 {
310 float posX = creature->GetPositionX();
311 float posY = creature->GetPositionY();
312
313 if (posX >= 405.0f && posX <= 423.0f)
314 {
315 if (posY >= 106.0f && posY <= 123.0f)
316 {
317 PrisonersCell5.insert(creature->GetGUID());
319 }
320 else if (posY >= 76.0f && posY <= 91.0f)
321 {
322 PrisonersCell6.insert(creature->GetGUID());
324 }
325 else return;
326 }
327 else if (posX >= 490.0f && posX <= 506.0f)
328 {
329 if (posY >= 106.0f && posY <= 123.0f)
330 {
331 PrisonersCell7.insert(creature->GetGUID());
333 }
334 else if (posY >= 76.0f && posY <= 91.0f)
335 {
336 PrisonersCell8.insert(creature->GetGUID());
338 }
339 else
340 return;
341 }
342 else
343 return;
344
345 ResetPrisoner(creature);
346 }
347
349 {
350 if (PrisonersCell5.find(guid) != PrisonersCell5.end() && --PrisonerCounter5 <= 0)
352 else if (PrisonersCell6.find(guid) != PrisonersCell6.end() && --PrisonerCounter6 <= 0)
354 else if (PrisonersCell7.find(guid) != PrisonersCell7.end() && --PrisonerCounter7 <= 0)
356 else if (PrisonersCell8.find(guid) != PrisonersCell8.end() && --PrisonerCounter8 <= 0)
358 }
359
361 {
362 switch (id)
363 {
367 break;
371 break;
375 break;
379 break;
380 case DATA_DOOR5:
382 if (Creature* broggok = instance->GetCreature(BroggokGUID))
383 broggok->AI()->DoAction(ACTION_ACTIVATE_BROGGOK);
384 break;
385 }
386 }
387
388 void ActivatePrisoners(const std::set<uint64>& prisoners)
389 {
390 for (std::set<uint64>::const_iterator i = prisoners.begin(); i != prisoners.end(); ++i)
391 if (Creature* prisoner = instance->GetCreature(*i))
392 {
394 prisoner->SetInCombatWithZone();
395 }
396 }
397 };
398
403};
404
409
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
#define OUT_LOAD_INST_DATA_FAIL
@ IN_PROGRESS
@ FAIL
@ DONE
@ 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)
@ TYPEID_UNIT
Definition Object.h:54
@ UNIT_FLAG_NON_ATTACKABLE
Definition Unit.h:626
@ UNIT_FLAG_IMMUNE_TO_NPC
Definition Unit.h:634
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ UNIT_FIELD_FLAGS
@ ACTION_ACTIVATE_BROGGOK
@ DATA_BROGGOK_LEVER
@ DATA_DOOR6
@ DATA_THE_MAKER
@ DATA_PRISON_CELL2
@ DATA_PRISON_CELL1
@ DATA_PRISON_CELL3
@ TYPE_THE_MAKER_EVENT
@ DATA_DOOR1
@ DATA_PRISON_CELL7
@ TYPE_BROGGOK_EVENT
@ DATA_PRISON_CELL5
@ TYPE_KELIDAN_THE_BREAKER_EVENT
@ DATA_DOOR3
@ DATA_DOOR5
@ DATA_BROGGOK
@ DATA_DOOR2
@ DATA_DOOR4
@ DATA_PRISON_CELL6
@ DATA_PRISON_CELL8
@ DATA_PRISON_CELL4
@ DATA_KELIDAN_THE_MAKER
void Respawn(bool force=false)
InstanceMapScript(const char *name, uint32 mapId)
InstanceScript(Map *map)
void HandleGameObject(uint64 guid, bool open, GameObject *go=NULL)
Definition Map.h:238
uint64 GetGUID() const
Definition Object.h:119
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:1261
Definition Unit.h:1367
bool IsAlive() const
Definition Unit.h:2032
InstanceScript * GetInstanceScript(InstanceMap *map) const OVERRIDE
#define MAX_ENCOUNTER
void AddSC_instance_blood_furnace()
float GetPositionX() const
Definition Object.h:328
float GetPositionY() const
Definition Object.h:329