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

View File

@@ -45,29 +45,17 @@ class instance_molten_core : public InstanceMapScript
_golemaggTheIncineratorGUID = 0;
_majordomoExecutusGUID = 0;
_cacheOfTheFirelordGUID = 0;
_executusSchedule = NULL;
_deadBossCount = 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*/)
{
if (_executusSchedule)
{
SummonMajordomoExecutus(*_executusSchedule);
delete _executusSchedule;
_executusSchedule = NULL;
}
}
void OnCreatureCreate(Creature* creature)
void OnCreatureCreate(Creature* creature) override
{
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())
{
@@ -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)
{
@@ -126,7 +114,7 @@ class instance_molten_core : public InstanceMapScript
}
}
uint32 GetData(uint32 type) const
uint32 GetData(uint32 type) const override
{
switch (type)
{
@@ -137,7 +125,7 @@ class instance_molten_core : public InstanceMapScript
return 0;
}
uint64 GetData64(uint32 type) const
uint64 GetData64(uint32 type) const override
{
switch (type)
{
@@ -150,47 +138,28 @@ class instance_molten_core : public InstanceMapScript
return 0;
}
bool SetBossState(uint32 bossId, EncounterState state)
bool SetBossState(uint32 bossId, EncounterState state) override
{
if (!InstanceScript::SetBossState(bossId, state))
return false;
if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS)
++_deadBossCount;
if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS && _circlesGUIDs[bossId])
{
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)
if (CheckMajordomoExecutus())
SummonMajordomoExecutus();
if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE) {
DoRespawnGameObject(_cacheOfTheFirelordGUID, 7 * DAY);
}
return true;
}
void SummonMajordomoExecutus(bool done)
void SummonMajordomoExecutus()
{
if (_summonedExecutus)
if (_majordomoExecutusGUID)
return;
_summonedExecutus = true;
if (!done)
if (GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE)
{
instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, SummonPositions[0]);
instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[1]);
@@ -203,10 +172,22 @@ class instance_molten_core : public InstanceMapScript
instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[8]);
}
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;
@@ -217,7 +198,7 @@ class instance_molten_core : public InstanceMapScript
return saveStream.str();
}
void Load(char const* data)
void Load(char const* data) override
{
if (!data)
{
@@ -225,7 +206,6 @@ class instance_molten_core : public InstanceMapScript
return;
}
_isLoading = true;
OUT_LOAD_INST_DATA(data);
char dataHead1, dataHead2;
@@ -235,44 +215,31 @@ class instance_molten_core : public InstanceMapScript
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)
{
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED)
tmpState = NOT_STARTED;
states[i] = EncounterState(tmpState);
if (tmpState == DONE && i < BOSS_MAJORDOMO_EXECUTUS)
++executusCounter;
}
SetBossState(i, EncounterState(tmpState));
}
if (executusCounter >= 8 && states[BOSS_RAGNAROS] != DONE)
_executusSchedule = new bool(states[BOSS_MAJORDOMO_EXECUTUS] == DONE);
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
SetBossState(i, states[i]);
if (CheckMajordomoExecutus())
SummonMajordomoExecutus();
}
else
OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
_isLoading = false;
}
private:
uint64 _golemaggTheIncineratorGUID;
uint64 _majordomoExecutusGUID;
uint64 _cacheOfTheFirelordGUID;
bool* _executusSchedule;
uint8 _deadBossCount;
uint8 _ragnarosAddDeaths;
bool _isLoading;
bool _summonedExecutus;
std::unordered_map<uint8, uint64> _circlesGUIDs;
};