Jump to content

ber

Members
  • Posts

    167
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by ber

  1. 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)
    • Thanks 1
  2. 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?

  3. 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?

  4. 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.

    • Thanks 1
  5. 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.

  6. 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.

  7. 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.

  8. -------------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.

  9. 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.

  10. 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

     

  11. 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 

    • Haha 1
×
×
  • Create New...