Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

[Anti-Bot]

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

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.

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

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

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

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" />

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

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" />

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

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())

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

 

Sistema 100% feito por mim.

Créditos adicionais ao @Endless e ao @Tottin por testarem :)

  • Respostas 8
  • Visualizações 2.9k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • Só ler as configurações amigo... punishment = { try = { max = 3, reason = "Quantidade excessiva de tentativas.", timePunishment = 1, -- In days players = {}, }, time = { maxTi

Postado

Excelente sistema!! Agora é só rezar pra que o pessoal não baixe o sistema e saia vendendo como se fosse próprio rsrs

Quem eu sou?
Meu nome é Waliston, mais conhecido como Endless, estudante de Análise e Desenvolvimento de Sistemas, e desenvolvedor da Falcon Games. Atuo no Ramo de OtServer desde 2017, porém desde 2019 venho me especializando em Desenvolvimento Web e Segurança Web..

Meus Projetos:

Falcon Games

Meu Github:

https://github.com/WalistonBelles

Meu Discord:
Endless#5410

Minhas Contribuições atualmente pra Comunidade:

[SHOWOFF] OTClient Showoff Módules
[DESIGN]
 3 FREE Game Ui Design

[TUTORIAL] Instalando MyAAC em sua máquina

[TUTORIAL] Restringindo a Listagem de Diretórios(URL) do Servidor Apache
[TUTORIAL] Proteção contra DDoS utilizando Mod-evasive no Apache

[SISTEMA] Plugin MyAAC Listagem de Items automática
[SISTEMA] Gerador de Outfits Automática para o Site

[SISTEMA] Sistema de Troca de Vocação para MyAAC
[SISTEMA] Plugin MyAAC Auction System
[SISTEMA] Sistema de Exibir Monstros por Level


Algum trabalho meu te ajudou? Quer apoiar meu trabalho? Faça uma doação!!
Picpay: @walistonbelles
Paypal: [email protected]

Postado

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.

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Postado
  • 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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo