![](https://forum.multitheftauto.com/uploads/set_resources_22/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
ber
Members-
Posts
167 -
Joined
-
Last visited
-
Days Won
1
Everything posted by ber
-
Existe um script nativo no MTA que já faz isso, só digitar 'start headshot' no console (F8).
-
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)
-
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?
-
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.
-
Basicamente faça um for nessa tabela e procure o nome que contém as letras digitadas usando string.find
-
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?
-
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?
-
comandos = {"test1", "test2", "test3", "test4"} for i, v in pairs(comandos) do addCommandHandler(v, funcaoTeste) end funcaoTeste(playerSource) outputChatBox("comando executado", playerSource) end
-
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.
-
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.
-
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
-
Sim, desta maneira você pega a vida ou nível de procurado do player atual e soma com o valor inserido depois.
-
setPlayerWantedLevel(player, getPlayerWantedLevel(player) + 1)
-
Basicamente você irá usar essas funções: guiCreateEdit guiGetText triggerServerEvent addAccount LogIn
-
setAccountData onClientGUIChanged getAccount getAccountData Vai dar um trabalho porque vai usar muitos triggers, não sei se vale a pena...
-
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
-
Criar uma gridlist em dx com a "movimentação" através do scroll do mouse
ber replied to ber's topic in Programação em Lua
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. -
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.
-
function onDamage(_, _, bodypart) if bodypart == 9 then setElementHealth(source, 29) end end addEventHandler("onPlayerDamage", root, onDamage)
-
-------------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.
-
setTimer isTransferBoxActive
-
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
-
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
-
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.