Jump to content

ber

Members
  • Posts

    167
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by ber

  1. Existe um script nativo no MTA que já faz isso, só digitar 'start headshot' no console (F8).
  2. Basicamente salvar uma tabela usada nos códigos lua diretamente no SQL dá ruim, o toJSON e fromJSON servem para fazer essa conversão. Aqui o exemplo de um sistema de inventário, onde quando o player sai do servidor, o inventário dele (que é uma tabela) é convertido usando o toJSON e depois hospedado no SQLite: function onQuit() local id_ = getElementData(source, "ID") local inv_ = toJSON(inventario[source]) executeSQLQuery("UPDATE inventario_players SET inv=? WHERE id=?", inv_, id_) end addEventHandler("onPlayerQuit", root, onQuit) E agora para pegar a tabela no SQLite quando o player logar no servidor, convertê-la e setar como o inventário do jogador: function onLogin() local id_ = getElementData(source, "ID") local data = executeSQLQuery("SELECT inv FROM inventario_players WHERE id=?", id_) inventario[source] = {} inventario[source] = fromJSON(data[1]["inv"]) end addEventHandler("onPlayerLogin", root, onLogin)
  3. Não sabia que exports no onClientRender era tão prejudicial assim. Então criar um servidor inteiro usando dgs ao invés de dx ou gui não é recomendado?
  4. addEventHandler("onResourceStop") for getElementsByType("vehicle") getElementPosition executeSQLQuery(INSERT/UPDATE) addEventHandler("onResourceStart") executeSQLQuery(SELECT) createVehicle Essas são as principais funções e eventos necessários para fazer o que deseja.
  5. Basicamente faça um for nessa tabela e procure o nome que contém as letras digitadas usando string.find
  6. Existe alguma vantagem, além de organização, em criar uma db SQLite exclusiva para cada script ao invés de utilizar a função executeSQLQuery e salvar os dados no registry.db?
  7. Adicionar em todo código funções useful (isMouseInPosition, countPlayersInRange, numberFormat, etc.) dá um trabalho e uma poluição no código. E se, ao invés de adicioná-las em cada código, inserir todas em um script separado e puxar elas através de export? Imagino que seja possível, mas gostaria de saber se isso afetaria negativamente o server em questão de desempenho ou é uma diferença praticamente nula? Essa diferença é maior caso seja uma function usada dentro de um onClientRender (numberFormat por exemplo), visto que ficará chamando o export a todo instante?
  8. comandos = {"test1", "test2", "test3", "test4"} for i, v in pairs(comandos) do addCommandHandler(v, funcaoTeste) end funcaoTeste(playerSource) outputChatBox("comando executado", playerSource) end
  9. local aba = "inicio" function render() if aba == "inicio" then [...] elseif aba == "player" then [...] end end function onClick(button, state) if isCursorOnElement(...) then aba = "player" end end addEventHandler("onClientClick", root, onClick) Aí um pequeno exemplo. Basicamente, você vai usar uma variável para guardar a página do painel que o player está atualmente, e fazer a mudança dela de acordo de onde o player clica, e no onClientRender basta usar um if para ver em qual página está, e dependendo da página é exibido um layout diferente no painel DX.
  10. São resources do meu próprio servidor, eu não os comercializo. E eu sou o único que tenho acesso à host, então se vazou algo foi por má fé da própria host, como já aconteceu algumas vezes na comunidade. E bem, se ainda sim isso continua sendo ilegal, estou disposto à correr este risco, pois não vou ficar 15 dias igual um desgraçado fazendo resources para um preguiçoso pagar uma merreca pra host, pegar o script e colocar no server dele como se nada tivesse acontecido.
  11. Tenho um sistema de recoil e infelizmente ele também é apenas horizontal, já joguei servidores de PUBG e não sei como mas eles conseguiram fazer um recoil vertical
  12. Sim, desta maneira você pega a vida ou nível de procurado do player atual e soma com o valor inserido depois.
  13. setPlayerWantedLevel(player, getPlayerWantedLevel(player) + 1)
  14. Basicamente você irá usar essas funções: guiCreateEdit guiGetText triggerServerEvent addAccount LogIn
  15. setAccountData onClientGUIChanged getAccount getAccountData Vai dar um trabalho porque vai usar muitos triggers, não sei se vale a pena...
  16. No meu servidor, ao invés de cancelar o start da resource, eu usei um setTimer infinito com outputChatBox e playSoundFrontEnd para todos os players. O cara até consegue usar o script, mas vai tornar o servidor injogável
  17. Nossa, muito obrigado pelo exemplo, vou dar uma estudada nele. Sobre os códigos "já prontos", o meu servidor é focado para ser o mais leve possível, então evito usar o máximo de exports dentro de onClientRender (DGS) e elementData (dxGrid), por isso a necessidade de criar um próprio gridList.
  18. Estou fazendo um sistema de concessionária, e na parte da garagem não achei muito interessante usar aquele método via tabelas que apresenta apenas 1 item por vez e você navega entre eles usando as teclas do teclado ou clicando em uma seta. Exemplo: local selecionado = 1 veiculos = { {"GTR", 560, 50000}, {"Skyline", 555, 30000}, } function render() dxDrawText("Veículo: "..veiculos[selecionado][1], ...) dxDrawText("Preço: "..veiculos[selecionado][3], ...) end function key(tecla) if tecla == "arrow_l" then selecionado = selecionado -1 elseif tecla == "arrow_r" then selecionado = selecionado +1 end end bindKey("arrow_l", "down", key) bindKey("arrow_r", "down", key) Então pensei em usar o método de GridList, mas não faço idéia de como fazê-lo. Imagino que deve ser bem parecido com este método citado acima, porém não sei por onde começar. Se alguém puder me dar um norte, ficarei bem agradecido. OBS: usar o guiGridList não é uma possibilidade.
  19. function onDamage(_, _, bodypart) if bodypart == 9 then setElementHealth(source, 29) end end addEventHandler("onPlayerDamage", root, onDamage)
  20. -------------CLIENTE------------- local sx,sy = guiGetScreenSize() local px,py = 1280,720 local x,y = (sx/px), (sy/py) local isRenderVisible = false function semCategoriaA() dxDrawRectangle(screenW * 0.3146, screenH * 0.0000, screenW * 0.3714, screenH * 0.0417, tocolor(50, 0, 195, 55), false) dxDrawImage(screenW * 0.3005, screenH * -0.0194, screenW * 0.0620, screenH * 0.0787, ":[PJ]GuiEditor/images/plus.png", 0, 0, 0, tocolor(255, 255, 255, 255), false) dxDrawText("VOCÊ NÃO POSSUI A CARTERIA NACIONAL DE HABILITAÇÃO TIPO A!", (screenW * 0.3573) - 1, (screenH * 0.0000) - 1, (screenW * 0.6807) - 1, (screenH * 0.0417) - 1, tocolor(50, 0, 195, 55), 1.40, "default-bold", "center", "center", false, false, false, false, false) dxDrawText("VOCÊ NÃO POSSUI A CARTERIA NACIONAL DE HABILITAÇÃO TIPO A!", (screenW * 0.3573) + 1, (screenH * 0.0000) - 1, (screenW * 0.6807) + 1, (screenH * 0.0417) - 1, tocolor(50, 0, 195, 55), 1.40, "default-bold", "center", "center", false, false, false, false, false) dxDrawText("VOCÊ NÃO POSSUI A CARTERIA NACIONAL DE HABILITAÇÃO TIPO A!", (screenW * 0.3573) - 1, (screenH * 0.0000) + 1, (screenW * 0.6807) - 1, (screenH * 0.0417) + 1, tocolor(50, 0, 195, 55), 1.40, "default-bold", "center", "center", false, false, false, false, false) dxDrawText("VOCÊ NÃO POSSUI A CARTERIA NACIONAL DE HABILITAÇÃO TIPO A!", (screenW * 0.3573) + 1, (screenH * 0.0000) + 1, (screenW * 0.6807) + 1, (screenH * 0.0417) + 1, tocolor(50, 0, 195, 55), 1.40, "default-bold", "center", "center", false, false, false, false, false) dxDrawText("VOCÊ NÃO POSSUI A CARTERIA NACIONAL DE HABILITAÇÃO TIPO A!", screenW * 0.3573, screenH * 0.0000, screenW * 0.6807, screenH * 0.0417, tocolor(255, 255, 255, 255), 1.40, "default-bold", "center", "center", false, false, false, false, false) end function enter() if getPedOccupiedVehicleSeat(localPlayer) == 0 then if not getElementData(localPlayer, "CNH:A") then if not (isRenderVisible) then addEventHandler("onClientRender", root, semCategoriaA) isRenderVisible = true end end end end addEventHandler("onClientVehicleEnter", localPlayer, enter) function exit(_, seat) if seat == 0 then if (isRenderVisible) then removeEventHandler("onClientRender", root, semCategoriaA) isRenderVisible = false end end end addEventHandler("onClientVehicleExit", localPlayer, exit) Não testei mas creio que funcione. Esse evento não precisa ser pelo server-side, só irá gerar mais processamento para o servidor.
  21. Isso já foi testado por você? Porque pela lógica, se não tem mais o marker, não tem como o evento ser acionado.
  22. setTimer isTransferBoxActive
  23. Estou com um grande problema no meu sistema de inventário, não consegui pensar em uma solução até o momento. Preciso fazer um sistema de resetar o inventário do player através de comando ou quando o mesmo morrer, tentei mais ou menos desta maneira: ItensNaoRemoviveis = { ["identidade"] = true, ["porte"] = true, ["cnh"] = true, ["ak47natal"] = true, } inventario = { [1] = {"hamburguer", 2}, [2] = {"suco", 3}, [3] = {"glock", 5}, [4] = {"kit_reparo", 2}, } function teste() for i, v in pairs(inventario) do local item = inventario[i][1] if not ItensNaoRemoviveis[item] then table.remove(i) end end end addCommandHandler("test", teste) Porém, quando usa o table.remove, ele "deleta" o index atual e acaba puxando o próximo pro lugar dele, ai quando o loop roda novamente, ele vai para o próximo index do loop, ignorando o que foi "movido". Usar o bom e velho 'nil' não é viável nessa situação pois se setar o inventario inteiro como nil, o jogador perde itens como documentos, skins de armas compradas na loja, etc. e se setar o inventario[index] como nil, o próximo item que será adicionado através do table.insert irá "pular" este campo vazio e será adicionado depois da última linha "válida" da tabela, e quando chegar no limite de slots do inventario (30), ele não vai mais acrescentar item e vai retornar uma mensagem de erro, mesmo tendo os espaços vazios feitos pelo nil. inventario = nil inventario[i] = nil
  24. kkkkkkkk normal mano, ontem mesmo eu abri um tópico perguntando pq meu mod de loading-screen não tava funfando e era apenas uma linha q eu esqueci de por no meta.xml ;D
  25. Não sei se fico aliviado em saber que não é um problema que ocorre só no meu servidor ou se fico mais triste ainda por saber que é algo do MTA... Espero que corrijam logo, é difícil explicar pro pessoal que não é um problema com o server.
×
×
  • Create New...