ber
-
Posts
167 -
Joined
-
Last visited
-
Days Won
1
Posts posted by ber
-
-
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)
- 1
-
12 minutes ago, Lord Henry said:
Sim, pesará mais no servidor do que adicioná-las sempre aos scripts.
A função call (ou exports) é bem pesadinha de ser executada e completamente inviável a cada frame.
Nota da Wiki: A função call pode gerar sobrecarga no desempenho. Elas não são equivalentes às funções chamadas no mesmo resource.
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)
createVehicleEssas 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
- 1
-
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.
- 1
-
18 hours ago, Lord Henry said:
Isso é ilegal e você pode inclusive ser punido pelo MTA por incluir backdoors maliciosos no seu resource. Você não pode punir os jogadores pelas cagadas que os admins do servidor fazem.
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
-
18 minutes ago, Maaster342 said:
Deu certo aqui e pra adicionar vida seria assim?
setElementHealth(player, getElementHealth(player) + 20)
Sim, desta maneira você pega a vida ou nível de procurado do player atual e soma com o valor inserido depois.
- 1
-
setPlayerWantedLevel(player, getPlayerWantedLevel(player) + 1)
- 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
-
13 hours ago, LucasST said:
Opcoes = { {"1"}, {"2"}, {"3"}, {"4"}, {"5"}, {"6"}, } Pos = { {726, 330 , 343, 37}, {726, 405, 343, 37}, {726, 480, 343, 37}, {726, 555, 343, 37}, } Opcao1 = 1 Opcao2 = 2 Opcao3 = 3 Opcao4 = 4 function Abrir_Painel() if isEventHandlerAdded("onClientRender",getRootElement(), DxTest) then removeEventHandler("onClientRender",root,DxTest) showCursor(false) else addEventHandler("onClientRender",root,DxTest) showCursor(true) end end bindKey("l","down",Abrir_Painel) function DxTest() dxDrawRectangle(724, 261, 345, 381, tocolor(1, 0, 0, 102), false) dxDrawRectangle(725, 258, 344, 63, tocolor(1, 0, 0, 248), false) for i, v in ipairs(Pos) do dxDrawRectangle(v[1],v[2],v[3],v[4], tocolor(1, 0, 0, 150), false) end dxDrawText(""..Opcoes[Opcao1][1].."", 900, 341, 1070, 369, tocolor(255, 254, 254, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText(""..Opcoes[Opcao2][1].."", 900, 341 +75, 1070, 369, tocolor(255, 254, 254, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText(""..Opcoes[Opcao3][1].."", 900, 341 +150, 1070, 369, tocolor(255, 254, 254, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText(""..Opcoes[Opcao4][1].."", 900, 341 +225, 1070, 369, tocolor(255, 254, 254, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) end function AbaixarPos(button) if isCursorOnElement(724, 261, 345, 381) then if button == "mouse_wheel_down" then proximaPagina = Opcao4 +1 if proximaPagina > #Opcoes then return end Opcao1 = Opcao1 +1 Opcao2 = Opcao2 +1 Opcao3 = Opcao3 +1 Opcao4 = Opcao4 +1 end end end bindKey("mouse_wheel_down", "down", AbaixarPos) function AumentarPos(button) if isCursorOnElement(724, 261, 345, 381) then if button == "mouse_wheel_up" then paginaAnterior = Opcao1 -1 if paginaAnterior == 0 then return end Opcao1 = Opcao1 -1 Opcao2 = Opcao2 -1 Opcao3 = Opcao3 -1 Opcao4 = Opcao4 -1 end end end bindKey("mouse_wheel_up","down",AumentarPos) function isEventHandlerAdded( sEventName, pElementAttachedTo, func ) if type( sEventName ) == 'string' and isElement( pElementAttachedTo ) and type( func ) == 'function' then local aAttachedFunctions = getEventHandlers( sEventName, pElementAttachedTo ) if type( aAttachedFunctions ) == 'table' and #aAttachedFunctions > 0 then for i, v in ipairs( aAttachedFunctions ) do if v == func then return true end end end end return false end function isCursorOnElement(x, y, w, h) if (not isCursorShowing()) then return false end local mx, my = getCursorPosition() local fullx, fully = guiGetScreenSize() cursorx, cursory = mx*fullx, my*fully if cursorx > x and cursorx < x + w and cursory > y and cursory < y + h then return true else return false end end
Essa foi a primeira vez que utilizei scrollbar manualmente em dx, mais provavelmente a maneiras bem mais fáceis para isso, e como o Boechat falou existem maneiras mais práticas como (GUI, DxGrid e DGS).
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.
-
45 minutes ago, HiroShi said:
isso vai mudar se for um elemento criado por você ou um já do MTA como: (player, object, vehicle etc..) agora um marker por ex:
você cria um marker com a váriavel 'MarkerTeste', e cria um evento 'onMarkerHit' ultilzando o 'MarkerTest' é óbvio que se o 'MarkerTeste' vou destruido o evento vai avisar que não está achando ele gerando um ERROR
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.
-
-
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
-
37 minutes ago, Looktovask said:
cara eu fico ate com vergonha, mas era esse o problema mesmo, muito obrigado
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
- 1
-
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.
Como faço pra deixar o headshot instantaneo
in Programação em Lua
Posted
Existe um script nativo no MTA que já faz isso, só digitar 'start headshot' no console (F8).