Fixed Majordomo Executus respawn at server restart
This commit is contained in:
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user