Postado Março 2, 2021 5 anos Este é um post popular. [Anti-Bot] Fiz esse sistema para o Thunder porém vou deixá-lo a parte nesse tópico aqui para quem quiser implementar em seu otserv. Lembrando que esse sistema é para TFS 1.X e qualquer sugestão/problema nesse sistema, deve ser reportado no GitHub. Crie um arquivo na pasta lib com o nome antibot.lua ANTIBOT = { prefix = "[AntiBot] ", questions = { {question = "Qual o ano que começou o COVID-19?", staticAnswer = true, answer = "2019"}, {question = "Qual seu skill atual de Sword?", skill = true, answer = SKILL_SWORD}, {question = "Qual seu skill atual de Club?", skill = true, answer = SKILL_CLUB}, {question = "Qual seu skill atual de Distance?", skill = true, answer = SKILL_DISTANCE}, {question = "Qual seu level atual?", answer = "level"}, {question = "Qual o dia de hoje?", answer = "day"}, }, playerQuestion = {}, messages = { time = "Você possui %s para responder a pergunta.", chat = "Esse chat só pode ser usado durante a verificação.", howAnswer = "Você deve responder somente a resposta, por exemplo: Qual o dia de hoje? Resposta: %d", correctAnswer = "Você acertou a pergunta. Obrigado.", incorrectAnswer = "Você errou a resposta, você ainda possui %d tentativas.", logout = "Você não pode deslogar enquanto hover uma verificação ativa.", }, punishment = { try = { max = 3, reason = "Quantidade excessiva de tentativas.", timePunishment = 1, -- In days players = {}, }, time = { maxTime = 180, -- In seconds reason = "Não respondeu a pergunta dentro do tempo estipulado.", timePunishment = 2, -- In days players = {}, }, }, verification = {40, 60}, -- in minutes } function ANTIBOT:addTry(playerId) local player = Player(playerId) if not player then return false end playerId = player:getId() if not ANTIBOT.punishment.try.players[playerId] then ANTIBOT.punishment.try.players[playerId] = 0 end ANTIBOT.punishment.try.players[playerId] = ANTIBOT.punishment.try.players[playerId] + 1 if ANTIBOT.punishment.try.players[playerId] and ANTIBOT.punishment.try.players[playerId] >= ANTIBOT.punishment.try.max then sendChannelMessage(13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.punishment.try.reason) ANTIBOT:addPunishment(playerId) end end function ANTIBOT:time(playerId) local player = Player(playerId) if not player then ANTIBOT:reset(playerId) return false end playerId = player:getId() if not ANTIBOT.punishment.time.players[playerId] then ANTIBOT.punishment.time.players[playerId] = 0 ANTIBOT:sendQuestions(playerId) end addEvent(function() if ANTIBOT.punishment.time.players[playerId] and ANTIBOT.punishment.time.players[playerId] >= 0 and ANTIBOT.punishment.time.players[playerId] < ANTIBOT.punishment.time.maxTime then ANTIBOT.punishment.time.players[playerId] = ANTIBOT.punishment.time.players[playerId] + 1 player:sendCancelMessage(ANTIBOT.prefix .. ANTIBOT.messages.time:format(string.diff(ANTIBOT.punishment.time.maxTime - ANTIBOT.punishment.time.players[playerId], true))) ANTIBOT:time(playerId) end end, 1000) if ANTIBOT.punishment.time.players[playerId] and ANTIBOT.punishment.time.players[playerId] >= ANTIBOT.punishment.time.maxTime then ANTIBOT:addPunishment(playerId) end end function ANTIBOT:sendQuestions(playerId) local player = Player(playerId) if not player then return false end playerId = player:getId() random = math.random(#ANTIBOT.questions) ANTIBOT.playerQuestion[playerId] = random player:say("ANTIBOT", TALKTYPE_MONSTER_SAY) player:openChannel(13) addEvent(sendChannelMessage, 500, 13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.howAnswer:format(os.date("%d"))) addEvent(sendChannelMessage, 800, 13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.questions[random].question) end function ANTIBOT:reset(playerId) ANTIBOT.punishment.try.players[playerId] = nil ANTIBOT.punishment.time.players[playerId] = nil ANTIBOT.playerQuestion[playerId] = nil end function ANTIBOT:addPunishment(playerId) local player = Player(playerId) if not player then return false end playerId = player:getId() local accountId = getAccountNumberByPlayerName(player:getName()) if accountId == 0 then return false end local resultId = db.storeQuery("SELECT 1 FROM `account_bans` WHERE `account_id` = " .. accountId) if resultId ~= false then result.free(resultId) return false end local timeNow = os.time() if ANTIBOT.punishment.try.players[playerId] and ANTIBOT.punishment.try.players[playerId] >= ANTIBOT.punishment.try.max then db.query("INSERT INTO `account_bans` (`account_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" .. accountId .. ", " .. db.escapeString(ANTIBOT.prefix .. ANTIBOT.punishment.try.reason) .. ", " .. timeNow .. ", " .. timeNow + (ANTIBOT.punishment.try.timePunishment * 86400) .. ", " .. player:getGuid() .. ")") elseif ANTIBOT.punishment.time.players[playerId] and ANTIBOT.punishment.time.players[playerId] >= ANTIBOT.punishment.time.maxTime then db.query("INSERT INTO `account_bans` (`account_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" .. accountId .. ", " .. db.escapeString(ANTIBOT.prefix .. ANTIBOT.punishment.time.reason) .. ", " .. timeNow .. ", " .. timeNow + (ANTIBOT.punishment.time.timePunishment * 86400) .. ", " .. player:getGuid() .. ")") end ANTIBOT:reset(playerId) player:save() player:getPosition():sendMagicEffect(CONST_ME_POFF) player:remove() end Não esqueça de registrar essa lib no arquivo lib.lua Na pasta chachannels/scripts crie um arquivo chamado antibot.lua function onJoin(player) if not ANTIBOT.playerQuestion[player:getId()] then player:sendTextMessage(5, ANTIBOT.prefix .. ANTIBOT.messages.chat) player:getPosition():sendMagicEffect(CONST_ME_POFF) return false end return true end function onLeave(player) if ANTIBOT.playerQuestion[player:getId()] then return false end return true end function onSpeak(player, type, message) if not ANTIBOT.playerQuestion[player:getId()] then sendChannelMessage(13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.chat) player:getPosition():sendMagicEffect(CONST_ME_POFF) return false end local question = ANTIBOT.questions[ANTIBOT.playerQuestion[player:getId()]] if question.skill then correctAnswer = tonumber(player:getSkillLevel(question.answer)) message = tonumber(message) elseif question.answer == "level" then correctAnswer = tonumber(player:getLevel()) message = tonumber(message) elseif question.answer == "day" then correctAnswer = tonumber(os.date("%d")) message = tonumber(message) elseif question.staticAnswer then message = message:lower() correctAnswer = question.answer:lower() end verification = false if message == correctAnswer then verification = true end if verification then addEvent(sendChannelMessage, 200, 13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.correctAnswer) ANTIBOT:reset(player:getId()) else ANTIBOT:addTry(player:getId()) addEvent(function() if ANTIBOT.punishment.try.players[player:getId()] and ANTIBOT.punishment.try.players[player:getId()] < ANTIBOT.punishment.try.max and player then sendChannelMessage(13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.incorrectAnswer:format(ANTIBOT.punishment.try.max - ANTIBOT.punishment.try.players[player:getId()])) end end, 100) end return true end <channel id="13" name="AntiBot" script="antibot.lua" /> Agora na pasta creaturescripts/scripts crie um arquivo chamado antibot.lua function onLogin(player) if player:getAccountType() >= ACCOUNT_TYPE_GAMEMASTER then return true end player:registerEvent("AntiBot") checkAnti(player:getId()) return true end function checkAnti(playerId) local player = Player(playerId) if not player then return false end min, max = ANTIBOT.verification[1], ANTIBOT.verification[2] random = math.random(min, max) addEvent(function() ANTIBOT:time(player:getId()) checkAnti(player:getId()) end, random * 60 * 1000) end <event type="login" name="AntiBot" script="antibot.lua" /> Agora no arquivo logout.lua na pasta creaturescripts/scripts antes do return true adicione isso if ANTIBOT.punishment.try.players[player:getId()] or ANTIBOT.punishment.time.players[player:getId()] then player:sendTextMessage(MESSAGE_INFO_DESCR, ANTIBOT.prefix .. ANTIBOT.messages.logout) player:getPosition():sendMagicEffect(CONST_ME_POFF) return false end ANTIBOT:reset(player:getId()) Sistema 100% feito por mim. Créditos adicionais ao @Endless e ao @Tottin por testarem
Postado Março 2, 2021 5 anos Excelente sistema!! Agora é só rezar pra que o pessoal não baixe o sistema e saia vendendo como se fosse próprio rsrs
Postado Março 2, 2021 5 anos Muito bem feito o código!! Parabéns!! Uma dica, poderia colocar somente para quem está em uma hunt, quem estiver no trainer ou mesmo andando pela cidade, o antibot não faria a pergunta para esse jogador! valeu maninho. [*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*] DISCORD: vodkart#6090
Postado Março 2, 2021 5 anos Autor 2 minutos atrás, Vodkart disse: Muito bem feito o código!! Parabéns!! Uma dica, poderia colocar somente para quem está em uma hunt, quem estiver no trainer ou mesmo andando pela cidade, o antibot não faria a pergunta para esse jogador! valeu maninho. Obrigado pelo comentário! Posso fazer um update no código em breve para adicionar isso... Cenas para os próximos capítulos.
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.