From fe2d1150b38860abcd81eb2e60a30cd57381ddd6 Mon Sep 17 00:00:00 2001 From: Tereneckla Date: Thu, 5 Jun 2025 14:43:35 +0000 Subject: [PATCH] fix(Core/LFG): Lock Deathknights from the dungeonfinder until they complete their starting zone (#22270) --- .../rev_1748972350605073197.sql | 2 ++ src/server/game/DungeonFinding/LFGMgr.cpp | 2 ++ .../EasternKingdoms/zone_stormwind_city.cpp | 22 +++++++++++++++ .../scripts/Kalimdor/zone_orgrimmar.cpp | 27 ++++++++++++------- 4 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1748972350605073197.sql diff --git a/data/sql/updates/pending_db_world/rev_1748972350605073197.sql b/data/sql/updates/pending_db_world/rev_1748972350605073197.sql new file mode 100644 index 000000000..00f6a5bb1 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1748972350605073197.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `ScriptName` = 'npc_king_varian_wrynn' WHERE (`entry` = 29611); diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 3752520fc..b8c434f10 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -422,6 +422,8 @@ namespace lfg lockData = LFG_LOCKSTATUS_TOO_HIGH_LEVEL; else if (dungeon->seasonal && !IsSeasonActive(dungeon->id)) lockData = LFG_LOCKSTATUS_NOT_IN_SEASON; + else if (player->IsClass(CLASS_DEATH_KNIGHT) && !player->IsGameMaster() &&!(player->IsQuestRewarded(13188) || player->IsQuestRewarded(13189))) + lockData = LFG_LOCKSTATUS_QUEST_NOT_COMPLETED; else if (ar) { // Check required items diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index 103c17bb9..437b508c8 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -472,10 +472,32 @@ public: } }; +enum KingVarianWrynn : uint32 +{ + // Deathknight Starting Zone End + QUEST_WHERE_KINGS_WALK = 13188, +}; + +class npc_king_varian_wrynn : public CreatureScript +{ +public: + npc_king_varian_wrynn() : CreatureScript("npc_king_varian_wrynn") { } + + bool OnQuestReward(Player* player, Creature* /*creature*/, Quest const* quest, uint32 /*item*/) override + { + + if (quest->GetQuestId() == QUEST_WHERE_KINGS_WALK) + sLFGMgr->InitializeLockedDungeons(player); + + return true; + } +}; + void AddSC_stormwind_city() { new npc_tyrion(); new npc_tyrion_spybot(); new npc_lord_gregor_lescovar(); new npc_marzon_silent_blade(); + new npc_king_varian_wrynn(); } diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp index 8646a412b..e3dfbe693 100644 --- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp +++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "TaskScheduler.h" +#include "LFGMgr.h" /*###### ## npc_shenthul @@ -152,9 +153,12 @@ enum ThrallWarchief : uint32 GO_UNADORNED_SPIKE = 175787, // What the Wind Carries (ID: 6566) - QUEST_WHAT_THE_WIND_CARRIES = 6566, - GOSSIP_MENU_THRALL = 3664, - GOSSIP_RESPONSE_THRALL_FIRST = 5733, + QUEST_WHAT_THE_WIND_CARRIES = 6566, + GOSSIP_MENU_THRALL = 3664, + GOSSIP_RESPONSE_THRALL_FIRST = 5733, + + // Deathknight Starting Zone End + QUEST_WARCHIEFS_BLESSING = 13189, }; const Position heraldOfThrallPos = { -462.404f, -2637.68f, 96.0656f, 5.8606f }; @@ -204,14 +208,19 @@ public: return true; } - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*item*/) override + bool OnQuestReward(Player* player, Creature* creature, Quest const* quest, uint32 /*item*/) override { - if (quest->GetQuestId() == QUEST_FOR_THE_HORDE) + switch (quest->GetQuestId()) { - if (creature && creature->AI()) - { - creature->AI()->DoAction(ACTION_START_TALKING); - } + case (QUEST_FOR_THE_HORDE): + if (creature && creature->AI()) + creature->AI()->DoAction(ACTION_START_TALKING); + break; + case (QUEST_WARCHIEFS_BLESSING): + sLFGMgr->InitializeLockedDungeons(player); + break; + default: + break; } return true;