Jump to content

player consegue bugar, quando: MTA NAO RESPONDE


Recommended Posts

boa tarde,

 

Gostaria de saber se existe algum sistema que identifica quando o jogador nao esta dentro no MTA, pois os jogadores consegue bugar no servidor quando minimiza o MTA e volta, mais ja usei o onClientMinimize, porem quando o jogador usa em modo janela, ele consegue fica hora do MTA e assim conseguindo usar o xlag ou ate mesmo fazendo algum bug para fazer com que o MTA apareça "O programa não responde".

 

 

Queria saber se existe alguma função que identifica quando o jogador nao esta usando o MTA.

Link to comment
  • Other Languages Moderators

Olá.

Eu já reportei isso há alguns anos atrás, infelizmente não resolveram ainda (se é que tem solução). É fácil executar esse exploit, só funciona em modo janela. Então... uma ultra gambiarra que você poderia fazer (não recomendo, pois pode atrapalhar alguns jogadores que jogam em modo janela por opção e diversão), a gambiarra consiste em usar a função dxGetStatus e acessando a chave SettingWindowed. Desta forma:

local isWindowed = dxGetStatus()["SettingWindowed"]

Também é necessário usar uma outra função, agora uma útil. Tendo tudo em mãos, agora basta criar a lógica para verificar se o jogador teve uma queda muito brusca de FPS (esse exploit leva o FPS para 1 e depois volta). A lógica seria algo mais ou menos assim:

Client-side:

Spoiler

-- Função útil da wiki
local fps = 0
local nextTick = 0
function getCurrentFPS() -- Setup the useful function
    return fps
end

local function updateFPS(msSinceLastFrame)
    -- FPS are the frames per second, so count the frames rendered per milisecond using frame delta time and then convert that to frames per second.
    local now = getTickCount()
    if (now >= nextTick) then
        fps = (1 / msSinceLastFrame) * 1000
        nextTick = now + 1000
    end
end
addEventHandler("onClientPreRender", root, updateFPS)

-- Lógica
local isWindowed = dxGetStatus()["SettingWindowed"]
local windowTick = nil
local checkAfter = 10 -- segundos

addEventHandler("onClientRender", root, function()
    if isWindowed then -- Se tiver em modo janela, então:
        local clientFPS = getCurrentFPS() -- Obtemos o FPS do jogador

        if clientFPS < 2 and windowTick == nil then -- Checamos se o FPS dele é menor que 2. Se sim, opa... pode ser que tenha algo errado :O, bora iniciar a verificação
            windowTick = getTickCount()
        elseif windowTick and windowTick + checkAfter * 1000 < getTickCount() then --[[
            Assim que passar 10 SEGUNDOS, iremos enviar uma requisição ao servidor, perguntando se ele tá parado por 10 segundos.
            O motivo de verificarmos isso no server-side, é por conta de que, o client, quando executa esse exploit, na tela dele ainda há movimento
            mas SÓ PRA ELE
        ]]
            windowTick = nil
            triggerServerEvent("onPlayerCheckExploit", resourceRoot, checkAfter)
        end
    end
end)

 

Server-side:

Spoiler

addEvent("onPlayerCheckExploit", true)
addEventHandler("onPlayerCheckExploit", resourceRoot, function(seconds)
    local idleTime = getPlayerIdleTime(client)

    if idleTime >= seconds * 1000 then
        kickPlayer(client, "Anti-cheat", "Por favor, não faça o seu jogo parar de responder.")
    end
end)

 

 

  • Thanks 1
Link to comment

consegui fazer um sistema que detecta quando o jogador esta com ping alto e o pack loss alto tambem, e nessa função coloco a função que faz desbugar o jogador. Que no meu caso era um sistema de grudar no veiculo

1 hour ago, andr0xy said:

Olá.

Eu já reportei isso há alguns anos atrás, infelizmente não resolveram ainda (se é que tem solução). É fácil executar esse exploit, só funciona em modo janela. Então... uma ultra gambiarra que você poderia fazer (não recomendo, pois pode atrapalhar alguns jogadores que jogam em modo janela por opção e diversão), a gambiarra consiste em usar a função dxGetStatus e acessando a chave SettingWindowed. Desta forma:


local isWindowed = dxGetStatus()["SettingWindowed"]

Também é necessário usar uma outra função, agora uma útil. Tendo tudo em mãos, agora basta criar a lógica para verificar se o jogador teve uma queda muito brusca de FPS (esse exploit leva o FPS para 1 e depois volta). A lógica seria algo mais ou menos assim:

Client-side:

  Hide contents


-- Função útil da wiki
local fps = 0
local nextTick = 0
function getCurrentFPS() -- Setup the useful function
    return fps
end

local function updateFPS(msSinceLastFrame)
    -- FPS are the frames per second, so count the frames rendered per milisecond using frame delta time and then convert that to frames per second.
    local now = getTickCount()
    if (now >= nextTick) then
        fps = (1 / msSinceLastFrame) * 1000
        nextTick = now + 1000
    end
end
addEventHandler("onClientPreRender", root, updateFPS)

-- Lógica
local isWindowed = dxGetStatus()["SettingWindowed"]
local windowTick = nil
local checkAfter = 10 -- segundos

addEventHandler("onClientRender", root, function()
    if isWindowed then -- Se tiver em modo janela, então:
        local clientFPS = getCurrentFPS() -- Obtemos o FPS do jogador

        if clientFPS < 2 and windowTick == nil then -- Checamos se o FPS dele é menor que 2. Se sim, opa... pode ser que tenha algo errado :O, bora iniciar a verificação
            windowTick = getTickCount()
        elseif windowTick and windowTick + checkAfter * 1000 < getTickCount() then --[[
            Assim que passar 10 SEGUNDOS, iremos enviar uma requisição ao servidor, perguntando se ele tá parado por 10 segundos.
            O motivo de verificarmos isso no server-side, é por conta de que, o client, quando executa esse exploit, na tela dele ainda há movimento
            mas SÓ PRA ELE
        ]]
            windowTick = nil
            triggerServerEvent("onPlayerCheckExploit", resourceRoot, checkAfter)
        end
    end
end)

 

Server-side:

  Hide contents


addEvent("onPlayerCheckExploit", true)
addEventHandler("onPlayerCheckExploit", resourceRoot, function(seconds)
    local idleTime = getPlayerIdleTime(client)

    if idleTime >= seconds * 1000 then
        kickPlayer(client, "Anti-cheat", "Por favor, não faça o seu jogo parar de responder.")
    end
end)

 

 

Muito obrigado pela dica, vou testa-la

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...