From 69c9781828676007448a23840373bc0a826a37c0 Mon Sep 17 00:00:00 2001 From: SylvaniaCore deploy Date: Fri, 21 Aug 2026 22:28:59 +0200 Subject: [PATCH] Quatre hooks morts OnCompleteQuestChoice + quete 40373 injouable Signale en jeu : choisir entre Kayn et Altruis ne declenche rien. 1) HOOK MORT, 4 occurrences. OnCompleteQuestChoice est declare dans ScriptMgr mais appele DE NULLE PART ; le seul hook invoque a la reception dun choix est OnPlayerChoiceResponse (QuestHandler.cpp). Corrige dans : zone_vault_of_wardens.cpp choix Kayn / Altruis zone_legion_dalaran_legion.cpp Dalaran class_hall_dh.cpp fief chasseur de demons class_hall_hunter.cpp fief chasseur Meme defaut que celui corrige a Mardum (commit 81b37487). Dautres fichiers (class_hall_monk, class_hall_artifact_choices) utilisaient deja le bon nom, ce qui confirme le diagnostic. 2) CREDIT MANQUANT. Le handler ne lancait quun sort : lobjectif 99278 (choisir entre Kayn et Altruis) de la quete 40373 netait accorde par rien. 3) QUETE SANS DONNEUR. 40373 a un recepteur et deux objectifs coherents mais aucune ligne creature_queststarter. Attribuee a Korvas 97644 : elle en est deja la receptrice, cest son propre script qui ouvre la fenetre de choix, elle recoit aussi la quete precedente 39686, et elle porte npcflag=3. Co-Authored-By: Claude Opus 4.8 --- sql/sylvania/vault_new_direction_starter.sql | 23 +++++++++++++++++++ .../BrokenIsles/ClassHalls/class_hall_dh.cpp | 6 ++++- .../ClassHalls/class_hall_hunter.cpp | 6 ++++- .../zone_vault_of_wardens.cpp | 16 +++++++++++-- .../Zones/zone_legion_dalaran_legion.cpp | 6 ++++- 5 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 sql/sylvania/vault_new_direction_starter.sql diff --git a/sql/sylvania/vault_new_direction_starter.sql b/sql/sylvania/vault_new_direction_starter.sql new file mode 100644 index 0000000..2b69760 --- /dev/null +++ b/sql/sylvania/vault_new_direction_starter.sql @@ -0,0 +1,23 @@ +-- ===================================================================== +-- Quête 40373 « Une nouvelle direction » — aucun donneur déclaré +-- +-- La quête existe, a un récepteur (Kor'vas Bloodthorn 97644) et deux +-- objectifs cohérents (crédit 99278 « choisir entre Kayn et Altruis », +-- crédit 100166 « Bassin du Jugement consulté »), mais AUCUNE ligne +-- creature_queststarter : personne ne pouvait la donner. +-- +-- On l'attribue à Kor'vas 97644, et ce n'est pas un choix arbitraire : +-- * elle en est déjà la RÉCEPTRICE (creature_questender) ; +-- * c'est son propre script, npc_korvas_bloodthorn, qui déclenche la +-- fenêtre de choix Kayn/Altruis via OnGossipSelect ; +-- * elle est aussi réceptrice de la quête précédente, 39686 +-- « Jusqu'au sommet », donc le joueur se trouve devant elle au bon +-- moment de la chaîne ; +-- * elle porte npcflag=3 (dialogue + donneur), elle est donc déjà +-- techniquement prête à donner une quête. +-- +-- Rechargeable à chaud : reload creature_queststarter +-- ===================================================================== + +DELETE FROM `creature_queststarter` WHERE `id`=97644 AND `quest`=40373; +INSERT INTO `creature_queststarter` (`id`,`quest`) VALUES (97644,40373); diff --git a/src/server/scripts/BrokenIsles/ClassHalls/class_hall_dh.cpp b/src/server/scripts/BrokenIsles/ClassHalls/class_hall_dh.cpp index 9fecea5..6055503 100644 --- a/src/server/scripts/BrokenIsles/ClassHalls/class_hall_dh.cpp +++ b/src/server/scripts/BrokenIsles/ClassHalls/class_hall_dh.cpp @@ -117,7 +117,11 @@ class PlayerScript_DH_artifact_choice : public PlayerScript public: PlayerScript_DH_artifact_choice() : PlayerScript("PlayerScript_DH_artifact_choice") {} - void OnCompleteQuestChoice(Player* player, uint32 choiceID, uint32 responseID) + // Hook renomme : OnCompleteQuestChoice est declare dans ScriptMgr mais + // appele DE NULLE PART. Le seul hook que le core invoque a la reception + // dun choix est OnPlayerChoiceResponse (QuestHandler.cpp). Cette methode + // etait donc du code mort. + void OnPlayerChoiceResponse(Player* player, uint32 choiceID, uint32 responseID) override { if (choiceID != PLAYER_CHOICE_DH_ARTIFACT_SELECTION) return; diff --git a/src/server/scripts/BrokenIsles/ClassHalls/class_hall_hunter.cpp b/src/server/scripts/BrokenIsles/ClassHalls/class_hall_hunter.cpp index a23849c..1152c66 100644 --- a/src/server/scripts/BrokenIsles/ClassHalls/class_hall_hunter.cpp +++ b/src/server/scripts/BrokenIsles/ClassHalls/class_hall_hunter.cpp @@ -138,7 +138,11 @@ class PlayerScript_hunter_artifact_choice : public PlayerScript public: PlayerScript_hunter_artifact_choice() : PlayerScript("PlayerScript_hunter_artifact_choice") {} - void OnCompleteQuestChoice(Player* player, uint32 choiceID, uint32 responseID) + // Hook renomme : OnCompleteQuestChoice est declare dans ScriptMgr mais + // appele DE NULLE PART. Le seul hook que le core invoque a la reception + // dun choix est OnPlayerChoiceResponse (QuestHandler.cpp). Cette methode + // etait donc du code mort. + void OnPlayerChoiceResponse(Player* player, uint32 choiceID, uint32 responseID) override { if (choiceID != PLAYER_CHOICE_HUNTER_ARTIFACT_SELECTION) return; diff --git a/src/server/scripts/BrokenIsles/DemonHunterZones/zone_vault_of_wardens.cpp b/src/server/scripts/BrokenIsles/DemonHunterZones/zone_vault_of_wardens.cpp index 21da668..46c5033 100644 --- a/src/server/scripts/BrokenIsles/DemonHunterZones/zone_vault_of_wardens.cpp +++ b/src/server/scripts/BrokenIsles/DemonHunterZones/zone_vault_of_wardens.cpp @@ -1419,6 +1419,7 @@ enum eChoices SPELL_NEW_DIRECTION_CHOICE_KAYN_OR_ALTRUIS = 196650, SPELL_NEW_DIRECTION_CHOSE_ALTRUIS = 196662, SPELL_NEW_DIRECTION_CHOSE_KAYN = 196661, + NPC_CREDIT_FOLLOWER_CHOSEN = 99278, }; class npc_korvas_bloodthorn : public CreatureScript @@ -1438,7 +1439,11 @@ class PlayerScript_follower_choice : public PlayerScript public: PlayerScript_follower_choice() : PlayerScript("PlayerScript_follower_choice") {} - void OnCompleteQuestChoice(Player* player, uint32 choiceID, uint32 responseID) + // Hook renomme : OnCompleteQuestChoice est declare dans ScriptMgr mais + // appele DE NULLE PART. Le seul hook que le core invoque a la reception + // dun choix est OnPlayerChoiceResponse (QuestHandler.cpp). Cette methode + // etait donc du code mort. + void OnPlayerChoiceResponse(Player* player, uint32 choiceID, uint32 responseID) override { if (choiceID != PLAYER_CHOICE_DH_FOLLOWER_SELECTION) return; @@ -1452,8 +1457,15 @@ public: player->CastSpell(player, SPELL_NEW_DIRECTION_CHOSE_ALTRUIS, true); break; default: - break; + return; } + + // Objectif « Choose between Kayn and Altruis » de la quete 40373 + // (Une nouvelle direction). Aucune source ne laccordait : ni ligne + // smart_scripts, ni code. La quete restait donc bloquee meme une fois + // le choix effectue. + if (player->GetQuestStatus(QUEST_A_NEW_DIRECTION) == QUEST_STATUS_INCOMPLETE) + player->KilledMonsterCredit(NPC_CREDIT_FOLLOWER_CHOSEN); } }; diff --git a/src/server/scripts/BrokenIsles/Zones/zone_legion_dalaran_legion.cpp b/src/server/scripts/BrokenIsles/Zones/zone_legion_dalaran_legion.cpp index 8e5833f..73be79b 100644 --- a/src/server/scripts/BrokenIsles/Zones/zone_legion_dalaran_legion.cpp +++ b/src/server/scripts/BrokenIsles/Zones/zone_legion_dalaran_legion.cpp @@ -342,7 +342,11 @@ class player_artifact_choice : public PlayerScript public: player_artifact_choice() : PlayerScript("player_artifact_choice") { } - void OnCompleteQuestChoice(Player* player, uint32 choiceId, uint32 /*responseId*/) + // Hook renomme : OnCompleteQuestChoice est declare dans ScriptMgr mais + // appele DE NULLE PART. Le seul hook que le core invoque a la reception + // dun choix est OnPlayerChoiceResponse (QuestHandler.cpp). Cette methode + // etait donc du code mort. + void OnPlayerChoiceResponse(Player* player, uint32 choiceId, uint32 /*responseId*/) override { switch (choiceId) {