From 24a07008538a2e469a435c8e34d328996ff82671 Mon Sep 17 00:00:00 2001 From: BlaMacfly Date: Sat, 5 Sep 2026 10:03:49 +0200 Subject: [PATCH] Playerbots : les ordres n'atteignaient jamais leur destinataire MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/server/game/Handlers/ChatHandler.cpp | 31 +++++++++++++++++++++- src/server/game/Mercenary/MercenaryMgr.cpp | 2 +- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 96ecc5e..0a5b929 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -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 diff --git a/src/server/game/Mercenary/MercenaryMgr.cpp b/src/server/game/Mercenary/MercenaryMgr.cpp index c0be794..63c616a 100644 --- a/src/server/game/Mercenary/MercenaryMgr.cpp +++ b/src/server/game/Mercenary/MercenaryMgr.cpp @@ -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;