mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-26 23:26:23 +00:00
Merge branch 'master' of https://github.com/azerothcore/azerothcore-wotlk into dir-restructure
This commit is contained in:
@@ -110,4 +110,9 @@ enum GameObjectsIds
|
||||
GO_UROK_PILE = 175621,
|
||||
};
|
||||
|
||||
enum npcspells
|
||||
{
|
||||
SPELL_FINKLE_IS_EINHORN = 16710
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -67,6 +67,19 @@ public:
|
||||
memset(go_emberseerrunes, 0, sizeof(go_emberseerrunes));
|
||||
}
|
||||
|
||||
void CreatureLooted(Creature* creature, LootType loot)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_THE_BEAST:
|
||||
if (loot == LOOT_SKINNING)
|
||||
{
|
||||
creature->CastSpell(creature, SPELL_FINKLE_IS_EINHORN, true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
|
||||
@@ -61,6 +61,17 @@ class boss_golemagg : public CreatureScript
|
||||
{
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_PYROBLAST, 7000);
|
||||
|
||||
// The two ragers should join the fight alongside me against my foes.
|
||||
std::list<Creature *> ragers;
|
||||
me->GetCreaturesWithEntryInRange(ragers, 100, NPC_CORE_RAGER);
|
||||
for (Creature * i : ragers)
|
||||
{
|
||||
if (i && i->IsAlive() && !i->IsInCombat())
|
||||
{
|
||||
i->AI()->AttackStart(victim);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask)
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Magmadar
|
||||
SD%Complete: 75
|
||||
SDComment: Conflag on ground nyi
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
/* ScriptData
|
||||
SDName: Boss_Magmadar
|
||||
SD%Complete: 75
|
||||
SDComment: Conflag on ground nyi
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
@@ -18,93 +18,229 @@ EndScriptData */
|
||||
|
||||
enum Texts
|
||||
{
|
||||
EMOTE_FRENZY = 0
|
||||
EMOTE_FRENZY = 0,
|
||||
EMOTE_SMOLDERING = 0,
|
||||
EMOTE_IGNITE = 1,
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_FRENZY = 19451,
|
||||
SPELL_MAGMA_SPIT = 19449,
|
||||
SPELL_PANIC = 19408,
|
||||
SPELL_LAVA_BOMB = 19428,
|
||||
SPELL_FRENZY = 19451,
|
||||
SPELL_MAGMA_SPIT = 19449,
|
||||
SPELL_PANIC = 19408,
|
||||
SPELL_LAVA_BOMB = 19428,
|
||||
SPELL_SERRATED_BITE = 19771,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_FRENZY = 1,
|
||||
EVENT_PANIC = 2,
|
||||
EVENT_LAVA_BOMB = 3,
|
||||
EVENT_FRENZY = 1,
|
||||
EVENT_PANIC = 2,
|
||||
EVENT_LAVA_BOMB = 3,
|
||||
EVENT_SERRATED_BITE = 1,
|
||||
EVENT_IGNITE = 2,
|
||||
};
|
||||
|
||||
class boss_magmadar : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_magmadar() : CreatureScript("boss_magmadar") { }
|
||||
public:
|
||||
boss_magmadar() : CreatureScript("boss_magmadar") { }
|
||||
|
||||
struct boss_magmadarAI : public BossAI
|
||||
struct boss_magmadarAI : public BossAI
|
||||
{
|
||||
boss_magmadarAI(Creature* creature) : BossAI(creature, BOSS_MAGMADAR)
|
||||
{
|
||||
boss_magmadarAI(Creature* creature) : BossAI(creature, BOSS_MAGMADAR)
|
||||
{
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
DoCast(me, SPELL_MAGMA_SPIT, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 30000);
|
||||
events.ScheduleEvent(EVENT_PANIC, 20000);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FRENZY:
|
||||
Talk(EMOTE_FRENZY);
|
||||
DoCast(me, SPELL_FRENZY);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 15000);
|
||||
break;
|
||||
case EVENT_PANIC:
|
||||
DoCastVictim(SPELL_PANIC);
|
||||
events.ScheduleEvent(EVENT_PANIC, 35000);
|
||||
break;
|
||||
case EVENT_LAVA_BOMB:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LAVA_BOMB))
|
||||
DoCast(target, SPELL_LAVA_BOMB);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_magmadarAI(creature);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
DoCast(me, SPELL_MAGMA_SPIT, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 30000);
|
||||
events.ScheduleEvent(EVENT_PANIC, 20000);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FRENZY:
|
||||
Talk(EMOTE_FRENZY);
|
||||
DoCast(me, SPELL_FRENZY);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 15000);
|
||||
break;
|
||||
case EVENT_PANIC:
|
||||
DoCastVictim(SPELL_PANIC);
|
||||
events.ScheduleEvent(EVENT_PANIC, 35000);
|
||||
break;
|
||||
case EVENT_LAVA_BOMB:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LAVA_BOMB))
|
||||
DoCast(target, SPELL_LAVA_BOMB);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_magmadarAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
// Serrated Bites timer may be wrong
|
||||
class npc_magmadar_core_hound : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_magmadar_core_hound() : CreatureScript("npc_magmadar_core_hound") { }
|
||||
|
||||
struct npc_magmadar_core_houndAI : public CreatureAI
|
||||
{
|
||||
npc_magmadar_core_houndAI(Creature* creature) : CreatureAI(creature)
|
||||
{
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
std::list<Creature *> hounds;
|
||||
bool smoldering = false;
|
||||
Unit* killer;
|
||||
|
||||
void removeFeignDeath() {
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
me->RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT);
|
||||
me->ClearUnitState(UNIT_STATE_DIED);
|
||||
me->ClearUnitState(UNIT_STATE_CANNOT_AUTOATTACK);
|
||||
me->DisableRotate(false);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/)
|
||||
{
|
||||
if (me->HealthBelowPctDamaged(0, damage))
|
||||
{
|
||||
if (!smoldering)
|
||||
{
|
||||
killer = attacker;
|
||||
events.ScheduleEvent(EVENT_IGNITE, 10000);
|
||||
me->SetHealth(1);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
me->AddUnitMovementFlag(MOVEMENTFLAG_ROOT);
|
||||
me->AddUnitState(UNIT_STATE_DIED);
|
||||
me->AddUnitState(UNIT_STATE_CANNOT_AUTOATTACK);
|
||||
me->DisableRotate(true);
|
||||
Talk(EMOTE_SMOLDERING);
|
||||
}
|
||||
damage = 0;
|
||||
smoldering = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Reset() {
|
||||
removeFeignDeath();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) {
|
||||
removeFeignDeath();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*victim*/)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // timer may be wrong
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim() && !smoldering)
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SERRATED_BITE:
|
||||
if (UpdateVictim() && !smoldering) {
|
||||
DoCast(me->GetVictim(), SPELL_SERRATED_BITE);
|
||||
events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // again, timer may be wrong
|
||||
}
|
||||
break;
|
||||
case EVENT_IGNITE:
|
||||
smoldering = false;
|
||||
me->GetCreaturesWithEntryInRange(hounds, 80, NPC_CORE_HOUND);
|
||||
for (Creature * i : hounds)
|
||||
{
|
||||
if (i && i->IsAlive() && i->IsInCombat() && !i->HasUnitState(UNIT_STATE_DIED))
|
||||
{
|
||||
Talk(EMOTE_IGNITE);
|
||||
me->SetFullHealth();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
me->RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT);
|
||||
me->ClearUnitState(UNIT_STATE_DIED);
|
||||
me->ClearUnitState(UNIT_STATE_CANNOT_AUTOATTACK);
|
||||
me->DisableRotate(false);
|
||||
me->AI()->AttackStart(i->GetVictim());
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (me->HasUnitState(UNIT_STATE_DIED))
|
||||
{
|
||||
if (killer)
|
||||
{
|
||||
me->Kill(killer, me);
|
||||
}
|
||||
else
|
||||
{
|
||||
me->Kill(me, me);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_magmadar_core_houndAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_magmadar()
|
||||
{
|
||||
new boss_magmadar();
|
||||
new npc_magmadar_core_hound();
|
||||
}
|
||||
|
||||
@@ -80,6 +80,8 @@ class boss_majordomo : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 15000);
|
||||
events.ScheduleEvent(EVENT_BLAST_WAVE, 10000);
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 20000);
|
||||
// Call every flamewaker around him
|
||||
me->CallForHelp(30);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
|
||||
@@ -61,6 +61,7 @@ enum Events
|
||||
EVENT_INTRO_5 = 12
|
||||
};
|
||||
|
||||
|
||||
class boss_ragnaros : public CreatureScript
|
||||
{
|
||||
public:
|
||||
@@ -83,6 +84,7 @@ class boss_ragnaros : public CreatureScript
|
||||
_hasSubmergedOnce = false;
|
||||
_isBanished = false;
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
|
||||
me->SetOrientation(0.8f);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* victim)
|
||||
|
||||
@@ -20,15 +20,15 @@ EndScriptData */
|
||||
|
||||
Position const SummonPositions[10] =
|
||||
{
|
||||
{737.850f, -1145.35f, -120.288f, 4.71368f},
|
||||
{744.162f, -1151.63f, -119.726f, 4.58204f},
|
||||
{751.247f, -1152.82f, -119.744f, 4.49673f},
|
||||
{759.206f, -1155.09f, -120.051f, 4.30104f},
|
||||
{755.973f, -1152.33f, -120.029f, 4.25588f},
|
||||
{731.712f, -1147.56f, -120.195f, 4.95955f},
|
||||
{726.499f, -1149.80f, -120.156f, 5.24055f},
|
||||
{722.408f, -1152.41f, -120.029f, 5.33087f},
|
||||
{718.994f, -1156.36f, -119.805f, 5.75738f},
|
||||
{759.542f, -1173.43f, -118.974f, 3.3048f},
|
||||
{761.652f, -1164.30f, -119.533f, 3.3919f},
|
||||
{747.323f, -1149.24f, -120.060f, 3.6629f},
|
||||
{766.734f, -1183.16f, -119.292f, 2.9889f},
|
||||
{757.364f, -1198.31f, -118.652f, 2.3095f},
|
||||
{752.349f, -1159.19f, -119.261f, 3.6032f},
|
||||
{738.015f, -1152.22f, -119.512f, 4.0792f},
|
||||
{757.246f, -1189.79f, -118.633f, 2.5333f},
|
||||
{745.916f, -1199.35f, -118.119f, 1.8932f},
|
||||
{838.510f, -829.840f, -232.000f, 2.00000f},
|
||||
};
|
||||
|
||||
@@ -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,19 +70,40 @@ class instance_molten_core : public InstanceMapScript
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
void OnGameObjectCreate(GameObject* go) override
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_CACHE_OF_THE_FIRELORD:
|
||||
_cacheOfTheFirelordGUID = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_BARON:
|
||||
_circlesGUIDs[5] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_GARR:
|
||||
_circlesGUIDs[3] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_GEHENNAS:
|
||||
_circlesGUIDs[2] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_GOLEMAGG:
|
||||
_circlesGUIDs[7] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_MAGMADAR:
|
||||
_circlesGUIDs[1] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_SHAZZRAH:
|
||||
_circlesGUIDs[4] = go->GetGUID();
|
||||
break;
|
||||
case GO_CIRCLE_SULFURON:
|
||||
_circlesGUIDs[6] = go->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
void SetData(uint32 type, uint32 data) override
|
||||
{
|
||||
if (type == DATA_RAGNAROS_ADDS)
|
||||
{
|
||||
@@ -105,7 +114,7 @@ class instance_molten_core : public InstanceMapScript
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
uint32 GetData(uint32 type) const override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
@@ -116,7 +125,7 @@ class instance_molten_core : public InstanceMapScript
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 type) const
|
||||
uint64 GetData64(uint32 type) const override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
@@ -129,33 +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 (_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]);
|
||||
@@ -168,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;
|
||||
|
||||
@@ -182,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)
|
||||
{
|
||||
@@ -190,7 +206,6 @@ class instance_molten_core : public InstanceMapScript
|
||||
return;
|
||||
}
|
||||
|
||||
_isLoading = true;
|
||||
OUT_LOAD_INST_DATA(data);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
@@ -200,44 +215,32 @@ 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;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
|
||||
@@ -47,11 +47,20 @@ enum Creatures
|
||||
NPC_RAGNAROS = 11502,
|
||||
NPC_FLAMEWAKER_HEALER = 11663,
|
||||
NPC_FLAMEWAKER_ELITE = 11664,
|
||||
NPC_CORE_RAGER = 11672,
|
||||
NPC_CORE_HOUND = 11671,
|
||||
};
|
||||
|
||||
enum GameObjects
|
||||
{
|
||||
GO_CACHE_OF_THE_FIRELORD = 179703,
|
||||
GO_CIRCLE_SULFURON = 178187,
|
||||
GO_CIRCLE_BARON = 178188,
|
||||
GO_CIRCLE_SHAZZRAH = 178189,
|
||||
GO_CIRCLE_GOLEMAGG = 178190,
|
||||
GO_CIRCLE_GARR = 178191,
|
||||
GO_CIRCLE_MAGMADAR = 178192,
|
||||
GO_CIRCLE_GEHENNAS = 178193,
|
||||
};
|
||||
|
||||
enum Data
|
||||
|
||||
Reference in New Issue
Block a user