Skip to content

Commit 7d92425

Browse files
committed
[2804] Add placeholder for Varos Cloudstrider - Oculus
Also improve Oculus instance script by fixing Eregos spawn exploit and allow better handling of the Centrifuge Constructs in case of server restart
1 parent d995d3d commit 7d92425

10 files changed

+92
-17
lines changed

VC100/100ScriptDev2.vcxproj

+1
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,7 @@
512512
<ClCompile Include="..\scripts\northrend\nexus\nexus\instance_nexus.cpp" />
513513
<ClCompile Include="..\scripts\northrend\nexus\oculus\boss_eregos.cpp" />
514514
<ClCompile Include="..\scripts\northrend\nexus\oculus\boss_urom.cpp" />
515+
<ClCompile Include="..\scripts\northrend\nexus\oculus\boss_varos.cpp" />
515516
<ClCompile Include="..\scripts\northrend\nexus\oculus\instance_oculus.cpp" />
516517
<ClCompile Include="..\scripts\northrend\obsidian_sanctum\boss_sartharion.cpp" />
517518
<ClCompile Include="..\scripts\northrend\obsidian_sanctum\instance_obsidian_sanctum.cpp" />

VC100/100ScriptDev2.vcxproj.filters

+3
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,9 @@
11281128
<ClCompile Include="..\scripts\northrend\nexus\oculus\boss_urom.cpp">
11291129
<Filter>scripts\northrend\nexus\oculus</Filter>
11301130
</ClCompile>
1131+
<ClCompile Include="..\scripts\northrend\nexus\oculus\boss_varos.cpp">
1132+
<Filter>scripts\northrend\nexus\oculus</Filter>
1133+
</ClCompile>
11311134
<ClCompile Include="..\scripts\northrend\nexus\oculus\instance_oculus.cpp">
11321135
<Filter>scripts\northrend\nexus\oculus</Filter>
11331136
</ClCompile>

VC110/110ScriptDev2.vcxproj

+1
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@
517517
<ClCompile Include="..\scripts\northrend\nexus\nexus\instance_nexus.cpp" />
518518
<ClCompile Include="..\scripts\northrend\nexus\oculus\boss_eregos.cpp" />
519519
<ClCompile Include="..\scripts\northrend\nexus\oculus\boss_urom.cpp" />
520+
<ClCompile Include="..\scripts\northrend\nexus\oculus\boss_varos.cpp" />
520521
<ClCompile Include="..\scripts\northrend\nexus\oculus\instance_oculus.cpp" />
521522
<ClCompile Include="..\scripts\northrend\obsidian_sanctum\boss_sartharion.cpp" />
522523
<ClCompile Include="..\scripts\northrend\obsidian_sanctum\instance_obsidian_sanctum.cpp" />

VC110/110ScriptDev2.vcxproj.filters

+3
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,9 @@
11281128
<ClCompile Include="..\scripts\northrend\nexus\oculus\boss_urom.cpp">
11291129
<Filter>scripts\northrend\nexus\oculus</Filter>
11301130
</ClCompile>
1131+
<ClCompile Include="..\scripts\northrend\nexus\oculus\boss_varos.cpp">
1132+
<Filter>scripts\northrend\nexus\oculus</Filter>
1133+
</ClCompile>
11311134
<ClCompile Include="..\scripts\northrend\nexus\oculus\instance_oculus.cpp">
11321135
<Filter>scripts\northrend\nexus\oculus</Filter>
11331136
</ClCompile>

VC90/90ScriptDev2.vcproj

+4
Original file line numberDiff line numberDiff line change
@@ -1853,6 +1853,10 @@
18531853
RelativePath="..\scripts\northrend\nexus\oculus\boss_urom.cpp"
18541854
>
18551855
</File>
1856+
<File
1857+
RelativePath="..\scripts\northrend\nexus\oculus\boss_varos.cpp"
1858+
>
1859+
</File>
18561860
<File
18571861
RelativePath="..\scripts\northrend\nexus\oculus\instance_oculus.cpp"
18581862
>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/* Copyright (C) 2006 - 2013 ScriptDev2 <http://www.scriptdev2.com/>
2+
* This program is free software; you can redistribute it and/or modify
3+
* it under the terms of the GNU General Public License as published by
4+
* the Free Software Foundation; either version 2 of the License, or
5+
* (at your option) any later version.
6+
*
7+
* This program is distributed in the hope that it will be useful,
8+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
9+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10+
* GNU General Public License for more details.
11+
*
12+
* You should have received a copy of the GNU General Public License
13+
* along with this program; if not, write to the Free Software
14+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15+
*/
16+
17+
/* ScriptData
18+
SDName: boss_varos
19+
SD%Complete: 0
20+
SDComment: Placeholder
21+
SDCategory: Oculus
22+
EndScriptData */
23+
24+
#include "precompiled.h"
25+
26+
void AddSC_boss_varos()
27+
{
28+
29+
}

