Big Smoker Posted February 17, 2021 Share Posted February 17, 2021 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 androksi Posted February 17, 2021 Other Languages Moderators Share Posted February 17, 2021 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) 1 Link to comment
Big Smoker Posted February 17, 2021 Author Share Posted February 17, 2021 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now