From e5aa42dd443488d2b1a59910ef52d0ab5f7cf568 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 12 Sep 2024 06:10:05 -0300 Subject: [PATCH 1/2] fix(Scripts/BlackTemple): Implement emotes when opening Najentus and Den of Mortal Delights --- .../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 | 33 ++++++++++++++----- 5 files changed, 58 insertions(+), 11 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 0000000000000..8851a0966dcf4 --- /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 122257c15221e..593aab04aa6e9 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 d65bb0349ffad..c5add7eb201b8 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -275,6 +275,10 @@ class InstanceScript : public ZoneScript 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 4b88eff2798be..ac876e1c7926c 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 f324168f483c1..f899b70b0d242 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,32 @@ class instance_black_temple : public InstanceMapScript 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; } From 698442f40279f076949347dcbee4864d968bb978 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 12 Sep 2024 07:56:02 -0300 Subject: [PATCH 2/2] only check if state is done --- .../Outland/BlackTemple/instance_black_temple.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index f899b70b0d242..7a60d7a375a6d 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -186,12 +186,11 @@ class instance_black_temple : public InstanceMapScript 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); + 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; }