Para adicionar um tutor robô que responde automaticamente no canal de ajuda (Help Channel) quando um jogador escreve algo e o ADM não está online, você precisa editar o script do creaturescripts ou criar um sistema que detecta mensagens no canal de help.
Como o TFS 0.3.6 (Tibia 8.60) não possui um sistema interno de interceptação direta no Help Channel, você pode contornar isso com um sistema de creaturescript que detecta mensagens no canal de help (canal 9) e responde automaticamente caso o ADM não esteja online.
Passo a passo: Criando um tutor robô para o canal de ajuda
1. Abra ou crie este arquivo:
data/creaturescripts/scripts/help_bot.lua
2. Adicione este script:
lua
Copiar
Editar
local ADM_NAME = "ADM" -- Nome do personagem do administradorlocal HELP_CHANNEL_ID = 9
function onTalk(cid, type, channel, msg)
-- Verifica se a mensagem é no Help Channel
if channel == HELP_CHANNEL_ID then
-- Verifica se o ADM está online
local admPlayer = getPlayerByNameWildcard(ADM_NAME)
if not isPlayer(admPlayer) then
doPlayerSendChannelMessage(0, "Tutor Robo",
"Para suporte, mande um ticket para o ADM no e-mail:
[email protected] ou adicione ele no WhatsApp: +55 11 91230-8360.",
TALKTYPE_CHANNEL_O, HELP_CHANNEL_ID)
end
end
return trueend3. Adicione o creaturescript no creaturescripts.xml:
Abra o arquivo data/creaturescripts/creaturescripts.xml e adicione:
xml
Copiar
Editar
<event type="channel" name="HelpBot" script="help_bot.lua"/>4. Registre o evento no login.lua:
Abra o arquivo data/creaturescripts/scripts/login.lua e adicione esta linha dentro da função onLogin:
lua
Copiar
Editar
registerCreatureEvent(cid, "HelpBot") Resultado
Agora, sempre que um jogador mandar uma mensagem no Help Channel (canal 9), se o personagem chamado "ADM" não estiver online, o tutor robô automaticamente responderá com:
"Para suporte, mande um ticket para o ADM no e-mail:
[email protected] ou adicione ele no WhatsApp: +55 11 91230-8360."
Se quiser que o nome do ADM seja outro, é só mudar a variável ADM_NAME = "ADM".
Quer que ele só responda uma vez a cada X segundos por jogador, ou algo mais inteligente? Posso melhorar o script.
Você disse:
nao pego no tfs 0.3.6
O ChatGPT disse:
Perfeito, obrigado pelo retorno! Como o TFS 0.3.6 (8.60) não possui suporte ao evento onTalk com type="channel" no creaturescripts, precisamos usar uma outra abordagem, baseada em talkactions ou em modificações no source (mais avançado).
A melhor solução sem mexer no source é usar talkactions para detectar mensagens específicas e simular um tutor robô.
1. Habilitar o evento onTalk no server (creaturescript) Arquivo: luascript.cpp
Procure por a função:
cpp
Copiar
Editar
void LuaScriptInterface::registerFunctions()``
Dentro dela, **adicione esta linha** (se ainda não existir):
```cpp
lua_register(m_luaState, "registerCreatureEvent", LuaInterface::luaRegisterCreatureEvent); Arquivo: creatureevent.h
Procure a enumeração CreatureEventType e adicione o novo tipo TALK:
cpp
Copiar
Editar
enum CreatureEventType
{
...
CREATURE_EVENT_CHANNEL,
...
CREATURE_EVENT_TALK, // Adicione isso
}; Arquivo: creatureevent.cpp
Adicione o novo tipo de evento ao final do getType:
cpp
Copiar
Editar
CreatureEventType CreatureEvents::getType(const std::string& str){
...
else if(str == "talk")return CREATURE_EVENT_TALK; // novo
...}
Na função configureEvent, adicione suporte ao onTalk:
cpp
Copiar
Editar
bool CreatureEvent::configureEvent(xmlNodePtr p){
...
if(m_type == CREATURE_EVENT_TALK)
m_interface->reserveScriptEnv(); // reserva ambiente para o script
...} 2. Chamar o evento onTalk quando jogador fala no canal
Arquivo: chat.cpp
Encontre a função:
cpp
Copiar
Editar
bool Chat::talkToChannel(Player* player, MessageClasses type, const std::string& text, uint16_t channelId)
Logo no início dessa função, adicione a chamada do evento:
cpp
Copiar
Editar
if (player) {
CreatureEventList talkEvents = player->getCreatureEvents(CREATURE_EVENT_TALK);
for(CreatureEventList::iterator it = talkEvents.begin(); it != talkEvents.end(); ++it)(*it)->executeTalk(player, type, text, channelId);} 3. Criar a função executeTalk no CreatureEvent
Arquivo: creatureevent.cpp
Adicione esta função:
cpp
Copiar
Editar
bool CreatureEvent::executeTalk(Creature* creature, MessageClasses type, const std::string& text, uint16_t channel){
// Função só ativa se for script registrado
if(m_type != CREATURE_EVENT_TALK)return false;// Prepara o script
if (!m_interface->reserveScriptEnv()) {
std::cout << "[Error - CreatureEvent::executeTalk] Call stack overflow." << std::endl;return false;
}
ScriptEnviroment* env = m_interface->getScriptEnv();
env->setScriptId(m_scriptId, m_interface);
env->setRealPos(creature->getPosition());// Empilha argumentos
lua_State* L = m_interface->getLuaState();
m_interface->pushFunction(m_scriptId);
LuaScriptInterface::pushThing(L, creature, false);
lua_pushnumber(L, type);
lua_pushstring(L, text.c_str());
lua_pushnumber(L, channel);return m_interface->callFunction(4);} Arquivo: creatureevent.h
Adicione no final da classe CreatureEvent:
cpp
Copiar
Editar
bool executeTalk(Creature* creature, MessageClasses type, const std::string& text, uint16_t channel);