Ir para conteúdo
  • Cadastre-se

[TFS 0.4] CreatureScripts (onOpenRuleViolation) + Telegram Notification


Posts Recomendados

O propósito é criar uma nova função em creaturescripts que será acionada toda vez que um novo report (CTRL + R) for aberto.

 

Eu implementei para enviar uma notificação no grupo do Telegram, contendo os dados do report.

 

Isso garantirá que os GMs tenham acesso aos reports dos jogadores mesmo quando não estiverem logados, e também evitará que algum report seja perdido caso o jogador saia do servidor.

A parte do Telegram é apenas um exemplo. Você pode ajustar o script para executar outras ações desejadas.

 

creatureevent.cpp:

Dentro deste arquivo, localize a função:

 

uint32_t CreatureEvent::executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap)

 

abaixo dela, adicione:

 

uint32_t CreatureEvent::executeOpenRuleViolation(Player* player, std::string message)
{
    if (!m_interface->reserveEnv()) {
        std::clog << "[Error - CreatureEvent::executeOpenRuleViolation] Call stack overflow." << std::endl;
        return 0;
    }

    ScriptEnviroment* env = m_interface->getEnv();
    env->setScriptId(m_scriptId, m_interface);

    lua_State* L = m_interface->getState();
    m_interface->pushFunction(m_scriptId);

    lua_pushnumber(L, env->addThing(player));
    lua_pushstring(L, message.c_str());

    bool result = m_interface->callFunction(2);
    m_interface->releaseEnv();

    return result;
}

 

Após, procure por:

 

std::string CreatureEvent::getScriptEventName() const

 

abaixo de:

 

case CREATURE_EVENT_CHANNEL_LEAVE:
	return "onLeaveChannel";

 

adicione:

 

case CREATURE_EVENT_OPEN_RULE_VIOLATION:
    return "onOpenRuleViolation";

 

Agora, procure por:

 

std::string CreatureEvent::getScriptEventParams() const

 

abaixo de:

 

case CREATURE_EVENT_CHANNEL_LEAVE:
    return "cid, channel, users";

 

adicione:

 

case CREATURE_EVENT_OPEN_RULE_VIOLATION:	
    return "cid, message";

 

Procure por:

 

bool CreatureEvent::configureEvent(xmlNodePtr p)

 

abaixo de:

 

else if(tmpStr == "leavechannel")
   m_type = CREATURE_EVENT_CHANNEL_LEAVE;

 

adicione:

 

else if(tmpStr == "openruleviolation")
    m_type = CREATURE_EVENT_OPEN_RULE_VIOLATION;

 

 

creatureevent.h:

Dentro deste arquivo, localize:

 

enum CreatureEventType_t

 

adicione "CREATURE_EVENT_OPEN_RULE_VIOLATION" como o último item de enum CreatureEventType_t

 

Exemplo:

 

enum CreatureEventType_t
{
	// ...
	CREATURE_EVENT_OPEN_RULE_VIOLATION
};

 

Agora, procure por:

 

uint32_t executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap);

 

abaixo dela, adicione:

 

uint32_t executeOpenRuleViolation(Player* player, std::string message);

 

game.cpp:

Dentro deste arquivo, localize:

 

bool Game::playerReportRuleViolation(Player* player, const std::string& text)

 

e substitua por:

 

bool Game::playerReportRuleViolation(Player* player, const std::string& text)
{
	//Do not allow reports on multiclones worlds since reports are name-based
	if(g_config.getNumber(ConfigManager::ALLOW_CLONES))
	{
		player->sendTextMessage(MSG_INFO_DESCR, "Rule violation reports are disabled.");
		return false;
	}

	cancelRuleViolation(player);
	boost::shared_ptr<RuleViolation> rvr(new RuleViolation(player, text, time(NULL)));
	ruleViolations[player->getID()] = rvr;

	ChatChannel* channel = g_chat.getChannelById(CHANNEL_RVR);
	if(!channel)
		return false;

	for(UsersMap::const_iterator it = channel->getUsers().begin(); it != channel->getUsers().end(); ++it)
		it->second->sendToChannel(player, SPEAK_RVR_CHANNEL, text, CHANNEL_RVR, rvr->time);


	CreatureEventList joinEvents = player->getCreatureEvents(CREATURE_EVENT_OPEN_RULE_VIOLATION);
		for(CreatureEventList::iterator it = joinEvents.begin(); it != joinEvents.end(); ++it)
		(*it)->executeOpenRuleViolation(player, text);

	return true;
}

 

