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