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)
|
switch (action)
|
||||||
{
|
{
|
||||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
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);
|
CloseGossipMenuFor(player);
|
||||||
|
player->CastSpell(player, SPELL_PLAYERCHOICE, true); // Display player spec choice
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1428,8 +1428,14 @@ public:
|
|||||||
npc_korvas_bloodthorn() : CreatureScript("npc_korvas_bloodthorn") { }
|
npc_korvas_bloodthorn() : CreatureScript("npc_korvas_bloodthorn") { }
|
||||||
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
|
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);
|
CloseGossipMenuFor(player);
|
||||||
|
player->CastSpell(player, SPELL_NEW_DIRECTION_CHOICE_KAYN_OR_ALTRUIS, true); // Display follower choice
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user