• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

TFS 1.X+ Anti bot channel.

Pedrook

Advanced OT User
Joined
May 24, 2009
Messages
442
Solutions
3
Reaction score
183
Location
Brazil
is there any way to do it, of not being able to close a chat? some callback, or c ++?
I have an anti bot, but if the player closes the chat, it is no longer verified and no new questions are received, so this is a bug.
 
I'll leave the code here, who can help.

creaturesript,

Lua:
--[[
## 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

chatchannels,

Lua:
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
 
Back
Top