diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index 333ef040f..182b4588b 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -105,7 +105,7 @@ public: events.Reset(); summons.DespawnAll(); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false); - instance->SetData(DATA_KAELTHAS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_KAELTHAS, NOT_STARTED); me->SetImmuneToAll(false); } @@ -125,12 +125,17 @@ public: void JustDied(Unit*) override { - instance->SetData(DATA_KAELTHAS_EVENT, DONE); + instance->SetBossState(DATA_KAELTHAS, DONE); + + if (GameObject* orb = instance->GetGameObject(DATA_ESCAPE_ORB)) + { + orb->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE); + } } void JustEngagedWith(Unit* /*who*/) override { - instance->SetData(DATA_KAELTHAS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_KAELTHAS, IN_PROGRESS); me->SetInCombatWithZone(); events.ScheduleEvent(EVENT_SPELL_FIREBALL, 0); diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index f15de20a8..f47af976e 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -105,7 +105,7 @@ public: { PlayersKilled = SAY_PLAYER_KILLED; HelpersKilled = SAY_HELPER_DIED; - instance->SetData(DATA_DELRISSA_EVENT, NOT_STARTED); + instance->SetBossState(DATA_DELRISSA, NOT_STARTED); summons.Respawn(); me->SetLootMode(0); @@ -141,7 +141,7 @@ public: { me->loot.clear(); me->loot.FillLoot(me->GetCreatureTemplate()->lootid, LootTemplates_Creature, me->GetLootRecipient(), false, false, 1, me); - instance->SetData(DATA_DELRISSA_EVENT, DONE); + instance->SetBossState(DATA_DELRISSA, DONE); me->SetDynamicFlag(UNIT_DYNFLAG_LOOTABLE); } ++HelpersKilled; @@ -151,7 +151,7 @@ public: { Talk(SAY_AGGRO); summons.DoZoneInCombat(); - instance->SetData(DATA_DELRISSA_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_DELRISSA, IN_PROGRESS); events.ScheduleEvent(EVENT_SPELL_FLASH_HEAL, 15000); events.ScheduleEvent(EVENT_SPELL_RENEW, 10000); @@ -177,7 +177,7 @@ public: Talk(SAY_DEATH); if (HelpersKilled == MAX_ACTIVE_HELPERS + 1) - instance->SetData(DATA_DELRISSA_EVENT, DONE); + instance->SetBossState(DATA_DELRISSA, DONE); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp index d14c9ff3e..2c14c0fba 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp @@ -106,7 +106,7 @@ public: events.Reset(); summons.DespawnAll(); SpawnCrystals(); - instance->SetData(DATA_SELIN_EVENT, NOT_STARTED); + instance->SetBossState(DATA_SELIN_FIREHEART, NOT_STARTED); CrystalGUID.Clear(); me->SetPower(POWER_MANA, 0); } @@ -114,7 +114,7 @@ public: void JustEngagedWith(Unit* /*who*/) override { Talk(SAY_AGGRO); - instance->SetData(DATA_SELIN_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_SELIN_FIREHEART, IN_PROGRESS); events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 2500, 1); events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000); @@ -134,7 +134,7 @@ public: { Talk(SAY_DEATH); - instance->SetData(DATA_SELIN_EVENT, DONE); // Encounter complete! + instance->SetBossState(DATA_SELIN_FIREHEART, DONE); // Encounter complete! summons.DespawnAll(); } diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp index 574afed7d..f550b9554 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp @@ -87,7 +87,7 @@ public: summons.DespawnAll(); IntervalHealthAmount = 1; - instance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_VEXALLUS, NOT_STARTED); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK); } @@ -100,14 +100,14 @@ public: void JustDied(Unit* /*killer*/) override { summons.DespawnAll(); - instance->SetData(DATA_VEXALLUS_EVENT, DONE); + instance->SetBossState(DATA_VEXALLUS, DONE); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK); } void JustEngagedWith(Unit* /*who*/) override { Talk(SAY_AGGRO); - instance->SetData(DATA_VEXALLUS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_VEXALLUS, IN_PROGRESS); events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000); events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 5000); diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp index 315a7df18..bf73f9095 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp @@ -26,6 +26,21 @@ ObjectData const creatureData[] = { 0, 0 } }; +ObjectData const gameobjectData[] = +{ + { GO_ESCAPE_ORB, DATA_ESCAPE_ORB }, + { 0, 0, } +}; + +DoorData const doorData[] = +{ + { GO_SELIN_DOOR, DATA_SELIN_FIREHEART, DOOR_TYPE_PASSAGE }, + { GO_SELIN_ENCOUNTER_DOOR, DATA_SELIN_FIREHEART, DOOR_TYPE_ROOM }, + { GO_VEXALLUS_DOOR, DATA_VEXALLUS, DOOR_TYPE_PASSAGE }, + { GO_DELRISSA_DOOR, DATA_DELRISSA, DOOR_TYPE_PASSAGE }, + { 0, 0, DOOR_TYPE_ROOM } // END +}; + Position const KalecgosSpawnPos = { 164.3747f, -397.1197f, 2.151798f, 1.66219f }; class instance_magisters_terrace : public InstanceMapScript @@ -38,47 +53,16 @@ public: instance_magisters_terrace_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); - LoadObjectData(creatureData, nullptr); + SetBossNumber(MAX_ENCOUNTER); + LoadObjectData(creatureData, gameobjectData); + LoadDoorData(doorData); } - uint32 Encounter[MAX_ENCOUNTER]; - - ObjectGuid VexallusDoorGUID; - ObjectGuid SelinDoorGUID; - ObjectGuid SelinEncounterDoorGUID; - ObjectGuid DelrissaDoorGUID; - ObjectGuid KaelDoorGUID; ObjectGuid EscapeOrbGUID; ObjectGuid DelrissaGUID; ObjectGuid KaelGUID; - void Initialize() override - { - memset(&Encounter, 0, sizeof(Encounter)); - } - - bool IsEncounterInProgress() const override - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (Encounter[i] == IN_PROGRESS) - return true; - return false; - } - - uint32 GetData(uint32 identifier) const override - { - switch (identifier) - { - case DATA_SELIN_EVENT: - case DATA_VEXALLUS_EVENT: - case DATA_DELRISSA_EVENT: - case DATA_KAELTHAS_EVENT: - return Encounter[identifier]; - } - return 0; - } - void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) override { if (eventId == EVENT_SPAWN_KALECGOS) @@ -97,37 +81,6 @@ public: } } - void SetData(uint32 identifier, uint32 data) override - { - switch (identifier) - { - case DATA_SELIN_EVENT: - HandleGameObject(SelinDoorGUID, data == DONE); - HandleGameObject(SelinEncounterDoorGUID, data != IN_PROGRESS); - Encounter[identifier] = data; - break; - case DATA_VEXALLUS_EVENT: - if (data == DONE) - HandleGameObject(VexallusDoorGUID, true); - Encounter[identifier] = data; - break; - case DATA_DELRISSA_EVENT: - if (data == DONE) - HandleGameObject(DelrissaDoorGUID, true); - Encounter[identifier] = data; - break; - case DATA_KAELTHAS_EVENT: - HandleGameObject(KaelDoorGUID, data != IN_PROGRESS); - if (data == DONE) - if (GameObject* escapeOrb = instance->GetGameObject(EscapeOrbGUID)) - escapeOrb->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE); - Encounter[identifier] = data; - break; - } - - SaveToDB(); - } - void OnCreatureCreate(Creature* creature) override { switch (creature->GetEntry()) @@ -148,60 +101,11 @@ public: InstanceScript::OnCreatureCreate(creature); } - void OnGameObjectCreate(GameObject* go) override - { - switch (go->GetEntry()) - { - case GO_SELIN_DOOR: - if (GetData(DATA_SELIN_EVENT) == DONE) - HandleGameObject(ObjectGuid::Empty, true, go); - SelinDoorGUID = go->GetGUID(); - break; - case GO_SELIN_ENCOUNTER_DOOR: - SelinEncounterDoorGUID = go->GetGUID(); - break; - - case GO_VEXALLUS_DOOR: - if (GetData(DATA_VEXALLUS_EVENT) == DONE) - HandleGameObject(ObjectGuid::Empty, true, go); - VexallusDoorGUID = go->GetGUID(); - break; - - case GO_DELRISSA_DOOR: - if (GetData(DATA_DELRISSA_EVENT) == DONE) - HandleGameObject(ObjectGuid::Empty, true, go); - DelrissaDoorGUID = go->GetGUID(); - break; - case GO_KAEL_DOOR: - KaelDoorGUID = go->GetGUID(); - break; - case GO_ESCAPE_ORB: - if (GetData(DATA_KAELTHAS_EVENT) == DONE) - go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE); - EscapeOrbGUID = go->GetGUID(); - break; - } - } - - // @todo: Use BossStates. This is for code compatibility - void ReadSaveDataMore(std::istringstream& data) override - { - data >> Encounter[1]; - data >> Encounter[2]; - data >> Encounter[3]; - } - - void WriteSaveDataMore(std::ostringstream& data) override - { - data << Encounter[0] << ' ' << Encounter[1] << ' ' << Encounter[2] << ' ' << Encounter[3]; - } - ObjectGuid GetGuidData(uint32 identifier) const override { - switch (identifier) + if (identifier == NPC_DELRISSA) { - case NPC_DELRISSA: - return DelrissaGUID; + return DelrissaGUID; } return ObjectGuid::Empty; diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h index d265866cd..e985711ac 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h @@ -28,13 +28,14 @@ enum MTData { - DATA_SELIN_EVENT = 0, - DATA_VEXALLUS_EVENT = 1, - DATA_DELRISSA_EVENT = 2, - DATA_KAELTHAS_EVENT = 3, + DATA_SELIN_FIREHEART = 0, + DATA_VEXALLUS = 1, + DATA_DELRISSA = 2, + DATA_KAELTHAS = 3, MAX_ENCOUNTER = 4, - DATA_KALECGOS = 5 + DATA_KALECGOS = 5, + DATA_ESCAPE_ORB = 6 }; enum MTCreatures