Ir para conteúdo

Oneshot's Anti-bot


Oneshot

Posts Recomendados

Nome: Oneshot's Anti-bot
Autor: Oneshot
Tipo: Sistema




Descrição

Este é um sistema de anti-bot simples, que envia um código numérico de 6 dígitos para cada jogador online e pede para que, através de um comando, este código de verificação seja ativado. O jogador tem um limite de tempo para fazer isso, e caso não faça, este é banido por um tempo configurável ou então, preso em um certo lugar do mapa.

Instalação

1. Em data/lib, crie um arquivo chamado antibot.lua e cole o conteúdo abaixo:

ANTIBOT_STORAGE_1 = 109001
ANTIBOT_STORAGE_2 = 109002

ANTIBOT_STORAGE_3 = 109003

ANTIBOT_TYPE = 2 -- [1] = Banimento, [2] = Prisão

ANTIBOT_DURATION = 120 -- Em segundos
ANTIBOT_DURATION_DELAY = 10 -- Em segundos

ANTIBOT_MESSAGE = "[Oneshot's Anti-bot]\nSeu código de verificação é %s, responda através do comando !antibot, caso contrário, será ".. (ANTIBOT_TYPE == 1 and "banido" or "preso") ..".\nVocê têm %s segundos."

ANTIBOT_BAN_TIME = 24 * 60 * 60
ANTIBOT_PRISON = {x = 1019, y = 867, z = 7}
ANTIBOT_PRISON_FROMPOSITION = {x = 1018, y = 865, z = 7}
ANTIBOT_PRISON_TOPOSITION = {x = 1020, y = 869, z = 7}
ANTIBOT_PRISON_DURATION = 3 * 60 * 60
ANTIBOT_TEMPLE = {x = 1027, y = 912, z = 5}

function AntiBot(cid)
if not isCreature(cid) then
return
end

local time = getCreatureStorage(cid, ANTIBOT_STORAGE_1)
local answer = getCreatureStorage(cid, ANTIBOT_STORAGE_2)

if getPlayerAccess(cid) >= 3 or not(getPlayerAccountManager(cid) == MANAGER_NONE) then
return
end

if isInRange(getThingPosition(cid), ANTIBOT_PRISON_FROMPOSITION, ANTIBOT_PRISON_TOPOSITION) then
return
end

if time == -1 and answer == -1 then
return
end

if os.time() >= time then
doCreatureSetStorage(cid, ANTIBOT_STORAGE_1, -1)
doCreatureSetStorage(cid, ANTIBOT_STORAGE_2, -1)
doBroadcastMessage("[ANTI-BOT] O jogador ".. getCreatureName(cid) .." foi ".. (ANTIBOT_TYPE == 1 and "banido" or "preso") .." por uso de bot.")
if ANTIBOT_TYPE == 1 then
doAddAccountBanishment(getPlayerGUID(cid), 0, (os.time() + ANTIBOT_BAN_TIME), 12, 3, "[ANTI-BOT]")
doRemoveCreature(cid)
else
doTeleportThing(cid, ANTIBOT_PRISON)
doCreatureSetStorage(cid, ANTIBOT_STORAGE_3, os.time() + ANTIBOT_PRISON_DURATION)
addEvent(function()
if isCreature(cid) then
doTeleportThing(cid, ANTIBOT_TEMPLE)
end
end, ANTIBOT_PRISON_DURATION * 1000)
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, ANTIBOT_MESSAGE:format(answer, (time - os.time())))
addEvent(AntiBot, ANTIBOT_DURATION_DELAY * 1000, cid)
end
end

2. Crie um arquivo chamado antibot.lua em data/globalevents/scripts, cole o conteúdo abaixo

function onThink(interval)
for _, cid in ipairs(getPlayersOnline()) do
local answer = math.random(100000, 999999)

doCreatureSetStorage(cid, ANTIBOT_STORAGE_1, os.time() + ANTIBOT_DURATION)
doCreatureSetStorage(cid, ANTIBOT_STORAGE_2, answer)
AntiBot(cid)
end
return true
end

Adicione a seguinte linha em globalevents.xml

<globalevent name="antibot" interval="900" event="script" value="antibot.lua"/>

3. Crie um arquivo em data/creaturescripts/scripts, cole o conteúdo abaixo

function onLogin(cid)
local time = getCreatureStorage(cid, ANTIBOT_STORAGE_1)
local answer = getCreatureStorage(cid, ANTIBOT_STORAGE_2)

if answer == -1 then
return true
end

if isInRange(getThingPosition(cid), ANTIBOT_PRISON_FROMPOSITION, ANTIBOT_PRISON_TOPOSITION) then
if os.time() > getCreatureStorage(cid, ANTIBOT_STORAGE_3) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Seu tempo de prisão acabou.")
doTeleportThing(cid, ANTIBOT_TEMPLE)
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você ainda está preso por uso de bot.")
end
return true
end

