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:
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user