
Histórico de Curtidas
-
eviltox deu reputação a DdJs em [Tutorial] Macro para treino ML/Anti-idle (Tibia 12/Global)Alô pessoal. Faz uns dias eu estava procurando algo para poder deixar meu char com anti-idle treinando e por fim
acabei encontrando um teclado virtual com macro, testei e funciona perfeitamente no tibia global atual, passando
pelo filtro do Battleye sem problemas.
Bom, vou passar aqui o tutorial simples de como configurar e no final deixarei link para download, as considerações finais e outras informações importantes. Vamos lá!
Após instalar o Hot keyboard, abra-o e você terá a tela para escolher o estilo de teclado, escolha e de OK.
1) Aqui vai estar seu tecladinho virtual, apenas clique neste botão marcado na imagem:
2) Você verá que irá abrir um painel de comando, vamos em frente:
Em combinação de teclas você pressiona a tecla que deseja usar como atalho para ativar o macro.
Em operação você seleciona a opção de reproduzir macro.
*Não altere mais nada!
3) Nessa segunda parte você deixa exatamente desse modo:
Em velocidade de reprodução deixe o valor entre "x2" e "x5"
Em número de repetições deixe o valor em 100000
Tudo pronto para gravar, agora basta clicar em "gravar" e apertar a sequencia de botões no seu teclado virtual
para que ele grave toda a sequencia. Lembrando que isso não é um bot inteligente ou algo com timer,
logo se você quiser por o char para virar como anti-idle e para usar magia e mana potion precisará calcular
o tempo de ações improvisando e clicando em teclas que não irão interferir no game, como por exemplo
bater a cada 1 segundo na tecla space para determinar tempo para uma ação real (como usar mana ou magia).
*Não deixe a velocidade de reprodução acima de x5!
Depois de gravar sua sequencia, vá em arquivo e salve.
Volte a tela do tibia e acione seu macro e voilà.
Para pausar o macro basta apertar pause break no seu teclado físico.
Para funcionar, a tela do tibia deve estar em plano principal, ou seja, se você
colocar o macro para rodar no tibia e abrir o browser, o teclado vai fazer as funções
que você configurou para o tibia no seu navegador.
Importante:
Apesar de não ser um programa na lista negra do Battleye e funcionar sem grandes riscos, o fator humano
ainda é infalível e usado no game através das denuncias. Portanto se for usa-lo encontre um local muito isolado
para esconder seu char e deixar treinando, pois como mencionei acima, isso não é um bot inteligente que
para de treinar ou faz alertas, ele ficará apertando a sequencia de botões sem interrupção.
Sobre o Hot Virtual Keyboard:
Este programa é 100% confiável de uma empresa séria, porém existe um empecilho irritante
que é o fato do programa não ser gratuito. Ao baixa-lo, você poderá usar por um período
de 30 dias (free trial). Depois desse tempo poderá comprar uma serial key (vitalicia) no site
oficial por US$ 29 para continuar a utilizar. Ou pode arriscar e procurar o programa crackeado pela internet
ou alguma serial key funcional escondida em algum blog por ai.
Enfim, isso é tudo. Divirta-se e cuidado ao ser visto por outros players.
Se alguém quiser comprar uma key e me dar de presente eu aceito ✌️
*Funciona em qualquer versão do tibia (inclusive global) e outros jogos ou aplicações que você queira utilizar este programa.
Download:
HotVirtualKeyboardSetup.exe
(https://hot-virtual-keyboard.com/download/)
Scan:
http://twixar.me/T8M1
-
eviltox deu reputação a WooX em Classic-Yurots [8.60] - Push Cruzado + Cast com SetasClassic Yurots
V 8.60
Eu acompanhei de perto o desenvolvimento deste servidor e sabia que sairia coisa boa dali, mas só quando obtive acesso aos arquivos que pude entender a dimensão do negocio, sendo assim, eu posso afirmar que este é um dos se não o melhor datapack baseado no antigo YurOTS. O datapack está limpo, você não vai encontrar um script em qualquer uma das pastas que não esteja em uso no servidor, alem disto muito tempo foi gasto reescrevendo e revisando os scripts do servidor para garantir máxima performance.
Os mais novos em OpenTibia talvez não saibam, mas os famosos Baiaks e Styllers de hoje em dia foram baseados neste mapinha que teve seu inicio já na versão 7.5 e seu declínio nas versões 8.4 onde foi visto pela ultima vez devido ao surgimento de derivados do mesmo (Baiak e Styller). Devido ao fato dos mapas Baiak e Styller serem derivados do YurOTS, se você tem um projeto de mapa Baiak ou Styller, este é um excelente datapack para você usar como base.
Por que o servidor está sendo postado?
Este servidor foi desenvolvido ao longo de 2 anos pelo Wesley (conhecido aqui no fórum como @KOLISAO), alguns meses atrás o servidor foi finalizado e colocado online, embora hoje em dia, sem contato com times de jogadores, é difícil popular um servidor novo e sem nome logo na abertura, com isso a inauguração não foi como esperado e conseguiu uma média de apenas 30 jogadores. Frustado por 2 anos de muito trabalho não dar o resultado esperado, ele decidiu desistir do servidor, foi então que eu fiz uma proposta em troca do servidor e obtive acesso ao mesmo.
O que eu não sabia na época era que outras duas pessoas alem de mim tiveram acesso a todos os arquivos, uma dessas pessoas é um amigo do próprio Wesley na vida real, ele conversou com este amigo e deletou os arquivos do computador dele. A segunda pessoa em questão, eu não tenho certeza de como obteve estes arquivos, mas ele atualmente está vendendo estes arquivos sem autorização.
Quando fiquei ciente disto, entrei em contato com o Wesley e o informei sobre o que estava acontecendo, ele ficou surpreso e revoltado por alguém estar lucrando em cima de seus esforços. Neste momento pedi permissão a ele para postar o servidor aqui no fórum, e ele me concedeu.
Informações sobre o servidor
Como dito anteriormente, muito tempo foi gasto neste servidor e tudo foi feito com o maior cuidado possivel. Vou deixar aqui as informações sobre o que contem no servidor, informações que foram divulgadas pelo próprio Wesley na data de inauguração.
Vídeo com algumas Quests do servidor
Outras informações podem ser encontradas no tópico de show-off do período em que o servidor ainda estava em desenvolvimento.
Extra + Créditos
Juntamente com o servidor estarei postando a source e o site do mesmo, porem o site será postado em um tópico diferente devido a esta não ser a área correta do fórum para isso. A source do servidor é OTX2, foram feitas pequenas modificações na source para melhor formatação em partes do datapack, como QuestLog e outros.
Edit 29/11
Além disto, a source também possui 2 sistemas muito procurados que até o presente momentos não eram públicos, sendo estes Push Cruzado e Cast com Setas. Ambos os sistemas já estão instalados na source, porem futuramente irei postar ambos os códigos juntamente com tutorial de instalação para os que quiserem adicionar por si mesmos.
Créditos
Como já mencionei diversas vezes neste tópico, o responsável pelo desenvolvimento do servidor e site foi o @KOLISAO, portanto todos os créditos nesta parte vão para ele.
Eu fui o responsável por adicionar o Push Cruzado na source e fazer uma pequena modificação no Cast com Setas.
Obs: quando eu obtive acesso aos arquivos o Cast com Setas já estava instalado na source, eu não tenho informação se o código foi desenvolvido por ele ou por um terceiro.
Links para Download
Servidor
Download - Scan
Source
Download - Scan
Distro compilada para Windows
32x - TheOTXServer.exe - Scan
64x - TheOTXServer_64.exe - Scan
DLLs
dll.zip - Scan
Site
-
eviltox deu reputação a WooX em Gesior - Classic-Yurots 2019Gesior 2012
V. Classic-Yurots
Como dito anteriormente no tópico do servidor, este é o Gesior 2012 editado pelo @KOLISAO. Este Gesior foi editado para ser usado exclusivamente com o servidor Classic-Yurots, porem pode ser utilizado em outros datapacks desde que as sources sendo utilizadas sejam TFS 0.4 ou OTX2.
Se você ainda não viu o tópico sobre o servidor em questão, vale apena conferir, link para acesso abaixo.
Conteúdo
Assim como o servidor, muito tempo foi gasto modificando este Gesior, tanto na parte de imagens e layout (front-end) como na criação de novas paginas e funções (back-end). Resumindo, agora esta é uma das se não a melhor versão disponível do Gesior 2012. Eu garanto que vale apena baixar e conferir.
Imagens
Créditos
Este Gesior foi feito com base no Gesior 2012 postado pelo @Natanael Beckman, caso queira conferir o post original, segue link abaixo.
Todas as edições realizadas no site, tanto front-end como back-end foram realizadas pelo @KOLISAO, portanto, os créditos são dele e do Natanael.
Link para Download
Alerta
Antes do link, um alerta. No momento do Scan, 9 de 44 engines acusaram os arquivos como maliciosos, eu acredito que seja apenas um falso positivo devido aos scripts contidos no site, porem eu não posso garantir que os arquivos sejam de fato inofensivos, portanto, baixe os arquivo por sua conta e risco.
Download - Scan
Obs: Link para download de uma database limpa e compatível com o site se encontra no post do servidor.
-
eviltox deu reputação a Natanael Beckman em GesiorACC 2019 8.60 UPDATE 29/06/2019Atualização de 29/06/2019.
Olá meus amigos, essa é a minha última contribuição free que faço na área de OTserver, fiz uma atualização bem completa do Gesior comparando com os que existem disponíveis, não vou falar muito pois grande parte já conhecem... Vou apenas posta algumas imagem das mudanças feitas.
Sempre gostei de evoluir e de oferecer aos demais uma facilidade de obter um material grátis e de qualidade, nunca utilizei meu pouco conhecimento para prejudicar os demais, pelo o contrario sempre foi na intenção de ajudar e se em algum momento falhei, falhei inconscientemente.
- Foi mudado algumas imagens de layout para renovar a estrutura.
- Server Info + Most Power Ful Guilds na mesma estrura.
- Create Account exigindo senhas com letras minusculas, maiúsculas e números, fortalecendo
a segurança do seu cliente e dificultando futuras dores de cabeças.
- Adicionado o mecanismo que identifica os valores de Premuim Points e Backup Points.
- Algumas mudanças de layout.
- Nome do player abaixo linkado.
- Adicionado um Box de doação, com a intenção apenas de complementar
o layout enriquecendo a pagina.
- Fixado o bug edit town, e melhorado o layout.
- Characters.php refeito, nesta imagem é uma visão de uma conta com access admin.
- Visão normal.
- Inventário completo.
- Guilds com visão ampliada.
- Detalhes...
- Novo SHOP com as estrutura de layout melhorada e modernizada.
- Sem BUGs lembre-se do CTRL + F5 para atualizar os cookies nesta pagina.
- Detalhes...
- Detalhes...
- Detalhes...
- Histórico do SHOP...
DOWNLOAD SITE
SHOP.LUA XAMPP 1.7.3 DATABASE LIMPA MYSQL DATABASE COMPLETA MYSQL TUTORIAIS ÚTEIS E COMPATÍVEIS PARA O SITE: PAGSEGURO AUTOMATICO SHOPGUILD BACKUP_POINTS SISTEMA VIP_TIME Créditos: Gesior.pl(WEBMaster) Felipe Monteiro(WEBMaster, WEBDesigner) Natanael Beckman(WEBNada) Nailan (WEBMaster) Ivens Pontes (WEBMaster) Marcio Porto (WEBMaster) Danyel Varejão (Programmer LUA, C++)
-
eviltox deu reputação a xWhiteWolf em New Library v. 1.2Fala galera, hoje vim trazer pra vocês uma nova biblioteca de funções que eu venho desenvolvendo, pretendo ir atualizando esse tópico constantemente sempre adicionando funções novas e explicando a utilização delas. Algumas funções que eu coloquei aqui estão presentes na OTAL também, porém algumas eu fiz pequenas correções de forma que essa lib poderia facilmente substituir a OTAL sem grandes problemas (pelo menos se você utilizava apenas as funções básicas da otal)
Todas as funções que não tem -- nome do autor do lado dela foram feitas por mim, xWhiteWolf ou Night Wolf (NW). O restante delas são créditos dos devidos autores, apenas coloquei pois considero funções vitais no server de cada um. Crie um arquivo em data/lib chamado 075 - White Wolf Functions.lua e coloque o seguinte código dentro:
Agora eu vou explicar oque cada função faz porque de nada adianta lançar uma lib e não explicar oque ela faz não é mesmo? hahaha
Obs inicial: quando uma função tiver em seus parametros um [] significa que oque está dentro do colchetes não é um parâmetro obrigatório.
Como usar: doShowTimeByPos(cid, getCreaturePosition(cid), 20, 20)
Irá fazer uma contagem regressiva na posição que o player se encontra começando de 20 e mandando a mensagem na mesma cor da fala dos monstros.
Essa função é bem útil em actions/spells para fazer contagem de tempo em runas como a magic wall e ver quanto tempo falta pra magic wall sumir)
Obs: Espero que ajude bastante pessoas a entender sobre funções, eu utilizei cid como o principal uid das funções nos exemplos mas você pode muito bem utilizar outros uids, fica a critério seu.
Qualquer dúvida comentem abaixo que eu vou tentar ajudar da melhor maneira.
Ahhh, isso daí foi testado em 8.54 mas deve funcionar em quase todas as versões que tenham as funções básicas do TFS.
EDIT: Pessoal, agora é sério, essa lib tem fácil umas 600 linhas, das quais umas 500 eu devo ter codado sozinho (na mão, linha por linha). Eu tive todo o trabalho de testar cada uma delas e oque eu peço é o mínimo de gratidão e respeito. Se eu te ajudei clique em Gostei, se você tiver alguma dúvida eu to me colocando a disposição de responder qualquer coisa relacionada ao tópico, mesmo que você não saiba nem oque é uma lib apenas venha aqui e escreva sua dúvida.
EDIT 2: Duas novas funções adicionas, espero que gostem!
EDIT 3: Três novas funções adicionadas juntamente com suas respectivas explicações.
-
eviltox deu reputação a xWhiteWolf em Serialize/Unserialize Strings to NumberFala rapeize, eu me propus um desafio de criar uma forma de transformar uma string em números que possam ser anexados no storage.
Basicamente isso resolve o problema dos TFS anteriores de não conseguir salvar nomes de personagens no storage sem ter que fazer source editing.
PS: É óbvio que é mais fácil fazer source editing, mas o desafio era esse e como não é todo mundo que tem source tb pode ser bastante útil.
Eu não fechei o código certinho em funções, mas pretendo fazer em breve (agora preciso dormir) e aí eu edito o tópico aqui.
Nos testes q eu fiz ele conseguiu serializar e deserializar 5 mil caracteres em 0,01 segundo o que provavelmente faz dele o melhor serializador do gênero xD
Limitações: Ele só funciona com um range bem específico de strings, se vc quiser serializar qualquer outra coisa procure um serializador na internet.
Ele é capaz de processar tudo que tá dentro do retangulo vermelho
Ele só funciona com NO MÁXIMO +- 8k de caracteres, se vc quiser mais que isso vai precisar trocar a função table.concat e talvez umas outras coisinhas
O que ele faz: Transforma qualquer texto num numero, divide esse número em espaços de 32 bits e nas posições da memória consecutivas (no exemplo eu to usando uma tabela, mas poderia ser num storage, por ex). Depois ele ainda é capaz de retornar a string original a partir do serial gerado.
Funcionamento: por incrivel q pareça a lógica é bem simples, pega o código ascii de cada caractere da string, subtrai 21 para deixar o numero menor (21 é o máximo que a gente consegue encurtar pq 32 - 21 é 11 e 127 - 21 é 106, aí se eu lê-se 10 eu não saberia dizer se é o código do espaço ou dos 5 ultimos ali da tabela)
Os storages são int_32 então o maior valor q eu consigo colocar dentro de um storage é 2^31 - 1, aí tudo q eu faço é ir pegando os 10 ultimos numeros e vendo se eles cabem dentro desse limite máximo, se não couber eu pego os 9 ultimos, até caber dentro do limite. Aí eu jogo pra tabela e contabilizo quantas vezes eu to fazendo isso (isso vai ser importante depois qnd formos inserir ou pegar do storage)
Como eu já li os lines ultimos numeros da string, eu posso retirar eles e refazer o processo até não restar mais nada.
No final dentro da tabela tb vc vai ter no i o numero q vc soma no storage e no v o valor que deve ir pro storage.
Pra deserializar o processo é parecido, primeiro eu percorro a tabela concatenando os numeros na ordem inversa e depois vou vendo 2 a 2 se o numero é menor que 11 (nosso menor código ascii que representaria o espaço, lembrando que removemos 21 para encurtar). Se ele for menor então significa que estamos lidando com um dos ultimos numeros da tabela (10X), nesse caso temos que ler 3 numeros ao invés de só 2. Depois de passar tudo pra caractere e concatenar, nos é retornado a string inicial.
Código:
Quem quiser testar é só modificar a variável entrada pra qualquer texto que vc quiser e dar run. O resultado aparece na tela a direita.
https://repl.it/repls/LongtermVioletTakin
-
eviltox deu reputação a Cjaker em Problemas ao compilar source do WOP (World Of Piece)../otserv.cpp:19:24: error: sys/signal.h: No such file or directory
Está faltando o arquivo signal.h verifique nas suas sources.
-
eviltox recebeu reputação de spookzinho em Bot Avatar World (Windy e Wan) 99,9% FuncionalComo o Título diz trago a vocês o bot para quem joga o Avatar World..
Como todos que jogam o server sabem, após a atualização do antigo server ficou-se impossibilitado de se usar o bot pelo cliente original por conta do anti-bot que por sua vez bloqueia até mesmo o uso do Candybot pelo OtC. Então eu basicamente configurei tudo para que o mesmo funcionasse pelo OTCliente novamente e também desbuguei todas as funções que estavam bugadas em outras versões liberadas por outros usuários deste mesmo bot para o antigo Avatar Legends.
O bot (CandyBot) utilizado neste tópico é o mesmo do original encontrado na git do BenDol (https://github.com/BenDol/otclient-candybot) porém com adições dos scripts e correções de certos bugs que só ocorriam dentro do Avatar.
Sem mais delongas e enrolações vamos ao que interessa.
OBS: ATUALMENTE PODE-SE USAR BOT NO SERVIDOR DO AVATAR, ESSA REGRA COMO QUALQUER OUTRA PODE SER ALTERADA E VOCÊ PODE PERDER SUA CONTA POR USO DE PROGRAMAS "ILEGAIS", SE VOCÊ ESTÁ CIENTE DISTO SIGA EM FRENTE E FAÇA O DOWNLOAD.
Deixarei alguns prints>=:
LINK DOWNLOAD: (DOWNLOAD AVATAR-BOT)
SCAN: SCAN DO BOT :D
Bom eu não irei entrar em muitos detalhes, o CandyBot está 100% funcional (target, pegar loot, potions, etc) e os scripts do canto esquerdo tem que saber configurar as funções mais difícies porém estarei disposto a retirar dúvidas que vocês postarem.. é isso flw
Créditos:
BeniS (Ben Dol) - [email protected] Alexandre do Amaral Severino - [email protected] Evesys -
eviltox deu reputação a Vodkart em [8;6] Premium Paper [Talk] + [Action]Fiz o código a pedidos do membro @Micheel15, onde o sistema funciona da seguinte maneira:
você usa o comando !sellpoints quantidade
quando usar esse comando, os seus pontos do site são passados para um paper, com esse paper você pode trocar ou vender no servidor.
BENEFICIOS :
Vender ou transferir pontos.
IMAGEM A BAIXO :
Ai quando você der use, os pontos são passados para sua conta.
lib adicione
function getPremiumPoints(cid) local query = db.getResult("SELECT `premium_points` FROM `accounts` WHERE `id` = "..getPlayerAccountId(cid)) return query:getDataInt("premium_points") <= 0 and 0 or query:getDataInt("premium_points") end function setPremiumPoints(cid, amount) return db.executeQuery("UPDATE `accounts` SET `premium_points` = "..amount.." WHERE `id` = "..getPlayerAccountId(cid)) end
talk
sell_points.lua
function onSay(cid, words, param) local var,points = "[Sell Point System] Este documento vale %s points para você usar no site.",getPremiumPoints(cid) local min,max = 5, 100 if param == "" or not tonumber(param) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Desculpe, use somente numeros.") return true elseif tonumber(param) < min or tonumber(param) > max then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Desculpe, Minimo "..min.." e Maximo "..max.." points.") return true elseif points < tonumber(param) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Desculpe, mas você só possui "..points.." Premium Points.") return true end local item = doPlayerAddItem(cid, 7702,1) doItemSetAttribute(item, "description", var:format(tonumber(param))) setPremiumPoints(cid, points-tonumber(param)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Sell Point System] Você recebeu um paper com "..param.." Premium Points.") return true end
tag
<talkaction words="!sellpoints;/sellpoints" event="script" value="sell_points.lua"/>
actions
paper_points.lua
function onUse(cid, item, frompos, item2, topos) local var = getItemAttribute(item.uid, "description") if var == nil then return true end local x = var:match("%b[]") if x == "[Sell Point System]" then local ret = var:match("%d+") doPlayerSendTextMessage(cid, 22,"você recebeu "..ret.." Premium Points.") setPremiumPoints(cid, getPremiumPoints(cid)+ret) doRemoveItem(item.uid) end return true end
tag
<action itemid="7702" script="paper_points.lua"/>
-
eviltox deu reputação a xWhiteWolf em Dash.ok, vou ver de tentar fazer isso prox fds, q dia de semana p mim tá sem chance :~
-
eviltox deu reputação a xWhiteWolf em Nos ajude a melhorar com novos títulosmal posso esperar pra pegar 3000 de rep e virar o michel temer e destronar o Sesso com meu novo governo ilegítimo
-
eviltox deu reputação a Pedriinz em [TFS 1.x] Anti BotComo o nome do tópico diz, eu trouxe para vocês um sistema de anti bot.
Minha intenção é atualizar este código ao máximo, deixando o mesmo bastante customizável.
Quaisquer erros ou problemas por favor me deixe saber.
Como ele funciona?
Após um jogador matar uma quantidade x de monstros, o sistema irá realizar uma verificação com ele para saber se o mesmo está ou não 100% afk.
Essa verificação é feita através de um channel que se abre após o jogador matar a quantidade de monstros, realizando uma pergunta para o jogador.
O que é possível configurar?
Praticamente tudo! Você também pode adicionar quantas perguntas desejar! Organizei o script para que qualquer um possa realizar as configurações que desejar. Confira:
ANTI_BOT_SYSTEM = { config = { minMonstersToCheck = 2, -- O sistema irá escolher aleatoriamente um número de monstros entre esses dois valores para verificar. maxMonstersToCheck = 4, channelId = 10, -- Id do channel que será aberto para realizar a verificação. timeToAnswer = 10, -- Quanto tempo em segundos o jogador tem para responder a verificação. monstersForNotCheck = {'rat', 'bug', 'tiger'}, -- Monstros que não serão verificados pelo sistema. notations = 3, -- Quantas notificações o jogador pode receber antes de ser banido. banDays = 1, -- Quantidade de dias o personagem vai ficar banido por utilizar bot. storageForNotations = 1222, -- Storage onde ficará salvo as notations. storageForOpenChat = 10383, -- Storage que permitira o chat ser aberto. (Aconselho não mudar). }, questions = { [1] = {question = 'Digite quantas letras possui a palavra: Carro', answer = '5'}, [2] = {question = 'O que significa Ying e Yang?', answer = 'bem e o mal'}, [3] = {question = 'Qual é a cor do sol?', answer = 'amarelo'}, --[numero seguinte] = {question = 'pergunta', answer = 'resposta'}, }, cache = { players = { --[player:getId()] = {count = 1} }, question = 0, }, messages = { reason = {msg = 'Você foi banido por utilizar bot 100% AFK.'}, notation = {msg = 'Você foi penalizado e recebeu um notificação. Lembre-se que após receber 3 notificações você será banido. Você possui %d notificações no momento.', type = MESSAGE_EVENT_ADVANCE}, attention = {msg = '[Anti-Bot] Atenção! Você só possui %d segundos para responder a verificação.', type = TALKTYPE_CHANNEL_O}, channel_enter = {msg = '[Anti-Bot] Você está sobre suspeitas de uso aplicativos não autorizados.\nPor favor, confirme a verificação a seguir, você possui %d segundos para isso.', type = TALKTYPE_CHANNEL_O}, channel_close = {msg = '[Anti-Bot] Para sua segurança, não é possivel fechar este channel antes da verificação. Por favor responda o que lhe foi perguntado para que não seja penalizado.', type = TALKTYPE_CHANNEL_O}, wrong_answer = {msg = '[Anti-Bot] Resposta errada, por favor tente novamente.', type = TALKTYPE_CHANNEL_O}, correct_answer = {msg = '[Anti-Bot] Você respondeu corretamente, obrigado e bom jogo! Você já pode fechar este channel.', type = TALKTYPE_CHANNEL_O}, unconfirmed = {msg = 'Você não realizou a verificação corretamente, por isso você foi penalizado. Este channel já pode ser fechado.', type = TALKTYPE_CHANNEL_O}, } }
Tudo dentro desses espaços pode ser configurado sem nenhuma complicação!
Instalação:
Vá na pasta creaturescript/scripts do seu servidor e crie um arquivo com o nome de antibot.lua e adicione o seguinte conteúdo:
--[[ ## SCRIPT BY: Pedriinz ## ## CONTACT SKYPE: pedrosz4 ## ]] ANTI_BOT_SYSTEM = { config = { minMonstersToCheck = 2, -- O sistema irá escolher aleatoriamente um número de monstros entre esses dois valores para verificar. maxMonstersToCheck = 4, channelId = 10, -- Id do channel que será aberto para realizar a verificação. timeToAnswer = 10, -- Quanto tempo em segundos o jogador tem para responder a verificação. monstersForNotCheck = {'rat', 'bug', 'tiger'}, -- Monstros que não serão verificados pelo sistema. notations = 3, -- Quantas notificações o jogador pode receber antes de ser banido. banDays = 1, -- Quantidade de dias o personagem vai ficar banido por utilizar bot. storageForNotations = 1222, -- Storage onde ficará salvo as notations. storageForOpenChat = 10383, -- Storage que permitira o chat ser aberto. (Aconselho não mudar). }, questions = { [1] = {question = 'Digite quantas letras possui a palavra: Carro', answer = '5'}, [2] = {question = 'O que significa Ying e Yang?', answer = 'bem e o mal'}, [3] = {question = 'Qual é a cor do sol?', answer = 'amarelo'}, --[numero seguinte] = {question = 'pergunta', answer = 'resposta'}, }, cache = { players = { --[player:getId()] = {count = 1} }, question = 0, }, messages = { reason = {msg = 'Você foi banido por utilizar bot 100% AFK.'}, notation = {msg = 'Você foi penalizado e recebeu um notificação. Lembre-se que após receber 3 notificações você será banido. Você possui %d notificações no momento.', type = MESSAGE_EVENT_ADVANCE}, attention = {msg = '[Anti-Bot] Atenção! Você só possui %d segundos para responder a verificação.', type = TALKTYPE_CHANNEL_O}, channel_enter = {msg = '[Anti-Bot] Você está sobre suspeitas de uso aplicativos não autorizados.\nPor favor, confirme a verificação a seguir, você possui %d segundos para isso.', type = TALKTYPE_CHANNEL_O}, channel_close = {msg = '[Anti-Bot] Para sua segurança, não é possivel fechar este channel antes da verificação. Por favor responda o que lhe foi perguntado para que não seja penalizado.', type = TALKTYPE_CHANNEL_O}, wrong_answer = {msg = '[Anti-Bot] Resposta errada, por favor tente novamente.', type = TALKTYPE_CHANNEL_O}, correct_answer = {msg = '[Anti-Bot] Você respondeu corretamente, obrigado e bom jogo! Você já pode fechar este channel.', type = TALKTYPE_CHANNEL_O}, unconfirmed = {msg = 'Você não realizou a verificação corretamente, por isso você foi penalizado. Este channel já pode ser fechado.', type = TALKTYPE_CHANNEL_O}, } } function vericationBot(cid) local player = Player(cid) local timeNow = os.time() if not player then return true end if not ANTI_BOT_SYSTEM.cache.players[player:getId()] or ANTI_BOT_SYSTEM.cache.players[player:getId()].verified == false then return true else player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.unconfirmed.msg, ANTI_BOT_SYSTEM.messages.unconfirmed.type, ANTI_BOT_SYSTEM.config.channelId) ANTI_BOT_SYSTEM.cache.players[player:getId()] = nil if player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations) < ANTI_BOT_SYSTEM.config.notations then if player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations) ~= -1 then player:setStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations, math.max(player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations) + 1)) else player:setStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations, 1) end player:teleportTo(player:getTown():getTemplePosition()) player:sendTextMessage(ANTI_BOT_SYSTEM.messages.notation.type, string.format(ANTI_BOT_SYSTEM.messages.notation.msg, math.max(player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations)))) else player:teleportTo(player:getTown():getTemplePosition()) db.query("INSERT INTO `account_bans` (`account_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" ..getAccountNumberByPlayerName(player:getName())..", "..db.escapeString(ANTI_BOT_SYSTEM.messages.reason.msg)..", "..timeNow..", "..timeNow + (ANTI_BOT_SYSTEM.config.banDays * 86400) ..", 1)") player:remove() end end return true end function onKill(creature, target) local targetMonster = target:getMonster() local player = creature:getPlayer() local random = math.random(ANTI_BOT_SYSTEM.config.minMonstersToCheck, ANTI_BOT_SYSTEM.config.maxMonstersToCheck) if not targetMonster then return true end if isInArray(ANTI_BOT_SYSTEM.config.monstersForNotCheck, targetMonster:getName():lower()) then return true end if not ANTI_BOT_SYSTEM.cache.players[player:getId()] then ANTI_BOT_SYSTEM.cache.players[player:getId()] = {count = 1, verified = false} else if ANTI_BOT_SYSTEM.cache.players[player:getId()].count >= random then ANTI_BOT_SYSTEM.cache.players[player:getId()] = {count = math.max(ANTI_BOT_SYSTEM.cache.players[player:getId()].count), verified = true} player:openChannel(ANTI_BOT_SYSTEM.config.channelId) player:getPosition():sendMagicEffect(CONST_ME_TUTORIALSQUARE) else ANTI_BOT_SYSTEM.cache.players[player:getId()] = {count = math.max(ANTI_BOT_SYSTEM.cache.players[player:getId()].count) + 1, verified = false} end end return true end Após feito isso, abre o arquivo creaturescript/creaturescript.xml e adicione esta linha:
<!-- Anti Bot by Pedriinz --> <event type="kill" name="AntiBot" script="antibot.lua" /> Feito isso, abra o arquivo: creaturescript/scripts/others/login.lua e registre o script com a tag:
'AntiBot', Exemplo:
local events = { 'ElementalSpheresOverlords', 'BigfootBurdenVersperoth', 'Razzagorn', 'Shatterer', 'Zamulosh', 'The Hunger', 'AntiBot', } Agora, abre o arquivo chatchannels/chatchannels.xml e adicione a seguinte tag:
<channel id="10" name="Anti Bot" public="1" script="antibot.lua" /> Lembre-se que o ID deve ser o mesmo que você configurou no script principal lá em cima.
Agora abra a pasta chatchannels/scripts/ crie um script chamado antibot.lua e adicione:
function onJoin(player) if not player then return true end if not ANTI_BOT_SYSTEM.cache.players[player:getId()] or ANTI_BOT_SYSTEM.cache.players[player:getId()].verified == false then player:popupFYI('You can\'t open this channel.') return false end addEvent(function() player:sendChannelMessage("", string.format(ANTI_BOT_SYSTEM.messages.channel_enter.msg, ANTI_BOT_SYSTEM.config.timeToAnswer), ANTI_BOT_SYSTEM.messages.channel_enter.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) addEvent(function() local random = math.random(#ANTI_BOT_SYSTEM.questions) player:sendChannelMessage("", ANTI_BOT_SYSTEM.questions[random].question, TALKTYPE_CHANNEL_R1, ANTI_BOT_SYSTEM.config.channelId) ANTI_BOT_SYSTEM.cache.question = random end, 2000) addEvent(vericationBot, ANTI_BOT_SYSTEM.config.timeToAnswer * 1000, player:getId()) return true end function onLeave(player) if not player then return true end if ANTI_BOT_SYSTEM.cache.players[player:getId()] then player:openChannel(ANTI_BOT_SYSTEM.config.channelId) addEvent(function() player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.channel_close.msg, ANTI_BOT_SYSTEM.messages.channel_close.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) end end function onSpeak(player, type, message) player:sendChannelMessage(player:getName(), message, TALKTYPE_CHANNEL_Y, ANTI_BOT_SYSTEM.config.channelId) if message ~= ANTI_BOT_SYSTEM.questions[ANTI_BOT_SYSTEM.cache.question].answer then addEvent(function() player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.wrong_answer.msg, ANTI_BOT_SYSTEM.messages.wrong_answer.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) else addEvent(function() player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.correct_answer.msg, ANTI_BOT_SYSTEM.messages.correct_answer.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) ANTI_BOT_SYSTEM.cache.players[player:getId()] = nil end return false end Pronto! O seu antibot foi instalado com sucesso!
O código foi totalmente feito por mim, então os créditos são meus.
Qualquer sugestão para melhorias, por favor poste para que eu possa fazer
Abraços!
-
eviltox recebeu reputação de KotZletY em Bot Avatar World (Windy e Wan) 99,9% FuncionalComo o Título diz trago a vocês o bot para quem joga o Avatar World..
Como todos que jogam o server sabem, após a atualização do antigo server ficou-se impossibilitado de se usar o bot pelo cliente original por conta do anti-bot que por sua vez bloqueia até mesmo o uso do Candybot pelo OtC. Então eu basicamente configurei tudo para que o mesmo funcionasse pelo OTCliente novamente e também desbuguei todas as funções que estavam bugadas em outras versões liberadas por outros usuários deste mesmo bot para o antigo Avatar Legends.
O bot (CandyBot) utilizado neste tópico é o mesmo do original encontrado na git do BenDol (https://github.com/BenDol/otclient-candybot) porém com adições dos scripts e correções de certos bugs que só ocorriam dentro do Avatar.
Sem mais delongas e enrolações vamos ao que interessa.
OBS: ATUALMENTE PODE-SE USAR BOT NO SERVIDOR DO AVATAR, ESSA REGRA COMO QUALQUER OUTRA PODE SER ALTERADA E VOCÊ PODE PERDER SUA CONTA POR USO DE PROGRAMAS "ILEGAIS", SE VOCÊ ESTÁ CIENTE DISTO SIGA EM FRENTE E FAÇA O DOWNLOAD.
Deixarei alguns prints>=:
LINK DOWNLOAD: (DOWNLOAD AVATAR-BOT)
SCAN: SCAN DO BOT :D
Bom eu não irei entrar em muitos detalhes, o CandyBot está 100% funcional (target, pegar loot, potions, etc) e os scripts do canto esquerdo tem que saber configurar as funções mais difícies porém estarei disposto a retirar dúvidas que vocês postarem.. é isso flw
Créditos:
BeniS (Ben Dol) - [email protected] Alexandre do Amaral Severino - [email protected] Evesys -
eviltox deu reputação a xWhiteWolf em Nos ajude a melhorar com novos títulosRumo ao ban! -6
Desnecessário -1
Neutro 0
Primeiros passos 5
Pequeno gafanhoto 25
Rato do fórum 50
Membro fiél 75
Ajudante nato 100
Monstro 150
Membro Honorário 200
Uma paixão chamada tibia 300
Membro Honrado 500
Sacerdote do fórum 700
--850 retirar
Membro Lendário 1000
Professor 2000
Deus 3000
Outra alternativa é usar monstros do tibia pros ranks.
Rat
Snake
Bug
Troll
Rotworm
Amazon
Valkirye
Hero
-
eviltox deu reputação a Bruno Minervino em Servidor Completo 10.90Galera,
Há muito tempo eu havia sumido do mundo de tibia e otserv devido a vida profissional ter tomado muito de meu tempo. Durante este tempo que fiquei por aqui trabalhei em um projeto em cima do servidor opensource que eu mantinha (Vanaheim) e fiz uma versão onde tirei todas as missions e implementei alguns sistemas e paguei um desenvolvedor para fazer outros.
Alguns sistemas:
- Reward Chest
- Equip Hotkey
- Blessings
- Citywars (War Antientrosa)
- Tibia Store
Acho um desperdício isto estar como conteúdo privado então vou disponibilizar na comunidade todo o conteúdo.
Mapa global completo com sistemas integrados e Dawnport:
https://github.com/brunominervino/Lucera
Repositório com sistemas separados:
https://github.com/brunominervino/tfs_systems
Creio que não precise de scan pois os projetos estão no Github.
OBS: Não atenderei nenhum pedido de suporte, até porque não tenho tempo, minha intenção é que alguém dê seguimento.
-
eviltox deu reputação a Nailanb13 em [Tutorial] Baixando as imagens da Store do Tibia Global para utilizar em seu Store SystemEai galera do TK!
Descobri uma coisa hoje e não sei se já tem por aí...
Então trouxe aqui pra vocês pois é um grande adianto pra quem ta procurando as imagens do store.
Vamos aos passos:
Logue sua conta no tibia global com o cliente normal da cipsoft.
Abra a store e navegue por todos os items/categorias.
(Perceba que os novos items que você acessa a imagem demora um pouco para carregar, isso por que está sendo salva no seu PC!)
Após feito isso, abra o command prompt (Atalho: Windows+R) e digite o %appdata%.
(A janela que vai abrir é onde ficam guardados todos os arquivos de cache dos seus aplicativos.)
Navegue até a pasta Tibia->ImageCache. Eis aqui o pote de ouro!
Cada pasta de o nome final do arquivo, copie o nome da pasta e cole renomeando sua imagem.
E voilá eis o seu arquivo de imagem em png já com o nome!
É isso aí galera, se gostou do tutorial... REP+
-
eviltox deu reputação a Thayam em [OLD/OTC] Criando link de Download Direto para seu cliente!Fala Nação TK, tudo beleza com vocês?
Eu sou o Thayam, muito pouco conhecido (até porque sou muito novo no fórum), sou OT ADMIN e atualmente trabalho em um projeto de PokeTibia que divulgarei em breve. MAS O QUE ISSO TEM A VER? - Absolutamente nada, é apenas uma apresentação pessoal para aqueles que não me conhecem, enfim, recebi ajuda de muitos usuários nesse fórum e isso me motivou a tentar ajudar aqueles que também estão começando.
Esse tutorial é bem simples, porém eu procurei nesse fórum e não achei nada relacionado, então achei interessante cria-lo para explicar como criar um link de Download Direto para seu client usando o DropBox!
ATENÇÃO: Nesse tutorial não ensinarei a compilar o cliente, somente a disponibilizá-lo para download em um link livre de download hosters.
Ok, vamos lá:
1° Passo: Entendendo o que é um Link Direto
Sabe quando você acessa um site para baixar aquele cliente de servidor que você tanto quer, e ao clicar em download (normalmente está escrito Clique Aqui fazendo com que você realmente ache que ao clicar ali você já irá fazer o download do arquivo) o site te redireciona para algum download hoster dentro dos bilhares existentes - porém nem todos confiáveis - e você precisa se registrar, ou esperar 20 segundos, ou acertar aquele códigozinho ilegível chamado captcha? Então, ao criar um link direto para seu cliente, quando o usuário acessá-lo, ele irá fazer o download do seu cliente automáticamente, sem espera, nem desenhos, nem códigos (eu realmente odeio aqueles códigos)
2° Passo: Criar uma conta no DropBox
Acesse o site do DropBox clicando aqui: https://www.dropbox.com/
3° Passo: Crie sua conta no DropBox
Clique em Registrar-se e preencha o formulário com os seus dados (Nome, Sobrenome, E-mail, Senha) em seguide aceite os termos e clique em Registrar-se e o site irá fazer o download automáticamente do programa (ATENÇÃO: NÃO É NECESSÁRIO O DOWNLOAD DO PROGRAMA, SOMENTE CASO VOCÊ QUEIRA O TER EM SEU PC)
4° Passo: Após o download (ou não) clicar no ícone do DropBox
Após ter feito o download (ou não) do cliente do dropbox clique no ícone do site no canto superior esquerdo da tela.
5° Passo: Clicar no ícone Enviar
Clicar no ícone Enviar, e em seguida clicar em Selecionar Arquivos.
6° Passo: Selecionar o arquivo em seu Computador
Selecione o arquivo que você quer que os usuários baixem e clique em Abrir (No meu está Open porque meu Windows esta em Inglês) e em seguida clique em Pronto.
OBS: O Arquivo que será upado não precisa necessariamente ser um arquivo zipado (.rar, .zip, .7zip etc).
7° Passo: Clique sobre o arquivo upado e copie seu link de download
Clique sobre o nome do arquivo que você acabou de upar e em seguida clique com o botão direito do mouse e selecione a opção Copiar Link.
8° e último passo: Cole esse link copiado no arquivo do seu site e pronto
Cole o link que você copiou no arquivo de download do seu site e pronto.
RECOMENDAÇÃO: Cole o link que você copiou no seu navegador como feito na imagem do passo 8 para testar se tudo ocorreu bem
E assim chegamos ao fim deste tutorial, como eu disse antes, é muito simples, mas acredito que muitos não sabiam e podem sim absorver algo de positivo deste conteúdo!
É Isso galera, gostaram? se sim, comente ai em baixo, e caso não gostaram, comentem também, todas as críticas construtivas são bem vindas!
Até a proxima!
Créditos:
~~Thayam
-
eviltox deu reputação a Guilherme em Mostrando suas HuntsPor: BananaFight > DragonElement
Bom, como acho que todos ja viram o map do servidor de poketibia (Pxg) ele mostra icones, nomes etc no minimap, e hoje vim trazer isso para vocês
Nome: Map Icon Descrição: Adiciona um icone no minimap Autor: Eduardo Vicente (Banana Fight) Versão 1.0
Features: Criar Icones no minimap
Instalação
dentro de modules/game_minimap/minimap.lua
embaixo de :
function toggle() if minimapButton:isOn() then minimapWindow:close() minimapButton:setOn(false) else minimapWindow:open() minimapButton:setOn(true) end end Você adiciona a função :
function setMonsterCave(posx, posy, posz, icon, description) local pos = {} pos.x = posx pos.y = posy pos.z = posz minimapWidget:addFlag(pos, icon, description) end function removeMonsterCave(posx, posy, posz, icon, description) local pos = {} pos.x = posx pos.y = posy pos.z = posz minimapWidget:removeFlag(pos, icon, description) end Como usar
setMonsterCave(Posição X do map, Posição Y do map,Posição Z do map, "Nome da Imagem", "Descrição que vai aparecer") Obs: como eu usei uma função que já existe você vai te que seguir um padrão na hora de adicionar o nome da sua imagem.
Exemplo: O nome da minha imagem é "dragonicon.png", para que eu possa usar ela no script eu tenho que adicionar essa imagem dentro da pasta "data/images/game/minimap/", e vou ter que renomear essa imagem para "flagdragonicon.png", Ai depois de ter feito isso dentro do meu script quando eu for fazer o script adicionar essa imagem eu vou fazer da seguinte maneira :
setMonsterCave(32238, 32240, 7, "dragonicon", "Dragon Cave")
Se você ainda não entendeu é da seguinte forma, você tem uma imagem com nome "test.png", você vai adiciona a imagem no lugar certo, com o nome "flagtest.png", ai dentro do script você só usa "test", pois o script já sabe que vai ter que juntar flag+nome da imagem que você adicionou+.png.
Obs 2: Sua imagem tem que ter o fundo transparente
Obs 3: quando mais transparente for a imagem, mais do map aparece e causa o efeito igual ao do PXG, do map se abrindo.
Exemplo de uso :
arquivo : minimap.lua
function init() minimapButton = modules.client_topmenu.addRightGameToggleButton('minimapButton', tr('Minimap') .. ' (Ctrl+M)', '/images/topbuttons/minimap', toggle) minimapButton:setOn(true) minimapWindow = g_ui.loadUI('minimap', modules.game_interface.getRightPanel()) minimapWindow:setContentMinimumHeight(64) minimapWidget = minimapWindow:recursiveGetChildById('minimap') local gameRootPanel = modules.game_interface.getRootPanel() g_keyboard.bindKeyPress('Alt+Left', function() minimapWidget:move(1,0) end, gameRootPanel) g_keyboard.bindKeyPress('Alt+Right', function() minimapWidget:move(-1,0) end, gameRootPanel) g_keyboard.bindKeyPress('Alt+Up', function() minimapWidget:move(0,1) end, gameRootPanel) g_keyboard.bindKeyPress('Alt+Down', function() minimapWidget:move(0,-1) end, gameRootPanel) g_keyboard.bindKeyDown('Ctrl+M', toggle) g_keyboard.bindKeyDown('Ctrl+Shift+M', toggleFullMap) minimapWindow:setup() connect(g_game, { onGameStart = online, onGameEnd = offline, }) connect(LocalPlayer, { onPositionChange = updateCameraPosition }) if g_game.isOnline() then online() setMonsterCave(32239, 32240, 7, "dragon", "hihi") removeMonsterCave(32239, 32240, 7, "dragon", "hihi") end end -
eviltox deu reputação a Guilherme em [C++] Opcode versão 8.54+Por: BananaFight > DragonElement
Adaptação pra source 8.54+
LEMBRE-SE, ISSO É NA SOURCE DO SERVIDOR
Vamos ao código.
protocolgame.h
Embaixo de
void AddShopItem(NetworkMessage_ptr msg, const ShopInfo item); Adicione
void parseExtendedOpcode(NetworkMessage& msg); void sendExtendedOpcode(uint8_t opcode, const std::string& buffer); protocolgame.cpp
Embaixo de
uint32_t key[4] = {msg.GetU32(), msg.GetU32(), msg.GetU32(), msg.GetU32()}; enableXTEAEncryption(); setXTEAKey(key); Adicione
// notifies to otclient that this server can receive extended game protocol opcodes if(operatingSystem >= CLIENTOS_OTCLIENT_LINUX) sendExtendedOpcode(0x00, std::string()); Embaixo de
void ProtocolGame::AddShopItem(NetworkMessage_ptr msg, const ShopInfo item) { const ItemType& it = Item::items[item.itemId]; msg->AddU16(it.clientId); if(it.isSplash() || it.isFluidContainer()) msg->AddByte(fluidMap[item.subType % 8]); else if(it.stackable || it.charges) msg->AddByte(item.subType); else msg->AddByte(0x01); msg->AddString(item.itemName); msg->AddU32(uint32_t(it.weight * 100)); msg->AddU32(item.buyPrice); msg->AddU32(item.sellPrice); } Adicione
void ProtocolGame::parseExtendedOpcode(NetworkMessage& msg) { uint8_t opcode = msg.GetByte(); std::string buffer = msg.GetString(); // process additional opcodes via lua script event addGameTask(&Game::parsePlayerExtendedOpcode, player->getID(), opcode, buffer); } void ProtocolGame::sendExtendedOpcode(uint8_t opcode, const std::string& buffer) { // extended opcodes can only be send to players using otclient, cipsoft's tibia can't understand them NetworkMessage_ptr msg = getOutputBuffer(); if(msg) { TRACK_MESSAGE(msg); msg->AddByte(0x32); msg->AddByte(opcode); msg->AddString(buffer); } } Embaixo de
case 0x1E: // keep alive / ping response parseReceivePing(msg); break;
Adicione
case 0x32: // otclient extended opcode parseExtendedOpcode(msg); break; enums.h
Embaixo de
enum GuildLevel_t { GUILDLEVEL_NONE = 0, GUILDLEVEL_MEMBER, GUILDLEVEL_VICE, GUILDLEVEL_LEADER }; Substitua o OperatingSystem por este
enum OperatingSystem_t { CLIENTOS_LINUX = 0x01, CLIENTOS_WINDOWS = 0x02, CLIENTOS_OTCLIENT_LINUX = 0x0A, CLIENTOS_OTCLIENT_WINDOWS = 0x0B, CLIENTOS_OTCLIENT_MAC = 0x0C, };/
player.h
Embaixo de
void sendCreatureShield(const Creature* creature) Adicione
void sendExtendedOpcode(uint8_t opcode, const std::string& buffer) {if(client) client->sendExtendedOpcode(opcode, buffer);} luascript.cpp
Embaixo de
void LuaScriptInterface::registerFunctions() { Adicione
//doSendPlayerExtendedOpcode(cid, opcode, buffer) lua_register(m_luaState, "doSendPlayerExtendedOpcode", LuaScriptInterface::luaDoSendPlayerExtendedOpcode); Embaixo de
SHIFT_OPERATOR(int32_t, LeftShift, <<) SHIFT_OPERATOR(int32_t, RightShift, >>) SHIFT_OPERATOR(uint32_t, ULeftShift, <<) SHIFT_OPERATOR(uint32_t, URightShift, >>) #undef SHIFT_OPERATOR Adicione
int32_t LuaScriptInterface::luaDoSendPlayerExtendedOpcode(lua_State* L) { //doSendPlayerExtendedOpcode(cid, opcode, buffer) std::string buffer = popString(L); int opcode = popNumber(L); ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) { player->sendExtendedOpcode(opcode, buffer); lua_pushboolean(L, true); } lua_pushboolean(L, false); return 1; } luascript.h
Embaixo de
virtual void registerFunctions(); Adicione
static int32_t luaDoSendPlayerExtendedOpcode(lua_State* L); creatureevent.h
.
Substitua
CREATURE_EVENT_PREPAREDEATH Por isso
CREATURE_EVENT_PREPAREDEATH, CREATURE_EVENT_EXTENDED_OPCODE // otclient additional network opcodes Embaixo de
uint32_t executePrepareDeath(Creature* creature, DeathList deathList); Adicione
uint32_t executeExtendedOpcode(Creature* creature, uint8_t opcode, const std::string& buffer); creatureevent.cpp
Embaixo de
else if(tmpStr == "death") m_type = CREATURE_EVENT_DEATH; Adicione
else if(tmpStr == "extendedopcode") m_type = CREATURE_EVENT_EXTENDED_OPCODE; Embaixo de
case CREATURE_EVENT_DEATH: return "onDeath"; Adicione
case CREATURE_EVENT_EXTENDED_OPCODE: return "onExtendedOpcode"; Embaixo de
case CREATURE_EVENT_DEATH: return "cid, corpse, deathList"; Adicione
case CREATURE_EVENT_EXTENDED_OPCODE: return "cid, opcode, buffer"; Embaixo de
std::cout << "[Error - CreatureEvent::executeFollow] Call stack overflow." << std::endl; return 0; } } Adicione
uint32_t CreatureEvent::executeExtendedOpcode(Creature* creature, uint8_t opcode, const std::string& buffer) { //onExtendedOpcode(cid, opcode, buffer) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(creature->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(creature) << std::endl; scriptstream << "local opcode = " << (int)opcode << std::endl; scriptstream << "local buffer = " << buffer.c_str() << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEvent(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(creature->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(creature)); lua_pushnumber(L, opcode); lua_pushlstring(L, buffer.c_str(), buffer.length()); bool result = m_interface->callFunction(3); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeRemoved] Call stack overflow." << std::endl; return 0; } } game.h
Embaixo de
int32_t getLightHour() {return lightHour;} void startDecay(Item* item); Adicione
void parsePlayerExtendedOpcode(uint32_t playerId, uint8_t opcode, const std::string& buffer);
game.cpp
Embaixo de
player->sendTextMessage(MSG_INFO_DESCR, buffer); }
Adicione
void Game::parsePlayerExtendedOpcode(uint32_t playerId, uint8_t opcode, const std::string& buffer) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return; CreatureEventList extendedOpcodeEvents = player->getCreatureEvents(CREATURE_EVENT_EXTENDED_OPCODE); for(CreatureEventList::iterator it = extendedOpcodeEvents.begin(); it != extendedOpcodeEvents.end(); ++it) (*it)->executeExtendedOpcode(player, opcode, buffer); } /creaturescripts/creaturescrips.xml
<event type="extendedopcode" name="ExtendedOpcode" event="script" value="extendedopcode.lua"/>
/creaturescripts/extendedopcode.lua
OPCODE_LANGUAGE = 1 function onExtendedOpcode(cid, opcode, buffer) if opcode == OPCODE_LANGUAGE then -- otclient language if buffer == 'en' or buffer == 'pt' then -- example, setting player language, because otclient is multi-language... --doCreatureSetStorage(cid, CREATURE_STORAGE_LANGUAGE, buffer) end else -- other opcodes can be ignored, and the server will just work fine... end end Créditos : MaXwEllDeN 100% por adaptar o código
-
eviltox deu reputação a Vodkart em Boss Mechanics Ideas (All Servers)Boss Mechanics
Entendendo o Projeto: O projeto é simples mas muito importante, o intuito é juntar a comunidade para desenvolver códigos voltado á mecânicas de BOSSES. Já imaginou você numa hunt enfrentando um monstro que seja diferente, que tenha suas próprias habilidades? que seja único! Que tenha toda uma emoção ir caçar com os amigos, ao invés de colocar só o char para atacar e healar, sem graça.
Como Participar: Todos podem participar, não precisa ser necessariamente um scripter, pode ser um mapper que ajude distribuindo as áreas(mapas) onde os bosses vão ficar, se for um scripter, ajudar a comunidade no desenvolvimento do código, ou participe dando ideias sobre novas mecânicas, feito isso todos terão disponibilidade de usar em seu servidor. Exemplo de código onde existe mecânica: http://www.tibiaking.com/forum/topic/57963-tfs-1x-gazharagoth-heal-magia-teleport/
Algumas Ideias:
[+] 1° - Spider Boss (Nível: Simples) [+] ° Quando jogadores aparecem na área, aranha ser teleportada para segundo flow, sumonar diversas aranhas pequenas e jogar poison na área. ° Aranha ter a mecânica de teleportar para trás do jogador, pegar o jogador e aparecer em outro lugar, fazendo com que o jogador fique parado e não possa atacar até um player dar um hit na aranha [+] 2° - King Ragnaros Boss (Nível: Intermediário) [+] ° Monstro ter a mecânica de "plantar" bombas em uma área randômica, feito isso os jogadores tem que destruir essas bombas em "X" segundos. obs: se não destruir as bombas, elas da uma explosão em área, dando um dano elevado. ° Monstro deve ser morto dentro de "X" segundos após estar com 10% total da sua vida, caso contrário ele irá se healar 30% total da sua vida. ° Monstro silencia o uso de spells durante algum tempo [+] 3° The Four Elements Bosses (Nível: Simples) [+] ° Serão 4 salas com 4 Boss, cada sala um elemento, e só vão conseguir destruir os Boss se todos estiverem com 10% do HP ou menos. [+] 4° Abyssion Boss (Nível: intermediário) [+] ° 3 stages do Boss, cada stage com outfit + magias + hp diferente + mapa diferente ° Monstro silencia o uso de spells durante algum tempo ° Após o Boss morrer, área em torno do Boss ficar piscando durante "X" segundos, depois dar uma explosão com hit mortal caso o jogador estiver na área da explosão. -----> FIM <----- É isso ai galera, espero que todos contribuam neste projeto!! caso tenha alguma ideia para aprimorar ou queira ajudar no desenvolvimento do projeto, deixa sua mensagem neste tópico que eu vou editando. -
eviltox deu reputação a Fir3element em [8.60] The Forgotten Server 0.4 By Fir3Element (SQL and MYSQL)Reporte qualquer bug encontrado.
- Mudanças:
* opcode adicionado
* Monstros andando em cima de corpos
* War system arrumado
* Anti-divulgação melhorado
* Cast system arrumado
* Crash bugs arrumados
* Adicionado exhaust ao comprar/vender items
* Account manager com opção para cidades
* /ghost stacking arrumado
* !disband arrumado
* Erros no linux arrumado
* Aleta som arrumado
* Bug nos rings arrumado
* Adicionado suporte para Visual Studio
* Remover battle ao entrar em PZ
* Não pode jogar lixo em casas
* Salt removido
- Downloads:
* Distro (x32): https://github.com/Fir3element/binaries/raw/master/x32-windows.zip
* Distro (x64): https://github.com/Fir3element/binaries/raw/master/x64-windows.zip
* Requisitos: Microsoft Visual C++ Redistributable Package
* Source + datapack: https://github.com/Fir3element/3777/archive/refs/heads/main.zip
- Scans:
* Distro (x32): https://virustotal.com/pt/file/6683a91273b848a39ac21288da9d3abde341436744d6846e35a477c8e7c8f5f7/analysis/1480675335/
* Distro (x64): https://virustotal.com/pt/file/21028857bb1124f19e0353e7f5775c8f66afc4f87f29df9cf4ab8ca1a046b816/analysis/1480675394/
* Source + datapack: https://virustotal.com/pt/file/3761b48ee19f3f540d4c4a48c35c73c89a85615876307073494b1dcfed464d36/analysis/1480675473/
-
eviltox deu reputação a xWhiteWolf em Dodge System 8.54+Ae galera do TK, uns caras ficaram me mandando PM pedindo esse sistema aqui.. aparentemente tem em algum server e eles queriam replicar o sistema no OT deles. Não sei como funciona no outro server mas no script que eu fiz vai funcionar assim:
Serão 100 livros que você poderá comprar de um npc específico, cada livro te dá 1 ponto a mais na skill Dodge e isso acarreta em 0.3% de chance a mais de desviar de um golpe e tomar só 50% de dano. Infelizmente eu nunca joguei no servidor que foi o pioneiro desse sistema (na vdd eu nem sei qual é) então eu não fiz igual o deles, na realidade o meu só funciona ao perder vida então se o mago usar utamo vita acabou os dodge's dele. Outra coisa importante é que o player tem uma chance rara de dar Dodge no Dodge, ou seja, levando 1/4 do dano. Só vai funcionar para ataques de criaturas, tanto melee quanto spells, ou seja, se o cara passar no fogo não tem chance dele desviar do dano
Sem mais delongas, vamos ao script:
Crie um arquivo chamado dodge.lua na pasta creaturescripts\scripts e coloque isso dentro dele:
agora adicione essa linha no creaturescripts.xml:
<event type="statschange" name="dodge" event="script" value="dodge.lua"/> em creaturescripts\scripts\login.lua adicione isso antes do ultimo return true:
registerCreatureEvent(cid, "dodge") if getPlayerStorageValue(cid, 48902) == -1 then setPlayerStorageValue(cid, 48902, 0) end agora vá em actions.xml e adicione essa linha aqui:
<action itemid="1950" script="dodgebook.lua"/> note que vc pode mudar o ID do livro a hora que vc quiser.
em items.xml, procure o item com o ID que vc irá utilizar e deixe ele assim:
<item id="1950" article="a" name="Skill Book [DODGE]"> <attribute key="weight" value="1300" /> </item> agora crie um arquivo chamado dodgebook em actions\scripts e coloque isso dentro dele:
-
eviltox deu reputação a Risadinhaa em Packs de SpritesBoa tarde, parei de mecher com otserv por falta de equipe e vou deixar aqui muuuitas sprites que usei, lembrando que algumas delas podem ser encontradas no tibiaking só estou repassando pra vocês, Bom uso, principalmente os kids que estão colocando servidores online usem umas sprites diferentes para dar uma inovada PO!
Pack de sprites do avatar >
http://www.4shared.com/rar/ztq596Blce/Pack_sprites_avatar_wwwxtibiac.html?
Scan > https://www.virustotal.com/pt/file/31882929cb388952e7ce637e880efa214a84f14e0d3ed54ecbb1210c0e0e7fb0/analysis/1465325448/
Remakes>http://www.4shared.com/rar/wZtn07azba/Remakes.html?
Scan>https://www.virustotal.com/pt/file/0ba7ad0ccf08b94d4888889cbaa05c8986157f23a586f54fb3d1abc2b9d8505f/analysis/1465325655/
Sprite de gramas>http://www.4shared.com/rar/NpD3kAR-ba/Sprite_Grama.html?
Scan>https://www.virustotal.com/pt/file/8817f13bb6e5855e98fb67f6e4ce4847a56b5e46d6ff5ddb07675f1e8cfacdaf/analysis/
Sprites Cidade [PxG]>https://www.virustotal.com/pt/file/cf6978978517cd59fc80e7554e3a375666ee9a68313b30c714a6cf9c4e27e35c/analysis/1465325835/
Scan>https://www.virustotal.com/pt/file/cf6978978517cd59fc80e7554e3a375666ee9a68313b30c714a6cf9c4e27e35c/analysis/1465325835/
Obs: caso alguem tenha a ver com algumas dessas sprites entrem em contato cmg para mim colocar os creditos.
-
eviltox deu reputação a xWhiteWolf em Slot Cassino [0.36~0.4]Olá pessoas, hoje vim trazer pra vocês um script que inicialmente fiz prum trabalho mas acabei gostando muito dele e decidi postar.
To meio que indo dormir porque daqui a pouquinho tenho aula então vai ser tudo bem rapido e se vcs tiverem alguma dúvida comentem aqui.
Primeiramente façam uma sala parecida com essa aqui:
Não precisa ser necessariamente assim, mas ela deve ter as 3 bolas, uma alavanca e um local pra botar o dinheiro pras apostas.
O sistema é baseado naqueles jogos de slot nos cassinos onde você aposta uma quantidade de dinheiro e se tirar 3 peças iguais você recebe o dobro do dinheiro apostado.
em actions/scripts crie um arquivo chamado cassino.lua e adicione o seguinte dentro dele:
Agora em data/actions/actions.xml adicione:
<action actionid="16541" script="cassino.lua"/>
Agora só botar a actionid na lever e configurar tudo de acordo com seu sv (as posições ali em pieces são as posições de cada peça, ou cada bola, se preferir.)
se quiser fazer várias salas é só copiar o código pra um cassino2.lua e registrar outra tag
<action actionid="16542" script="cassino2.lua"/>;
Tá tudo comentado no código então acho que dispensa uma explicação formal de como editar, espero que vocês gostem
Aqui tem um pequeno gif que o membro @eviltox nos forneceu:
Abraços do Lobo!
-
eviltox deu reputação a xWhiteWolf em (Resolvido)Monstro que enche vida e manacria a spell que vai encher a vida/mana
local config = { health = 300, mana = 300 } function onCastSpell(cid, var) if getCreatureMaster(cid) then local master = getCreatureMaster(cid) if isInParty(master) then local members = getPartyMembers(getPlayerParty(master)) local health = math.ceil( config.health / #members ) local mana = math.ceil( config.mana / #members ) for i = 1, #members do doCreatureAddHealth(members[i], health) doCreatureAddMana(members[i], mana) doSendAnimatedText(getCreaturePosition(members[i]), "+"..health, 18) doSendMagicEffect(getCreaturePosition(members[i]), 12) end else doCreatureAddHealth(master, config.health) doCreatureAddMana(master, config.mana) doSendAnimatedText(getCreaturePosition(master), "+"..config.health, 18) doSendMagicEffect(getCreaturePosition(master), 12) end end return true end declara ela e coloca pra só monstros poderem usar:
<instant name="healmaster" words="healmaster" lvl="0" mana="0" prem="0" aggressive="0" exhaustion="1500" needlearn="1" event="script" value="especiais/healmaster.lua"> </instant> agora vá no xml do monstro que vc quer que solte essa magia e embaixo de
<defenses armor="7" defense="5"> coloque isso daqui:
<defense name="healmaster" interval="10000" chance="99" duration="100"> </defense> No final, se seu monstro não usar nenhuma outra magia de defesa, deve ficar assim:
<defenses armor="7" defense="5"> <defense name="healmaster" interval="10000" chance="99" duration="100"> </defense> </defenses> esse /defense fecha a magia e o /defenses fecha a armor lá em cima