Choix du compagnon : la fermeture du dialogue effacait le choix autorise

Preuve dans Server.log : "tried to respond to invalid player choice 234
(allowed 0)". Le clic atteignait bien le serveur, mais celui-ci avait
memorise 0 au lieu de 234.

Enchainement fautif dans npc_korvas_bloodthorn::OnGossipSelect :
  1. CastSpell(196650) -> EffectLaunchQuestChoice -> SendPlayerChoice(234)
     inscrit PlayerChoiceId = 234
  2. CloseGossipMenuFor() -> SendCloseGossip() -> _interactionData.Reset()
     remet PlayerChoiceId a 0
La fenetre saffichait (le paquet etait deja parti) mais le serveur avait
oublie quel choix il autorisait. Cest pour cette raison que le tome de
Mardum fonctionne : lui ne ferme pas le dialogue.

Corrige en fermant AVANT de lancer le sort. Balayage de tout le core :
34 occurrences du motif CastSpell puis CloseGossipMenuFor, mais une seule
autre concerne un sort qui affiche un choix (class_hall_hunter.cpp), les
autres lancent des sorts ordinaires ou reinitialiser est sans effet.
Les deux sont corrigees.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
SylvaniaCore deploy
2026-08-21 22:42:40 +02:00
parent d377beadaf
commit 95913f26d2
2 changed files with 12 additions and 2 deletions
@@ -220,8 +220,12 @@ public:
switch (action)
{
case GOSSIP_ACTION_INFO_DEF + 1:
player->CastSpell(player, SPELL_PLAYERCHOICE, true); // Display player spec choice
// ORDRE CRITIQUE : fermer AVANT de lancer le sort. SendCloseGossip()
// appelle _interactionData.Reset(), ce qui efface le PlayerChoiceId
// que SendPlayerChoice vient d'inscrire, et le serveur rejette
// ensuite le clic du joueur.
CloseGossipMenuFor(player);
player->CastSpell(player, SPELL_PLAYERCHOICE, true); // Display player spec choice
break;
}
return true;
@@ -1428,8 +1428,14 @@ public:
npc_korvas_bloodthorn() : CreatureScript("npc_korvas_bloodthorn") { }
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
{
player->CastSpell(player, SPELL_NEW_DIRECTION_CHOICE_KAYN_OR_ALTRUIS, true); // Display follower choice
// ORDRE CRITIQUE : fermer le dialogue AVANT de lancer le sort.
// PlayerMenu::SendCloseGossip() appelle _interactionData.Reset(), ce qui
// efface le PlayerChoiceId que SendPlayerChoice vient d'inscrire. Dans
// l'ordre inverse, la fenetre s'affichait bien mais le serveur avait
// oublie quel choix il autorisait, et rejetait le clic du joueur :
// "tried to respond to invalid player choice 234 (allowed 0)"
CloseGossipMenuFor(player);
player->CastSpell(player, SPELL_NEW_DIRECTION_CHOICE_KAYN_OR_ALTRUIS, true); // Display follower choice
return true;
}
};