if os.time() > ANTIBOT_STORAGE_1 then
doCreatureSetStorage(cid, ANTIBOT_STORAGE_1, os.time() + ANTIBOT_DURATION)
return true
end
AntiBot(cid)
return true
end

Adicione a seguinte linha em seu creaturescripts.xml

<event type="login" name="Antibot" event="script" value="antibot.lua"/>

4. Crie um arquivo chamado antibot.lua em data/talkactions/scripts, cole o conteúdo abaixo

function onSay(cid, words, param, channel)
param = tonumber(param) or ""

local time = getCreatureStorage(cid, ANTIBOT_STORAGE_1)
local answer = getCreatureStorage(cid, ANTIBOT_STORAGE_2)

if time == -1 and answer == -1 then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "O anti-bot não está ativado.")
return true
end

if param == "" then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Digite uma senha de verificação válida.")
return true
end

if param ~= answer then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você digitou a senha incorreta. Digite corretamente, caso contrário, será banido.")
return true
end

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Ótimo! Você digitou a resposta correta. O anti-bot foi desativado.")
doCreatureSetStorage(cid, ANTIBOT_STORAGE_1, -1)
doCreatureSetStorage(cid, ANTIBOT_STORAGE_2, -1)
return true
end

Adicione a seguinte linha em seu talkactions.xml

<talkaction words="!antibot" event="script" value="antibot.lua"/>

Você pode fazer várias configurações na lib do sistema

ANTIBOT_STORAGE_1 = 109001
ANTIBOT_STORAGE_2 = 109002

ANTIBOT_STORAGE_3 = 109003

ANTIBOT_TYPE = 2 -- [1] = Banimento, [2] = Prisão

ANTIBOT_DURATION = 120 -- Em segundos
ANTIBOT_DURATION_DELAY = 10 -- Em segundos

ANTIBOT_MESSAGE = "[Oneshot's Anti-bot]\nSeu código de verificação é %s, responda através do comando !antibot, caso contrário, será ".. (ANTIBOT_TYPE == 1 and "banido" or "preso") ..".\nVocê têm %s segundos."

ANTIBOT_BAN_TIME = 24 * 60 * 60
ANTIBOT_PRISON = {x = 1019, y = 867, z = 7}
ANTIBOT_PRISON_FROMPOSITION = {x = 1018, y = 865, z = 7}
ANTIBOT_PRISON_TOPOSITION = {x = 1020, y = 869, z = 7}
ANTIBOT_PRISON_DURATION = 3 * 60 * 60
ANTIBOT_TEMPLE = {x = 1027, y = 912, z = 5}

Como a duração do ban, a posição da prisão, o tempo de prisão, dentre outras coisas.

Como não consegui fazer funcionar o banimento de um jogador só na versão 0.3.6pl1, sendo isto possível apenas na 0.4.0, resolvi colocar para o tipo de banimento ser na conta toda.

Abraços.

Editado por CyberBot
Link para o comentário
Compartilhar em outros sites

vlw mano REP + so uma duvida quando o jogador é banido aparece uma brodclastle pra todos falando que o jogador tal foi banido ?

 

@ edit mais uma coisa tem um bug quando o player responde o sistema alguns segundos depois ele é kickado teria como arrumar isso de kickar o player depois que ele responder o sistema ?

Editado por KennyxD
Link para o comentário
Compartilhar em outros sites

Bacana a ideia, quando tiver uma solução pro problema vou por no meu tbm, legal, e dou rep+ tbm.

 

Opa editando, postei um pouco depois kkkkkkkk

 

quando add no server, vou testar, se funfar beleza rep+

 

tenho umas dúvidas tbm, se puder me ajudar...

 

http://www.xtibia.com/forum/topic/201195-pedidoduvida-duel-esp-evo/

 

abrass

Editado por zedarosquinha
Link para o comentário
Compartilhar em outros sites

vlw por arrumar os bugs e adicionar o brodcastle

 

so mais 2 pedidos de modificações no script 1 pode ser pra todos mesmo o outro pode ser individual te darei + 1 REP assm que chegar

 

1º colocar pro sistema não abordar os players que estiverem sem batle porque se não vai abordar os players afk no templo etc.

 

agora o segundo é individual porque nen todos usam o sistema de ban = do radbr feito pelo luckoake

 

2º teria como colocar pra min pra banir usando esse tipo de ban aki dai no caso você so pegaria a função dele de banir e colocaria no sitema pra min porque no meu otserver trabalho com sistema de warnings quando é banido igual no radbr ^^

 