Agora é só compilar a source.

 

depois em "data > creaturescripts > creaturescripts.xml", adicione:

 

<event type="login" name="loginNotifyRuleViolation" script="notifyRuleViolation.lua"/>
<event type="openruleviolation" name="openNotifyRuleViolation"  script="notifyRuleViolation.lua"/>

 

em "data > creaturescripts > scripts", crie um arquivo notifyRuleViolation.lua e adicione:

 

function onOpenRuleViolation(cid, message)

	local config = {
		token  = "", -- Token do seu BOT no Telegram
		chatId = "" -- ID do chat do Telegram que será enviado a notificação.
	}

	local message = "Player: "..getCreatureName(cid).."\n\nReport:\n"..message..""
		  message = string.gsub(message, "\n", "%%0A")

	local url  = "https://api.telegram.org/bot"..config.token.."/sendMessage"
	local data = "chat_id="..config.chatId.."&text="..message..""

	local curl = io.popen('curl -d "'..data..'" "'..url..'"'):read("*a")

	return true
end

function onLogin(cid)
	registerCreatureEvent(cid, "openNotifyRuleViolation")
    return true
end

 

 

Demonstração:

1. Jogador abre um novo report (CTRL + R)

spacer.png

2. notifyRuleViolation.lua, definido em creaturescripts.xml, é acionado para enviar uma notificação ao grupo do Telegram.

 

spacer.png

 

Link para o post
Compartilhar em outros sites
  • Sub-Admin

Top no final pra deixar melhorzinha explicado

 

function onOpenRuleViolation(cid, message)
	-- Configuração do Telegram
	local config = {
		token  = "",  -- Token do seu BOT no Telegram
		chatId = ""   -- ID do chat do Telegram que receberá a notificação.
	}

	-- Construção da mensagem com o nome do jogador e o relatório
	local playerName = getCreatureName(cid)
	local formattedMessage = "Player: " .. playerName .. "\n\nReport:\n" .. message
	-- Substitui quebras de linha por '%0A' para o formato adequado na URL
	formattedMessage = string.gsub(formattedMessage, "\n", "%%0A")

	-- Construção da URL de requisição para o Telegram
	local apiUrl = "https://api.telegram.org/bot" .. config.token .. "/sendMessage"
	local requestData = "chat_id=" .. config.chatId .. "&text=" .. formattedMessage

	-- Execução da requisição usando o comando 'curl'
	local curlCommand = io.popen('curl -d "' .. requestData .. '" "' .. apiUrl .. '"'):read("*a")

	return true
end

function onLogin(cid)
	-- Registro do evento para notificação de violação de regra
	registerCreatureEvent(cid, "openNotifyRuleViolation")
    return true
end

 

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites
  • Sub-Admin
  Em 01/03/2024 em 12:01, Mateus Robeerto disse:

Bem interessante, mas é possível para o TFS 1.x?

Expand   Mostrar mais  

sim, teria que mudar umas coisas

 

20230912_034613.png.cf49b650c34dd7d7b1f79bd49c70f53c.png

