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 <noreply@anthropic.com>
This commit is contained in:
SylvaniaCore deploy
2026-08-18 01:06:50 +02:00
parent c9f4c87e61
commit 81b37487dd
@@ -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);
}
};