Jump to content

[M]ister

Members
  • Content Count

    443
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by [M]ister

  1. Realmente quando trabalha com funções/variáveis locais, complica 100%, teria que usar setfenv (função desabilitada no MTA por questões de segurança). Mas tem que ser ambos locais, pois se uma função global utilizar uma variável local, daria para pegar com getupvalue. -- script A local teste = "oie" function testeFunc() if (teste) then end end -- script B local i = 1 while true do local nome, val = debug.getupvalue(testeFunc, i) if not nome then break end print(nome, val) -- teste oie i = i + 1 end
  2. O principal mesmo é buscar manter sigilo total de como foi feito o sistema de proteção, ninguém burla nada sem antes saber como funciona. Você analisando o código, "facilmente" vê um jeito de burla-lo, agora um script criptografado, teria que ralar muito para descobrir um jeito.
  3. Imagino eu, que um debug = nil funcione. Mas se o cara salvar em outra variável antes de você definir nil, acredito que conseguirá utilizar do mesmo modo kkk teste = debug debug = nil print(teste) -- lib ok
  4. Interessante! Confesso que estava tentando pensar em algo do tipo... mas no final das contas não daria no mesmo https://i.imgur.com/x0FE5Xq.png ?
  5. overwrite = sobrescrever… no nosso caso, funções. Você usa onResourceStart e cancelEvent() na proteção né ? É possível que alguém sobrescrever o addEventHandler e não faça nada quando for onResourceStart, ou seja, não vai rodar a função do evento, sendo assim, ele vai “pular” sua verificação+cancelEvent(): _addEventHandler = addEventHandler function addEventHandler(eventName, attachedTo, handlerFunction, getPropagated, priority) if (eventName ~= "onResourceStart") then getPropagated = getPropagated or true priority = priority or "normal" _addEventHandler(eventName, attachedTo,
  6. Por questões de overwrite como já mencionado, você não tem garantia que o resource não será ativado (nos casos que não possua permissão). Uma proteção adicional é manter todo o seu código no escopo da validação: -- código inseguro addEventHandler("onResourceStart",resourceRoot, function() local ip,senha = exports.validar:autenticar() if (ip == "127.0.0.1" and descriptografar(senha) == "aljkdkhje") then -- código "seguro" else return cancelEvent() end end ) Dependendo de como foi feito e sabendo mais/menos o funcionamento do sistema de segurança, dá pra bolar algo utilizando
  7. Seria bom também uma validação das funções que utilizará (debug.getinfo), evitando chamar funções que foram sobrescritas... function fetchRemote(...) for _, param in ipairs(arg) do if (type(param) == "function") then return param("127.0.0.1") -- coloco o IP que a validação quer end end end
  8. Você não precisa interagir com o db todo instante, você pode fazer isso apenas no start/stop do resource: start: carrega os dados do banco em uma variável/tabela/elementdata …. stop: salva no banco Utilizando o banco de dados do MTA (SQLite) ao invés do MySQL, seria bem mais eficaz também! Particularmente não acho interessante criar uma tabela para armazenar pouquíssimas informações, vai ser apenas o campo cofre consumindo uma única linha na tabela ? Eu optaria por salvar em um arquivo, ou então em uma conta “cobaia” responsável apenas por salvar informações relacionadas ao s
  9. Aí está o erro, você está tentando utilizar um evento cliente: onClientResourceStart em um script do servidor. Troque por este trecho: addEventHandler("onResourceStart", resourceRoot, function() for _, player in ipairs(getElementsByType("player")) do aclpm(player) end end ) addEventHandler("onPlayerLogin", root, function() aclpm(source) end ) Aconselho dar uma olhada: https://wiki.multitheftauto.com/wiki/Scripting_Introduction#Clientside_and_Serverside_scripts https://wiki.multitheftauto.com/wiki/Depuração
  10. Na onde você está chamando a função aclpm ?
  11. Adicione aquela mesma verificação na linha 4 desse outro.
  12. Você habilitou o OOP no meta.xml ? <oop>true</oop> Não interfere (no seu caso), mas não recomendo ficar misturando trechos procedural com oop, opte por um e siga até o fim. Tente: function aclpm (thePlayer) if (thePlayer.type == "player") then local acc = thePlayer.account; if acc and not acc.guest then if ACLGroup.get("PM"):doesContainObject("user."..acc.name) then thePlayer:setData("Venda:Police.Job", true); acc:setData("Venda:Police.Job", true); end end end end addEventHandler("onElementDataChange", root, function (dataName, oldValue)
  13. local function checkVehicleHandling() if not isElement(vehicle) then return end local flags = getVehicleHandling(vehicle)["handlingFlags"] if (bitAnd( flags, 32 ) == 32) or (bitAnd( flags, 64 ) == 64) then return true end end
  14. Observe que você colocou o timer dentro do loop (para os policiais), dessa forma você está definindo que o policial só possa receber uma denúncia a cada 10min, e não bloqueando um usuário de fazer consecutivas denúncias.
  15. @Jonas^, ele quer bloquear o usuário de fazer repetidas denúncias em tal tempo, e não o policial de recebê-las.
  16. Substitua a seguinte função no lado cliente: local tempo = false function DeltaSCR_Abrir () if tempo then return outputChatBox("*Aguarde para poder fazer outra denúncia!",255,0,0) end if DeltaSCR_Painel == false then DeltaSCR_Painel = true addEventHandler ("onClientRender", getRootElement(), DeltaSCR_DX) guiSetVisible (editDenuncia, true) guiSetVisible (editID, true) showCursor (true) tempo = true setTimer(function() tempo = false end,600000,1) end end addEvent ("DeltaSCR:Abrir", true) addEventHandler ("DeltaSCR:Abrir", getRootElement(), DeltaSCR_Abrir)
  17. Teste os dois: setFarClipDistance engineSetModelLODDistance
  18. Coloque DeltaSCR_Painel = true na função DeltaSCR_Abrir
  19. Rt function MarkerHit (hitElement) if (getElementType(hitElement) == "player" then triggerClientEvent(hitElement, "DeltaSCR:Abrir", getRootElement()) end end
  20. Porque trocou o onMarketHit pelo onPlayerMarketHit ? Assim não vai funcionar (veja aqui) Olhe na wiki quais parâmetros são passados e o que significa cada um deles.
  21. Aqui o exemplo da Wiki também não funciona, então provavelmente o erro não é com o fileCopy em si, e sim no exemplo que ele testou. Agora tá esclarecido.
  22. No exemplo do fileCopy na Wiki existe o fileCreate... É só mudar a linha ali.
  23. Use o mesmo da wiki, só que mude a linha 3: fileClose(fileCreate(filePath)) (adicionando o fileClose)
  24. Sim, já estava olhando aqui... Por isso mesmo ainda não consigo entender, só se o fileCopy dele também funciona agora.
  25. Pelo que entendi se o fileRename padrão falha, internamente essa mesma função executa outra rota e usa a função de copiar. Teste ai, instale essa versão e tente utilizar o fileRename.
×
×
  • Create New...