scripts/northrend/nexus/oculus/instance_oculus.cpp

+43-13
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,14 @@
1717
/* ScriptData
1818
SDName: instance_oculus
1919
SD%Complete: 50
20-
SDComment: Spawn instance bosses and handle Varos pre event; Dialogue NYI
20+
SDComment: Spawn instance bosses and handle Varos pre event; Dialogue handled by DBScripts
2121
SDCategory: Oculus
2222
EndScriptData */
2323

2424
#include "precompiled.h"
2525
#include "oculus.h"
2626

27-
instance_oculus::instance_oculus(Map* pMap) : ScriptedInstance(pMap),
28-
m_uiConstructsDead(0)
27+
instance_oculus::instance_oculus(Map* pMap) : ScriptedInstance(pMap)
2928
{
3029
Initialize();
3130
}
@@ -37,7 +36,16 @@ void instance_oculus::Initialize()
3736

3837
void instance_oculus::OnPlayerEnter(Player* pPlayer)
3938
{
39+
if (GetData(TYPE_EREGOS) == DONE)
40+
return;
41+
4042
DoSpawnNextBossIfCan();
43+
44+
if (GetData(TYPE_DRAKOS) == DONE && GetData(TYPE_VAROS) == NOT_STARTED)
45+
{
46+
pPlayer->SendUpdateWorldState(WORLD_STATE_CONSTRUCTS, 1);
47+
pPlayer->SendUpdateWorldState(WORLD_STATE_CONSTRUCTS_COUNT, m_sConstructsAliveGUIDSet.size());
48+
}
4149
}
4250

4351
void instance_oculus::OnCreatureCreate(Creature* pCreature)
@@ -80,12 +88,12 @@ void instance_oculus::SetData(uint32 uiType, uint32 uiData)
8088
for (GuidList::const_iterator itr = m_lCageDoorGUIDs.begin(); itr != m_lCageDoorGUIDs.end(); ++itr)
8189
DoUseDoorOrButton(*itr);
8290

83-
// Notes: There should also be a small dialogue here involving Belgaristrasz and Varos
84-
// Also the Centrifuge Constructs and the related npcs should be summoned
91+
// Notes: The dialogue is handled by DB script
92+
// Also the Centrifuge Constructs and the related npcs should be summoned - requires additional research
8593

86-
// Activate the world state
94+
// Activate the world state - the Centrifuge contructs should be loaded by now
8795
DoUpdateWorldState(WORLD_STATE_CONSTRUCTS, 1);
88-
DoUpdateWorldState(WORLD_STATE_CONSTRUCTS_COUNT, MAX_CONSTRUCTS);
96+
DoUpdateWorldState(WORLD_STATE_CONSTRUCTS_COUNT, m_sConstructsAliveGUIDSet.size());
8997

9098
DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_EREGOS_ID);
9199
}
@@ -94,22 +102,26 @@ void instance_oculus::SetData(uint32 uiType, uint32 uiData)
94102
m_auiEncounter[TYPE_VAROS] = uiData;
95103
if (uiData == DONE)
96104
{
97-
// Note: Image of Belgaristrasz teleports here after the boss is dead and does some dialogue
105+
// Note: Image of Belgaristrasz dialogue is handled by DB script
98106
DoSpawnNextBossIfCan();
99107
DoUpdateWorldState(WORLD_STATE_CONSTRUCTS, 0);
100108
}
101109
break;
102110
case TYPE_UROM:
103111
m_auiEncounter[TYPE_UROM] = uiData;
104-
// Note: Image of Belgaristrasz teleports to this boss after it's killed and does some dialogue; Right after this, Eregos appears
112+
// Note: Image of Belgaristrasz dialogue is handled by DB script
105113
if (uiData == DONE)
106114
DoSpawnNextBossIfCan();
107115
break;
108116
case TYPE_EREGOS:
109117
m_auiEncounter[TYPE_EREGOS] = uiData;
110-
// Note: Image of Belgaristrasz teleports to the Cache location and does more dialogue
118+
// Note: Image of Belgaristrasz teleports to the Cache location and does more dialogue - requires additional research
111119
if (uiData == DONE)
120+
{
121+
// The data about the cache isn't consistent, so it's better to handle both cases
112122
DoToggleGameObjectFlags(instance->IsRegularDifficulty() ? GO_CACHE_EREGOS : GO_CACHE_EREGOS_H, GO_FLAG_NO_INTERACT, false);
123+
DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_EREGOS : GO_CACHE_EREGOS_H, 30 * MINUTE);
124+
}
113125
break;
114126
}
115127

@@ -135,6 +147,24 @@ uint32 instance_oculus::GetData(uint32 uiType) const
135147
return 0;
136148
}
137149

150+
void instance_oculus::SetData64(uint32 uiData, uint64 uiGuid)
151+
{
152+
// If Varos already completed, just ignore
153+
if (GetData(TYPE_VAROS) == DONE)
154+
return;
155+
156+
// Note: this is handled in Acid. The purpose is check which Centrifuge Construct is alive, in case of server reset
157+
// The function is triggered by eventAI on generic timer
158+
if (uiData == DATA_CONSTRUCTS_EVENT)
159+
{
160+
m_sConstructsAliveGUIDSet.insert(ObjectGuid(uiGuid));
161+
162+
// Update world state in case of server reset
163+
if (GetData(TYPE_DRAKOS) == DONE)
164+
DoUpdateWorldState(WORLD_STATE_CONSTRUCTS_COUNT, m_sConstructsAliveGUIDSet.size());
165+
}
166+
}
167+
138168
void instance_oculus::OnCreatureEnterCombat(Creature* pCreature)
139169
{
140170
switch (pCreature->GetEntry())
@@ -160,10 +190,10 @@ void instance_oculus::OnCreatureDeath(Creature* pCreature)
160190
case NPC_DRAKOS: SetData(TYPE_DRAKOS, DONE); break;
161191
case NPC_VAROS: SetData(TYPE_VAROS, DONE); break;
162192
case NPC_CENTRIFUGE_CONSTRUCT:
163-
++m_uiConstructsDead;
164-
DoUpdateWorldState(WORLD_STATE_CONSTRUCTS_COUNT, MAX_CONSTRUCTS - m_uiConstructsDead);
193+
m_sConstructsAliveGUIDSet.erase(pCreature->GetObjectGuid());
194+
DoUpdateWorldState(WORLD_STATE_CONSTRUCTS_COUNT, m_sConstructsAliveGUIDSet.size());
165195

166-
if (m_uiConstructsDead == MAX_CONSTRUCTS)
196+
if (m_sConstructsAliveGUIDSet.empty())
167197
{
168198
if (Creature* pVaros = GetSingleCreatureFromStorage(NPC_VAROS))
169199
pVaros->InterruptNonMeleeSpells(false);

scripts/northrend/nexus/oculus/oculus.h

+5-3
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515
enum
1616
{
1717
MAX_ENCOUNTER = 4,
18-
MAX_CONSTRUCTS = 10,
1918

2019
TYPE_DRAKOS = 0,
2120
TYPE_VAROS = 1,
2221
TYPE_UROM = 2,
2322
TYPE_EREGOS = 3,
2423

24+
DATA_CONSTRUCTS_EVENT = 1, // DO NOT CHANGE! Used by Acid. - used to check the Centrifuge Constructs alive
25+
2526
NPC_DRAKOS = 27654,
2627
NPC_VAROS = 27447,
2728
NPC_UROM = 27655,
@@ -78,6 +79,8 @@ class MANGOS_DLL_DECL instance_oculus : public ScriptedInstance
7879
void SetData(uint32 uiType, uint32 uiData) override;
7980
uint32 GetData(uint32 uiType) const override;
8081

82+
void SetData64(uint32 uiType, uint64 uiGuid) override;
83+
8184
const char* Save() const override { return strInstData.c_str(); }
8285
void Load(const char* chrIn) override;
8386

@@ -87,9 +90,8 @@ class MANGOS_DLL_DECL instance_oculus : public ScriptedInstance
8790
uint32 m_auiEncounter[MAX_ENCOUNTER];
8891
std::string strInstData;
8992

90-
uint8 m_uiConstructsDead;
91-
9293
GuidList m_lCageDoorGUIDs;
94+
GuidSet m_sConstructsAliveGUIDSet;
9395
};
9496

9597
#endif

sd2_revision_nr.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#ifndef __SD2_REVISION_NR_H__
22
#define __SD2_REVISION_NR_H__
3-
#define SD2_REVISION_NR "2803"
3+
#define SD2_REVISION_NR "2804"
44
#endif // __SD2_REVISION_NR_H__

system/ScriptLoader.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ extern void AddSC_boss_telestra();
317317
extern void AddSC_instance_nexus();
318318
extern void AddSC_boss_eregos(); // nexus, oculus
319319
extern void AddSC_boss_urom();
320+
extern void AddSC_boss_varos();
320321
extern void AddSC_instance_oculus();
321322
extern void AddSC_boss_sartharion(); // obsidian_sanctum
322323
extern void AddSC_instance_obsidian_sanctum();
@@ -778,6 +779,7 @@ void AddScripts()
778779
AddSC_instance_nexus();
779780
AddSC_boss_eregos(); // nexus, oculus
780781
AddSC_boss_urom();
782+
AddSC_boss_varos();
781783
AddSC_instance_oculus();
782784
AddSC_boss_sartharion(); // obsidian_sanctum
783785
AddSC_instance_obsidian_sanctum();

0 commit comments

Comments
 (0)