Eu sou um entusiasta da programação apaixonado por ajudar a comunidade open source a crescer. Sempre em busca de novos desafios e oportunidades para contribuir com meu código.  #OpenSource #Programação #Contribuição

 

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por KekezitoLHP
      Nome: Fist Fighting/Attackspeed
      Tipo: C++
      Autor: Oneshot
       
      Já vi alguns pedidos no fórum sobre a skill Fist Fighting, onde quanto mais você treinasse ela, mais rápido você atacaria no jogo, e parece que isto é um feature do Tibia. Como é uma modificação muito fácil nas sources, resolvi passar aí para a galera.
      Por padrão, o intervalo entre ataques do Tibia é 2000ms, ou seja, um ataque físico a cada dois segundos. Eu fiz uma pequena modificação nas sources onde o Fist Fighting seria inversamente proporcional ao tal intervalo, ou seja, quanto maior o valor da skill, menor seria o intervalo.

      Fiz de um modo que um jogador com Fist Fighting de nível 200, então, teria uma redução de 75% no intervalo de ataque, ou seja, um ataque a cada meio segundo ou dois ataques por segundo

      Leve em consideração que ele pega como base o attackspeed da vocação ou da arma usada, ou seja, se seu servidor já tem o tal chamado "fast attack", de nada adianta adicionar esse código C++.
       
       
      Abra seu player.cpp, procure por isso:
      Player::getAttackSpeed() Substitua toda a função, dependendo da versão de seu servidor:
       
      0.3.6
      uint32_t Player::getAttackSpeed() {     Item* weapon = getWeapon();     if(weapon && weapon->getAttackSpeed() != 0)         return std::ceil(weapon->getAttackSpeed() * (1 - (getSkill(SKILL_FIST, SKILL_LEVEL) * 0.00375)));     return std::ceil(vocation->getAttackSpeed() * (1 - (getSkill(SKILL_FIST, SKILL_LEVEL) * 0.00375))); } 0.4
      uint32_t Player::getAttackSpeed() const {     return std::ceil(((weapon && weapon->getAttackSpeed() != 0) ? weapon->getAttackSpeed() * (1 - (getSkill(SKILL_FIST, SKILL_LEVEL) * 0.00375)) : (vocation->getAttackSpeed() / std::max((size_t)1, getWeapons().size()) * (1 - (getSkill(SKILL_FIST, SKILL_LEVEL) * 0.00375))))); } Isso adiciona uma utilidade para a skill Fist Fighting que em muitos dos servidores é algo deixado de lado e inútil.
    • Por L3K0T
      L3KOT tfs: 1.3
       
      Bom esse sistema é bem simples, ele anuncia pro servidor todo ao matar um tal monstro especifico.
       
       
      1° vai em otserv\data\creaturescripts\scripts copia um arquivo.lua, renomeia para monsterkill.lua e add dentro;;;
      function onDeath(monster, corpse, killer, mostDamageKiller, unjustified, mostDamageUnjustified) local monstro = "Diablo" if monster:getName() == monstro then Game.broadcastMessage("O Jogador "..killer:getName().." matou o Boss " ..monster:getName().. "! ") end return true end  
      Em creaturescripts.xml add
      <event type="death" name="monsterkill" script="monsterkill.lua"/>  
      Abra o xml do monstro que você quer que apareça a mensagem global depois de mata-lo e add lá no final depois de loot;;
      <script> <event name="monsterkill" /> </script> feito isso, salve tudo e pronto!!! Sucesso e jamais desista do seus projetos.
       
       
      ajuda sandada para @Faysal creditos: L3K0T and @Faysal  
       
       
    • Por L3K0T
      Tibia Ginius Versão 1.1 by L3K0T
       
      O Tibia Genius, desenvolvido por L3K0T, é uma ferramenta essencial para desenvolvedores de OTServ que desejam otimizar e simplificar o processo de desenvolvimento dos seus servidores. Essa ferramenta integra diversas funcionalidades que eliminam a necessidade de utilizar múltiplos programas para tarefas distintas. Entre suas principais funcionalidades, destacam-se:
       
      Item Editor: Permite a edição detalhada dos itens do jogo, facilitando a criação e modificação de itens conforme a necessidade do servidor. RME (Remere's Map Editor): Um editor de mapas completo que oferece uma interface intuitiva para criar e modificar mapas do jogo. Object Builder: Ferramenta para a construção e edição de objetos no jogo, essencial para personalizar a experiência do jogador. Mapa Converter: Utilitário que converte mapas entre diferentes formatos, garantindo compatibilidade e facilitando a integração de mapas em diversos servidores. Servidor Integrado: Opção para iniciar o servidor diretamente no ambiente Windows para testes, eliminando a necessidade de configurar servidores externos para verificações rápidas. Acesso Facilitado às Pastas: Botões dedicados para acessar rapidamente as pastas do servidor, aumentando a eficiência no gerenciamento dos arquivos do servidor.  
      Antes de utilizar o Tibia Genius, é necessário importar o servidor. Isso é feito através do botão "Selecionar Servidor", onde o usuário deve especificar a pasta do servidor para que todas as funcionalidades possam ser utilizadas de forma integrada. Da mesma forma, para utilizar o RME e o Item Editor, é preciso importar os arquivos SPR e DAT do cliente do jogo.
      Com o Tibia Genius, l3k0t proporciona uma solução tudo-em-um para desenvolvedores de OTServ, tornando o processo de desenvolvimento mais ágil e centralizado, ao mesmo tempo que oferece ferramentas poderosas e de fácil acesso para a criação e manutenção de servidores personalizados.
       
       

       
       

       
       
      Espero que ajude os preguiçosos risos, qualquer coisa reporte e ajude a melhorar, ideias são todas bem vindas!
       
      Download GitHub:  https://github.com/l3k0t/Tibia_Ginius
      Scan Virus Total: https://www.virustotal.com/gui/file/f406f1310f8c5f403c35115eaaddc609ccdff2ff56b4a96b619ac7df914829e1?nocache=1
      Discord do Projeto: https://discord.gg/MGD55hPWYf
    • Por Roy
      Bem eu não sei nem por onde começar já que. Acredito eu que faz uns 2 anos mais ou menos que não me envolvo com Tíbia então hoje vim trazer algo novo para todos nós.
       Bem o que è Discord RPC? Nada mais nada menos que, aquela janelinha que mostra qual jogo você está jogando no Discord. E ao passar o mouse em cima do úsuario você pode checar os detalhes.

       
      Bem o Tíbia em sí já tem o Discord RPC por padrão mas o que eu trouxe a vocês o Discord-RPC que você pode editar como você quiser.
      Por exemplo.
       

       
      Talvez seja uma contribuição bem clichê. Mas para aqueles que deseja que os players mostre para os outros que está jogando seu otserv é uma boa, que possa ajudar a divulgar também. Acredito eu. Enfim vamos lá.
       
      Bem primeiro de tudo você precisa criar sua aplicação no Discord.
      Vá até o site de Desenvolvimentos de Aplicações do Discord e crie o seu canal clicando em New Aplication.
       
      Após Criar seu canal com o nome do seu Otserv, Descrição e ter colocado sua logo ou sei lá. Seu Canal Está quase completo. (Lembrando que as imagens precisam ser ou 512x512 ou 1024x1024)
      Vá até Rich Presence: Escolha sua logo e também clique em Add Image(s) e adicione uma imagem para sua Logo do Discord-RPC. Para quando o cara passar o mouse por cima do úsuario enxergar ela.
      Ok até aqui tudo OK. Só precisa aguardar o Discord carregar sua logo e enquanto isso vamos fazer o restante.
       
      Baixe a source do Discord-RPC.
      Tibia-RPC.rar
      https://drive.google.com/file/d/1N9oOlxEdMmPZbwPNFRNMXI4z86_v_AbL/view?usp=share_link
       
      Após baixar e abrir. Vá até o Discord.Cpp

       
      e vai aparecer assim pra você.
      Primeiro precisamos definir o ID do nosso Canal que criamos no Discord.
      Quando criamos o canal ele já nos da o ID do nosso canal. 
       

       
      Você cópia o ID e cola em cima do outro que está no Discord.CPP.
      Após isso vamos ver os detalhes.
       
      Em Rich Presence conseguimos visualizar a imagem que adicionamos Ok.
      Abaixo de Rich Presence tem o Art Assets que é onde adicionamos as imagens de logo e tal. Vamos em Visualizer Clicamos nele e então vamos editar nosso Dircord RPC da forma que desejarmos.

       
      Após Editar a direita veremos como ele vai ficar quando alguém passar o mouse em cima do úsuario.
       
      Vamos em Show Code e vemos como ficou o código nele. certo!

       
      bem de alguns não necessitamos necessáriamente a não ser que você queira adicionar mais alguma coisa. recomendo não mexer nessas linhas.
       
       
      DiscordRichPresence discordPresence; memset(&discordPresence, 0, sizeof(discordPresence)); discordPresence.startTimestamp = starttime; Discord_UpdatePresence(&discordPresence);  
      Tudo ok.
      Então vá até o Discord.cpp e edite-as como quiser. E vemos tudo lindo assim:

       
      Após isso só compilar e importar a dll no seu cliente tibia.
      Se você não tem nenhum importador de .dll eu vou disponibilizar pra você o link do Stud_PE
      Com ele você pode importa sua dll no seu cliente e ser feliz.
       
      Para importar a dll ao seu cliente, instale o Stud_PE no seu computador, após instalar. Abra.
      Importe o Tibia ou arraste o Tibia pra dentro do Stud_PE 
      Vá em Functions > Clique com o botão direito dentro da janela de Fuctions.

       
      Cliqu em Add New Import > Dll Select > Selecione a dll do Discord-RPC > Após isso Clique em > Select func. > Selecione a função > Após Clique em > Add to List e clique em ADD.
       

       
      Então só da Ok e abrir o seu Cliente.
       
      Bem eu vou mandar a versão que mostra o Nome e Level pra vocês assim:
       

       
      Essa versão mostra o Nome do personagem quando loga e o level. OBS: a dll faz um update de checagem a cada 5 segundos então precisa aguardar até seu nome aparecer.
       

       
      Em Discord.h você pode determinar o level máximo do seu servidor. fazendo cada linha por level.
       
      Você precisa procurar os endereços com o Cheat Engine.
      Se caso for procurar pelo Check Login pesquisa por 1 se o char estiver logado. E 0 quando estiver deslogado, vai procurando até encontar qual endereço muda quando logar e deslogar.
       
      Em questão do nome procura pro string e o nome do seu personagem. Na maioria das vezes é quase sempre o primeiro mas você pode mudar o nome no Cheat pra ter certeza.
      Em questão do Level Procura pelo valor do level por exemplo: 211, da um addskill pra level o level 212 e da um Next Scan na pesquisa com o valor novo pra ter certeza. e vai adicionando mais um pouco até ter a certeza.
      Supostamente eu encontrei na primeira pesquisa e só precisei upar 1 level mas vocês podem demorar um pouco.
      único coisa que não consegui identificar foi a vocação do personagem que eu queria muito mas com isso acho que já é o suficiente.
       
      Tibia-RPC N.L.rar✔️
      https://drive.google.com/file/d/1N9oOlxEdMmPZbwPNFRNMXI4z86_v_AbL/view?usp=share_link

      perdõe se eu não fui autoexplicativo e se postei na sessão errada. Corrijam-me se eu falei algo errado ou fiz algo de errado. Essa Source não fui eu quem criei.
      Eu usei o VS 2019. Qualquer dúvida por favor sinta-se a vontade.
       
      Meu obtjetivo é trazer algo novo pra comunidade e que possa ajudar outras pessoas.
      Esse lançamento pode ser inútil pra alguns mas para outros pode servidor de grande favor. Para aqueles que jogam usando Discord e tal.
       
       
       
    • Por chateadoagr
      Bem-vindo ao Genesis Online Tibia (GOT), um mundo onde a civilização foi devastada por um apocalipse zumbi. Inspirado em referências como The Walking Dead e Resident Evil, o GOT desafia você a sobreviver em meio ao caos, enfrentando hordas de mortos-vivos, explorando ruínas perigosas e formando alianças estratégicas. Embarque nesta jornada épica de sobrevivência e descoberta, onde cada escolha molda seu destino em um cenário hostil repleto de desafios e perigos iminentes.
       
       
      Adentre o universo de Genesis Online Tibia (GOT), um jogo repleto de sistemas inovadores e emocionantes. Equipe-se com um vasto arsenal de armas para enfrentar as ameaças do apocalipse zumbi, enquanto o sistema autoloot simplifica suas conquistas. Desenvolva seu personagem através de um sistema de upgrade único, aprimorando habilidades e atributos para enfrentar desafios cada vez mais formidáveis.
       
      Explore um mundo imersivo onde o som desempenha um papel crucial, criando uma atmosfera envolvente e realista. Vasculhe cada canto em busca de recursos vitais, desvendando segredos e tesouros ocultos. Siga uma cativante história através de missões que expandem o enredo, revelando os mistérios por trás do apocalipse e oferecendo recompensas valiosas.
       
      Em Genesis Online Tibia, a jornada pela sobrevivência é repleta de ação, estratégia e emoção, convidando você a se aventurar em um mundo onde cada decisão molda seu destino e determina sua capacidade de enfrentar os desafios que aguardam.

      Em breve imagens do servidor!
       
       
  • Estatísticas dos Fóruns

    96844
    Tópicos
    519597
    Posts
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo