Fixed Majordomo Executus respawn at server restart

This commit is contained in:
Yehonal
2017-12-05 18:14:34 +00:00
parent bd9178368e
commit 2979fd6c1f
@@ -45,29 +45,17 @@ class instance_molten_core : public InstanceMapScript
_golemaggTheIncineratorGUID = 0; _golemaggTheIncineratorGUID = 0;
_majordomoExecutusGUID = 0; _majordomoExecutusGUID = 0;
_cacheOfTheFirelordGUID = 0; _cacheOfTheFirelordGUID = 0;
_executusSchedule = NULL;
_deadBossCount = 0; _deadBossCount = 0;
_ragnarosAddDeaths = 0; _ragnarosAddDeaths = 0;
_isLoading = false;
_summonedExecutus = false;
} }
~instance_molten_core_InstanceMapScript() void OnPlayerEnter(Player* /*player*/) override
{ {
delete _executusSchedule; if (CheckMajordomoExecutus())
SummonMajordomoExecutus();
} }
void OnPlayerEnter(Player* /*player*/) void OnCreatureCreate(Creature* creature) override
{
if (_executusSchedule)
{
SummonMajordomoExecutus(*_executusSchedule);
delete _executusSchedule;
_executusSchedule = NULL;
}
}
void OnCreatureCreate(Creature* creature)
{ {
switch (creature->GetEntry()) switch (creature->GetEntry())
{ {
@@ -82,7 +70,7 @@ class instance_molten_core : public InstanceMapScript
} }
} }
void OnGameObjectCreate(GameObject* go) void OnGameObjectCreate(GameObject* go) override
{ {
switch (go->GetEntry()) switch (go->GetEntry())
{ {
@@ -115,7 +103,7 @@ class instance_molten_core : public InstanceMapScript
} }
} }
void SetData(uint32 type, uint32 data) void SetData(uint32 type, uint32 data) override
{ {
if (type == DATA_RAGNAROS_ADDS) if (type == DATA_RAGNAROS_ADDS)
{ {
@@ -126,7 +114,7 @@ class instance_molten_core : public InstanceMapScript
} }
} }
uint32 GetData(uint32 type) const uint32 GetData(uint32 type) const override
{ {
switch (type) switch (type)
{ {
@@ -137,7 +125,7 @@ class instance_molten_core : public InstanceMapScript
return 0; return 0;
} }
uint64 GetData64(uint32 type) const uint64 GetData64(uint32 type) const override
{ {
switch (type) switch (type)
{ {
@@ -150,47 +138,28 @@ class instance_molten_core : public InstanceMapScript
return 0; return 0;
} }
bool SetBossState(uint32 bossId, EncounterState state) bool SetBossState(uint32 bossId, EncounterState state) override
{ {
if (!InstanceScript::SetBossState(bossId, state)) if (!InstanceScript::SetBossState(bossId, state))
return false; return false;
if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS) if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS)
++_deadBossCount; if (CheckMajordomoExecutus())
SummonMajordomoExecutus();
if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS && _circlesGUIDs[bossId])
{ if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE) {
GameObject * circle = instance->GetGameObject(_circlesGUIDs[bossId]);
if (circle && circle->isSpawned())
circle->Delete();
circle->SetRespawnTime(7 * DAY);
_circlesGUIDs[bossId] = 0;
}
if (state == DONE && bossId == BOSS_MAGMADAR)
{
}
if (_isLoading)
return true;
if (_deadBossCount == 8)
SummonMajordomoExecutus(false);
if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE)
DoRespawnGameObject(_cacheOfTheFirelordGUID, 7 * DAY); DoRespawnGameObject(_cacheOfTheFirelordGUID, 7 * DAY);
}
return true; return true;
} }
void SummonMajordomoExecutus(bool done) void SummonMajordomoExecutus()
{ {
if (_summonedExecutus) if (_majordomoExecutusGUID)
return; return;
_summonedExecutus = true; if (GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE)
if (!done)
{ {
instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, SummonPositions[0]); instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, SummonPositions[0]);
instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[1]); instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[1]);
@@ -203,10 +172,22 @@ class instance_molten_core : public InstanceMapScript
instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[8]); instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[8]);
} }
else if (TempSummon* summon = instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, RagnarosTelePos)) else if (TempSummon* summon = instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, RagnarosTelePos))
summon->AI()->DoAction(ACTION_START_RAGNAROS_ALT); summon->AI()->DoAction(ACTION_START_RAGNAROS_ALT);
} }
std::string GetSaveData() bool CheckMajordomoExecutus() const
{
if (GetBossState(BOSS_RAGNAROS) == DONE)
return false;
for (uint8 i = 0; i < BOSS_MAJORDOMO_EXECUTUS; ++i)
if (GetBossState(i) != DONE)
return false;
return true;
}
std::string GetSaveData() override
{ {
OUT_SAVE_INST_DATA; OUT_SAVE_INST_DATA;
@@ -217,7 +198,7 @@ class instance_molten_core : public InstanceMapScript
return saveStream.str(); return saveStream.str();
} }
void Load(char const* data) void Load(char const* data) override
{ {
if (!data) if (!data)
{ {
@@ -225,7 +206,6 @@ class instance_molten_core : public InstanceMapScript
return; return;
} }
_isLoading = true;
OUT_LOAD_INST_DATA(data); OUT_LOAD_INST_DATA(data);
char dataHead1, dataHead2; char dataHead1, dataHead2;
@@ -235,44 +215,31 @@ class instance_molten_core : public InstanceMapScript
if (dataHead1 == 'M' && dataHead2 == 'C') if (dataHead1 == 'M' && dataHead2 == 'C')
{ {
EncounterState states[MAX_ENCOUNTER];
uint8 executusCounter = 0;
// need 2 loops to check spawning executus/ragnaros
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
{ {
uint32 tmpState; uint32 tmpState;
loadStream >> tmpState; loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED) if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED)
tmpState = NOT_STARTED; tmpState = NOT_STARTED;
states[i] = EncounterState(tmpState);
if (tmpState == DONE && i < BOSS_MAJORDOMO_EXECUTUS) SetBossState(i, EncounterState(tmpState));
++executusCounter; }
}
if (executusCounter >= 8 && states[BOSS_RAGNAROS] != DONE) if (CheckMajordomoExecutus())
_executusSchedule = new bool(states[BOSS_MAJORDOMO_EXECUTUS] == DONE); SummonMajordomoExecutus();
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
SetBossState(i, states[i]);
} }
else else
OUT_LOAD_INST_DATA_FAIL; OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE; OUT_LOAD_INST_DATA_COMPLETE;
_isLoading = false;
} }
private: private:
uint64 _golemaggTheIncineratorGUID; uint64 _golemaggTheIncineratorGUID;
uint64 _majordomoExecutusGUID; uint64 _majordomoExecutusGUID;
uint64 _cacheOfTheFirelordGUID; uint64 _cacheOfTheFirelordGUID;
bool* _executusSchedule;
uint8 _deadBossCount; uint8 _deadBossCount;
uint8 _ragnarosAddDeaths; uint8 _ragnarosAddDeaths;
bool _isLoading;
bool _summonedExecutus;
std::unordered_map<uint8, uint64> _circlesGUIDs; std::unordered_map<uint8, uint64> _circlesGUIDs;
}; };