From 8b16f7d243d54a19e6e7d5bf79bf44427fa84bfe Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 15 Sep 2024 07:48:11 -0300 Subject: [PATCH] =?UTF-8?q?fix(Scripts/BlackTemple):=20Implement=20emotes?= =?UTF-8?q?=20when=20opening=20Najentus=20and=20=E2=80=A6=20(#19946)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(Scripts/BlackTemple): Implement emotes when opening Najentus and Den of Mortal Delights * only check if state is done --- .../rev_1726132179936077700.sql | 2 ++ src/server/game/Instances/InstanceScript.cpp | 18 ++++++++++ src/server/game/Instances/InstanceScript.h | 4 +++ .../Outland/BlackTemple/black_temple.h | 12 +++++-- .../BlackTemple/instance_black_temple.cpp | 34 +++++++++++++------ 5 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1726132179936077700.sql diff --git a/data/sql/updates/pending_db_world/rev_1726132179936077700.sql b/data/sql/updates/pending_db_world/rev_1726132179936077700.sql new file mode 100644 index 000000000..8851a0966 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1726132179936077700.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_text` SET `TextRange` = 3 WHERE `CreatureId` = 22984; diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 122257c15..593aab04a 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -761,6 +761,24 @@ void InstanceScript::LoadInstanceSavedGameobjectStateData() } } +bool InstanceScript::AllBossesDone() const +{ + for (auto const& boss : bosses) + if (boss.state != DONE) + return false; + + return true; +} + +bool InstanceScript::AllBossesDone(std::initializer_list bossIds) const +{ + for (auto const& bossId : bossIds) + if (!IsBossDone(bossId)) + return false; + + return true; +} + std::string InstanceScript::GetBossStateName(uint8 state) { // See enum EncounterState in InstanceScript.h diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index d65bb0349..c5add7eb2 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -275,6 +275,10 @@ public: void LoadInstanceSavedGameobjectStateData(); + [[nodiscard]] bool IsBossDone(uint32 bossId) const { return GetBossState(bossId) == DONE; }; + [[nodiscard]] bool AllBossesDone() const; + [[nodiscard]] bool AllBossesDone(std::initializer_list bossIds) const; + TaskScheduler scheduler; protected: void SetHeaders(std::string const& dataHeaders); diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h index 4b88eff27..ac876e1c7 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.h +++ b/src/server/scripts/Outland/BlackTemple/black_temple.h @@ -42,7 +42,8 @@ enum DataTypes DATA_GATHIOS_THE_SHATTERER = 12, DATA_HIGH_NETHERMANCER_ZEREVOR = 13, DATA_LADY_MALANDE = 14, - DATA_VERAS_DARKSHADOW = 15 + DATA_VERAS_DARKSHADOW = 15, + DATA_BLACK_TEMPLE_TRIGGER = 16 }; enum CreatureIds @@ -82,7 +83,8 @@ enum CreatureIds NPC_ASHTONGUE_STALKER = 23374, NPC_STORM_FURY = 22848, - NPC_DRAGON_TURTLE = 22885 + NPC_DRAGON_TURTLE = 22885, + NPC_BLACK_TEMPLE_TRIGGER = 22984 }; enum GameObjectIds @@ -113,6 +115,12 @@ enum MiscIds SPELL_SUMMON_SHADOWFIENDS = 41159 }; +enum Texts +{ + EMOTE_NAJENTUS_DEFEATED = 0, + EMOTE_LOWER_TEMPLE_DEFEATED = 1 +}; + template inline AI* GetBlackTempleAI(T* obj) { diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index f324168f4..7a60d7a37 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -62,6 +62,7 @@ ObjectData const creatureData[] = { NPC_VERAS_DARKSHADOW, DATA_VERAS_DARKSHADOW }, { NPC_AKAMA_ILLIDAN, DATA_AKAMA_ILLIDAN }, { NPC_ILLIDAN_STORMRAGE, DATA_ILLIDAN_STORMRAGE }, + { NPC_BLACK_TEMPLE_TRIGGER, DATA_BLACK_TEMPLE_TRIGGER }, { 0, 0 } }; @@ -165,18 +166,31 @@ public: if (!InstanceScript::SetBossState(type, state)) return false; - if (type == DATA_SHADE_OF_AKAMA && state == DONE) + if (state == DONE) { - for (ObjectGuid const& guid : ashtongueGUIDs) - if (Creature* ashtongue = instance->GetCreature(guid)) - ashtongue->SetFaction(FACTION_ASHTONGUE_DEATHSWORN); - } - else if (type == DATA_ILLIDARI_COUNCIL && state == DONE) - { - if (Creature* akama = GetCreature(DATA_AKAMA_ILLIDAN)) - akama->AI()->DoAction(0); - } + switch (type) + { + case DATA_HIGH_WARLORD_NAJENTUS: + if (Creature* trigger = GetCreature(DATA_BLACK_TEMPLE_TRIGGER)) + trigger->AI()->Talk(EMOTE_NAJENTUS_DEFEATED); + break; + case DATA_SHADE_OF_AKAMA: + for (ObjectGuid const& guid : ashtongueGUIDs) + if (Creature* ashtongue = instance->GetCreature(guid)) + ashtongue->SetFaction(FACTION_ASHTONGUE_DEATHSWORN); + break; + case DATA_ILLIDARI_COUNCIL: + if (Creature* akama = GetCreature(DATA_AKAMA_ILLIDAN)) + akama->AI()->DoAction(0); + break; + default: + break; + } + if (AllBossesDone({ DATA_SHADE_OF_AKAMA, DATA_TERON_GOREFIEND, DATA_GURTOGG_BLOODBOIL, DATA_RELIQUARY_OF_SOULS })) + if (Creature* trigger = GetCreature(DATA_BLACK_TEMPLE_TRIGGER)) + trigger->AI()->Talk(EMOTE_LOWER_TEMPLE_DEFEATED); + } return true; }