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())
|
if (msg.empty())
|
||||||
return;
|
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;
|
return;
|
||||||
|
|
||||||
// Strip invisible characters for non-addon messages
|
// 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);
|
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);
|
owner->GetName().c_str(), GetCostGold(), GetRoleName(role), accountId);
|
||||||
|
|
||||||
return MERC_OK;
|
return MERC_OK;
|
||||||
|
|||||||
Reference in New Issue
Block a user