Playerbots : les ordres n'atteignaient jamais leur destinataire

SIGNALE EN JEU : « !summon repond "You can't teleport yourself to
yourself", et !follow repond "There is no such command" ».

ChatHandler::ParseCommands traite le point d'exclamation comme un
prefixe de commande au meme titre que le point :

    if (text[0] != '!' && text[0] != '.')
        return false;

Il intercepte donc tout ordre ligne 202 de HandleChat, bien avant que
le message n'atteigne le canal de groupe ou Group::ProcessGroupBotCommand
l'attend, ligne 405. « !summon » partait vers la commande de maitre de
jeu du meme nom, « !follow » vers une commande inexistante.

Le systeme d'ordres aux playerbots -- summon, attack, follow, flee,
stop, equipement, talents -- etait donc inaccessible depuis toujours.
Comme la formation de groupe corrigee juste avant, il etait ecrit,
complet, et jamais atteint.

Les messages en « ! » passent desormais aux compagnons lorsque le joueur
en commande effectivement. Un maitre de jeu sans bot garde ses commandes
en « ! » ; celui qui en a passe par le point, qui reste le prefixe
principal.

Corrige aussi : le journal des mercenaires annoncait « a paye 100 po »
pour les recrutements offerts. Rien n'etait preleve -- le garde-fou est
bien en place -- mais un journal qui raconte le contraire de ce qui
s'est passe fait perdre du temps au diagnostic suivant.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
BlaMacfly
2026-09-05 10:03:49 +02:00
parent ba0caeece2
commit 24a0700853
2 changed files with 31 additions and 2 deletions
+30 -1
View File
@@ -199,7 +199,36 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg,
if (msg.empty())
return;
if (ChatHandler(this).ParseCommands(msg.c_str()))
// =================================================================
// ORDRE_AUX_COMPAGNONS
//
// SIGNALE EN JEU : « !summon repond "You can't teleport yourself to
// yourself", et !follow repond "There is no such command" ».
//
// ChatHandler::ParseCommands traite le point d'exclamation comme un
// prefixe de commande au meme titre que le point :
// if (text[0] != '!' && text[0] != '.') return false;
// Il intercepte donc tout ordre avant qu'il n'atteigne le canal de
// groupe, ou Group::ProcessGroupBotCommand l'attend. Le systeme
// d'ordres aux playerbots etait inaccessible depuis toujours --
// « !summon » partait vers la commande de maitre de jeu du meme nom.
//
// On laisse passer les messages en « ! » lorsque le joueur commande
// effectivement des bots. Un maitre de jeu sans compagnon garde ses
// commandes en « ! » ; celui qui en a passe par le point, qui reste
// le prefixe principal.
bool ordreAuxCompagnons = false;
if (!msg.empty() && msg[0] == '!')
if (Group* groupe = GetPlayer()->GetGroup())
for (GroupReference* itr = groupe->GetFirstMember(); itr != nullptr; itr = itr->next())
if (Player* membre = itr->GetSource())
if (membre->IsPlayerBot())
{
ordreAuxCompagnons = true;
break;
}
if (!ordreAuxCompagnons && ChatHandler(this).ParseCommands(msg.c_str()))
return;
// Strip invisible characters for non-addon messages
+1 -1
View File
@@ -460,7 +460,7 @@ MercenaryResult MercenaryMgr::Summon(Player* owner, uint8 role, Creature* portal
}
m_contracts.push_back(contract);
TC_LOG_INFO("server.worldserver", "Mercenaires: %s a paye %u po pour un %s (compte bot %u).",
TC_LOG_INFO("server.worldserver", freeOfCharge ? "Mercenaires: %s recoit gratuitement un %3 (compte bot %4), cout %2 po non preleve." : "Mercenaires: %s a paye %u po pour un %s (compte bot %u).",
owner->GetName().c_str(), GetCostGold(), GetRoleName(role), accountId);
return MERC_OK;