Scripts/Molten Core: Fixed core freezes caused by this script

Closes #1217, #798, #905
This commit is contained in:
Shauren
2011-04-16 13:59:34 +02:00
parent ea5dd86f29
commit 7a03861715
@@ -29,7 +29,7 @@ EndScriptData */
#include "CreatureAI.h" #include "CreatureAI.h"
#include "molten_core.h" #include "molten_core.h"
const Position SummonPositions[10] = Position const SummonPositions[10] =
{ {
{737.850f, -1145.35f, -120.288f, 4.71368f}, {737.850f, -1145.35f, -120.288f, 4.71368f},
{744.162f, -1151.63f, -119.726f, 4.58204f}, {744.162f, -1151.63f, -119.726f, 4.58204f},
@@ -56,11 +56,28 @@ 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; _summonedExecutus = false;
} }
~instance_molten_core_InstanceMapScript()
{
delete _executusSchedule;
}
void OnPlayerEnter(Player* /*player*/)
{
if (_executusSchedule)
{
SummonMajordomoExecutus(*_executusSchedule);
delete _executusSchedule;
_executusSchedule = NULL;
}
}
void OnCreatureCreate(Creature* creature) void OnCreatureCreate(Creature* creature)
{ {
switch (creature->GetEntry()) switch (creature->GetEntry())
@@ -71,6 +88,8 @@ class instance_molten_core : public InstanceMapScript
case NPC_MAJORDOMO_EXECUTUS: case NPC_MAJORDOMO_EXECUTUS:
_majordomoExecutusGUID = creature->GetGUID(); _majordomoExecutusGUID = creature->GetGUID();
break; break;
default:
break;
} }
} }
@@ -81,6 +100,8 @@ class instance_molten_core : public InstanceMapScript
case GO_CACHE_OF_THE_FIRELORD: case GO_CACHE_OF_THE_FIRELORD:
_cacheOfTheFirelordGUID = go->GetGUID(); _cacheOfTheFirelordGUID = go->GetGUID();
break; break;
default:
break;
} }
} }
@@ -125,7 +146,12 @@ class instance_molten_core : public InstanceMapScript
return false; return false;
if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS) if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS)
if (++_deadBossCount == 8) ++_deadBossCount;
if (_isLoading)
return true;
if (_deadBossCount == 8)
SummonMajordomoExecutus(false); SummonMajordomoExecutus(false);
if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE) if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE)
@@ -175,6 +201,7 @@ 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;
@@ -201,7 +228,7 @@ class instance_molten_core : public InstanceMapScript
} }
if (executusCounter >= 8 && states[BOSS_RAGNAROS] != DONE) if (executusCounter >= 8 && states[BOSS_RAGNAROS] != DONE)
SummonMajordomoExecutus(states[BOSS_MAJORDOMO_EXECUTUS] == DONE); _executusSchedule = new bool(states[BOSS_MAJORDOMO_EXECUTUS] == DONE);
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
SetBossState(i, states[i]); SetBossState(i, states[i]);
@@ -210,14 +237,17 @@ class instance_molten_core : public InstanceMapScript
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; bool _summonedExecutus;
}; };