function onSay(cid, words, param)
               local t = string.explode(param, ",")
               local a = {
                       [1] = 20,
                       [2] = 40,
                       [3] = 60,
                       [4] = 90,
                       [5] = 120,
                       [6] = 150,
                       [7] = 250,
                       [8] = 350,
                       [9] = 500,
                       [10] = 750,
                       [11] = 999,
               }

               local b = a[t[3]]

               if not t[2] or tonumber(t[2]) or t[3] and not tonumber(t[3]) or t[4] then
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Especifique nome,motivo,warnings(opcional).") return true
               elseif not getPlayerGUIDByName(t[1]) then
                       doPlayerSendCancel(cid, "O jogador "..t[1].." não existe.") return true
               elseif isAccountBanished(getAccountIdByName(t[1])) then
                       doPlayerSendCancel(cid, "O player "..t[1].." já está banido.") return true
               elseif t[3] and tonumber(t[3]) < 1 then
                       doPlayerSendCancel(cid, "Desculpe, mas o mínimo de warnings é 1.") return true
               elseif t[3] and tonumber(t[3]) > 11 then
                       doPlayerSendCancel(cid, "Desculpe, mas o máximo de warnings é 11.") return true
               elseif not getWarnings(t[1]) or getWarnings(t[1]) < 0 then
                       setWarnings(t[1], 0)
               elseif t[3] and tonumber(t[3]) <= getWarnings(t[1]) then
                       doPlayerSendCancel(cid, "Desculpe, mas esse player já tem "..getWarnings(t[1]).." warnings.") return true
               end

               if getPlayerByName(t[1]) then
                       doRemoveCreature(getPlayerByName(t[1]))
               end
               if t[3] then
                       doAddAccountBanishment(getAccountIdByName(t[1]), target, os.time() + (a[tonumber(t[3])]*3600*24), 5, 2, t[2], 0)
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você baniu o jogador "..t[1]..". Warnings setadas de "..getWarnings(t[1]).." para "..t[3]..".")
                       broadcastMessage("Jogador "..t[1].." banido por "..getCreatureName(cid)..". Warnings setadas de "..getWarnings(t[1]).." para "..t[3]..". Comentário: "..t[2]..".")
                       setWarnings(t[1], tonumber(t[3]))
               else
                       doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você baniu o jogador "..t[1]..". Warnings setadas de "..getWarnings(t[1]).." para "..(getWarnings(t[1])+1)..".")
                       broadcastMessage("Jogador "..t[1].." banido por "..getCreatureName(cid)..". Warnings setadas de "..getWarnings(t[1]).." para "..(getWarnings(t[1])+1)..". Comentário: "..t[2]..".")
                       setWarnings(t[1], getWarnings(t[1])+1)
                       doAddAccountBanishment(getAccountIdByName(t[1]), target, os.time() + (a[getWarnings(t[1])]*3600*24), 5, 2, t[2], 0)
               end
return true
end

 

@ oneshot achei outro bug o sitema não está banindo quando o tempo chega a 0 o player é apenas kickado apareceu a mensagem

 

23:01 [sistema Anti-Cheater] O jogador Test Druid foi banido por uso de bot.

 

mas apenas foi kickado não foi banido.

Link para o comentário
Compartilhar em outros sites

É que depende muito de quais são os parâmetros funcionais do seu servidor nesta função:

 


doAddPlayerBanishment(getPlayerGUID(cid), 3, (os.time() + (24 * 60 * 60)), 12, 2, "[sISTEMA ANTI-BOT]")

 

Testei em duas revisões do The Forgotten Server 0.4.0, uma de 8.62 e outra de 8.71 e obtive total funcionalidade. Se você estiver usando um servidor diferente daqueles que testei, poste aqui, posso descobrir os parâmetros corretos nas sources, mas preciso delas.

 

Abraços.

Editado por Oneshot
Link para o comentário
Compartilhar em outros sites

meu servidor e verção 8.60 =( e ve se voce consegue colocar pra banir a account setando warnings igual esse script de ban que postei ai se você presisar entender melhor esse sistema de ban

 

é esse aki o veja no link http://www.xtibia.com/forum/topic/198165-radbr-banishment-system-atualizado/

Link para o comentário
Compartilhar em outros sites

 

[/code]

 

@ oneshot achei outro bug o sitema não está banindo quando o tempo chega a 0 o player é apenas kickado apareceu a mensagem

 

23:01 [sistema Anti-Cheater] O jogador Test Druid foi banido por uso de bot.

 

mas apenas foi kickado não foi banido.

 

Aconteceu o mesmo comigo.. uhsahusa

Sistema funfou, não deu erro no console, porem ele apenas kikou o personagem e mostrou no brodcast a msg que o mesmo foi banido!

 

Tfs 0.3.5 8.54 Talvez por isso!

Link para o comentário
Compartilhar em outros sites

@ Oneshot achei outro bug no sistema se o player deslogar e logar ele vai continuar sendo abordado e pah ate ai tudo bem ta certinho ai o player responde o sistema corretare ai aparece que ele respondeu certo abordagen desativada etc ai alguns segundos depois o player é banido isso so acontece se ele deslogar e logar pra responder se ele responder o sistema sem deslogar ele não é banido.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...