From 81b37487dd3f3348ed311c34575de9dfd6508554 Mon Sep 17 00:00:00 2001 From: SylvaniaCore deploy Date: Tue, 18 Aug 2026 01:06:50 +0200 Subject: [PATCH] Quete 40051 (Secrets gangrenes) : le choix de specialisation ne validait rien Signale en jeu : le tome ouvre bien le choix, on selectionne Devastation ou Vengeance, mais la quete reste incomplete. Trois defauts : 1. Le script implementait OnCompleteQuestChoice, un hook declare dans ScriptMgr mais appele DE NULLE PART. Le seul hook invoque par le core est OnPlayerChoiceResponse (QuestHandler.cpp). La methode etait donc du code mort - preuve mesuree en base : le joueur navait pas appris le sort 200749 et son activeTalentGroup restait a 0. 2. Aucun credit de quete nulle part, alors que 40051 exige lentree 99071. 3. La branche Devastation nactivait pas la specialisation, contrairement a celle de Vengeance : asymetrie qui laissait le joueur sans spe. AssertEntry remplace par LookupEntry avec garde, pour ne pas abattre le serveur si un identifiant de specialisation manquait. Co-Authored-By: Claude Opus 4.8 --- .../DemonHunterZones/zone_mardum.cpp | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/server/scripts/BrokenIsles/DemonHunterZones/zone_mardum.cpp b/src/server/scripts/BrokenIsles/DemonHunterZones/zone_mardum.cpp index 4d8fe9e..f978192 100644 --- a/src/server/scripts/BrokenIsles/DemonHunterZones/zone_mardum.cpp +++ b/src/server/scripts/BrokenIsles/DemonHunterZones/zone_mardum.cpp @@ -91,6 +91,7 @@ enum MardumTexts enum MardumCreatures { NPC_POWER_QUEST_KILL_CREDIT = 105946, + NPC_FEL_SECRETS_KILL_CREDIT = 99071, NPC_COLOSSAL_INFERNAL = 96159, NPC_LEGION_GATEWAY_KILL_CREDIT = 94406, NPC_FIRST_SUMMONED_GUARDIAN_QUEST_KILL_CREDIT = 97831, @@ -915,8 +916,11 @@ class PlayerScript_mardum_spec_choice : public PlayerScript public: PlayerScript_mardum_spec_choice() : PlayerScript("PlayerScript_mardum_spec_choice") {} -// OnPlayerChoiceResponse - void OnCompleteQuestChoice(Player* player, uint32 choiceID, uint32 responseID) + // Ce hook s'appelle OnPlayerChoiceResponse : c'est le seul que le core + // invoque (QuestHandler.cpp, sur reception du choix). OnCompleteQuestChoice + // existe dans ScriptMgr mais n'est appele de nulle part - la methode etait + // donc du code mort, et choisir sa specialisation ne faisait rien. + void OnPlayerChoiceResponse(Player* player, uint32 choiceID, uint32 responseID) override { if (choiceID != PLAYER_CHOICE_DH_SPEC_SELECTION) return; @@ -927,17 +931,25 @@ public: { case PLAYER_CHOICE_DH_SPEC_SELECTION_DEVASTATION: player->CastSpell(player, 194940, true); + // La branche Devastation n'activait pas la specialisation, au + // contraire de Vengeance : le joueur restait sans spe. + if (ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(577)) + player->ActivateTalentGroup(spec); break; case PLAYER_CHOICE_DH_SPEC_SELECTION_VENGEANCE: player->CastSpell(player, 194939, true); - if (ChrSpecializationEntry const* spec = sChrSpecializationStore.AssertEntry(581)) + if (ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(581)) player->ActivateTalentGroup(spec); break; default: - break; + return; } + + // Credit de la quete 40051 (Secrets gangrenes) : aucun code ne + // l'accordait, la quete restait indefiniment incomplete. + player->KilledMonsterCredit(NPC_FEL_SECRETS_KILL_CREDIT); } };