Jump to content

n3wage

Members
  • Posts

    290
  • Joined

Posts posted by n3wage

  1. Solução usando diferentes dimensões para cada marker:

    Boxs = {
        Positions = {
            {1368.09497, -1279.76941, 13.54688 + 0.8, 285.67160, -86.19171, 1001.52289 + 0.8, 294.71225, -80.24703, 1001.51563 - 0.8, 4},
            {2333.50806, 61.62383, 26.70579 + 0.8, 285.67160, -86.19171, 1001.52289 + 0.8, 294.71225, -80.24703, 1001.51563 - 0.8, 4},
            {-2625.85010, 208.34500, 4.81250 + 0.8, 285.67160, -86.19171, 1001.52289 + 0.8, 294.71225, -80.24703, 1001.51563 - 0.8, 4},
            {2158.97290, 943.12683, 10.82031 + 0.8, 285.67160, -86.19171, 1001.52289 + 0.8, 294.71225, -80.24703, 1001.51563 - 0.8, 4}
        },
    
        Data = {}
    }
    
    addEventHandler("onResourceStart", resourceRoot,
        function ()
            for i = 1, #Boxs.Positions do
                local enter = createMarker(Boxs.Positions[i][1], Boxs.Positions[i][2], Boxs.Positions[i][3], "arrow", 1, 255, 255, 0, 255);
                local exit = createMarker(Boxs.Positions[i][4], Boxs.Positions[i][5], Boxs.Positions[i][6], "arrow", 1, 255, 255, 0, 255);
                local marker = createMarker(Boxs.Positions[i][7], Boxs.Positions[i][8], Boxs.Positions[i][9], "cylinder", 1, 255, 255, 0, 255);
    
                createBlipAttachedTo( enter, 6, 2, 0, 255, 0, 0, 0, 7000 );
    
                setElementInterior( exit, Boxs.Positions[i][10] );
                setElementInterior( marker, Boxs.Positions[i][10] );
                setElementDimension( exit, i );
                setElementDimension( marker, i );
    
                Boxs.Data[ enter ] = { type = "enter", id = i };
                Boxs.Data[ exit ] = { type = "exit", id = i };
                Boxs.Data[ marker ] = { type = "marker", id = i };
            end
        end
    )
    
    addEventHandler("onMarkerHit", resourceRoot,
        function (Jog, mathDim)
            if ( getElementType(Jog) == "player" and mathDim and Boxs.Data[ source ] ) then
                  if ( Boxs.Data[ source ]["type"] == "enter" ) then
                    local x, y, z = getElementPosition(Jog);
                    local id = Boxs.Data[ source ]["id"];
    
                    fadeCamera(Jog, false, 1.0);
                    setTimer(
                        function (Jog)
                            fadeCamera(Jog, true, 1.0);
                            setElementDimension ( Jog, id );
                            setElementInterior(Jog, Boxs.Positions[ id ][10], Boxs.Positions[ id ][4]+1.5, Boxs.Positions[ id ][5]+1.5, Boxs.Positions[ id ][6]);
                        end
                    , 2000, 1, Jog)
    
                elseif ( Boxs.Data[ source ]["type"] == "exit" ) then
                    local id = Boxs.Data[ source ]["id"];
    
                    fadeCamera(Jog, false, 1.0);
                    setTimer(
                        function (Jog)
                            fadeCamera(Jog, true, 1.0);
                            setElementDimension ( Jog, 0 );
                            setElementInterior(Jog, 0, Boxs.Positions[ id ][1]+1.5,  Boxs.Positions[ id ][2],  Boxs.Positions[ id ][3]);
                        end
                    , 2000, 1, Jog)
    
                elseif ( Boxs.Data[ source ]["type"] == "marker") then
                    triggerClientEvent(Jog, getResourceName(getThisResource())..": onClientSystem", root, "addRenderScript");
                end
            end
        end
    )

     

  2. Só para complementar, Isso ocorre porque a linguagem pega apenas o primeiro argumento passado de funções executadas dentro de outras funções.

    Ou seja, Nessa linha:

    Boxs.Marker.Create[2] = createMarker(unpack(Boxs.Marker.Positions[math.random(1, #Boxs.Marker.Positions)]), "cylinder", 1, 255, 0, 0, 255); 

    A linguagem só vai pegar o primeiro argumento retornado da função unpack, Assim ficando:

    Boxs.Marker.Create[2] = createMarker(POSICAO_X, "cylinder", 1, 255, 0, 0, 255); 

    Por isso o erro ocorre, A solução é fazer como o DNL fez, criar variáveis com os valores retornados pela função unpack e depois usar essas variáveis na função createMarker.

  3. @FelipeMallmann

    Esse seu ultimo código não vai funcionar porque você redefiniu a variavel carro como sendo parâmetro da função do timer, Assim ela vira nil já que você não passou nenhum parâmetro, Para seu "método" ter funcionado você teria que ter feito da seguinte maneira:

    local carro = source 
    setTimer( function () 
        -- ... 
    

    Sem usar parâmetros na função, Mas tem uma maneira melhor, Você pode passar os parâmetros que quiser no setTimer que eles serão passados para a função:

    setTimer (  
        function( carro ) 
            -- ... 
        end 
    , 5000, 1, source ); 
    

    Assim você passará a variável source (que é o veiculo que explodiu) para a função do timer.

    --

    btw outra coisa que vocês estão fazendo errado é usar sourcePlayer (Variável não definida) nos outputChatBoxes, Usando essa "variável" (nil) Vocês estarão mandando a mensagem para todos os jogadores.

  4. Tente:

    local subornos = {}; 
      
    function subornarpolicial ( thePlayer, _, nick, amount ) 
        if ( nick and amount ) then 
            if ( getPlayerMoney ( thePlayer ) >= ( tonumber ( amount ) or math.huge ) ) then 
                local target = getPlayerFromPartialName ( nick ); 
                 
                if ( target ) then 
                    if ( getElementData( thePlayer, "algemado" ) or getElementData( thePlayer, "navtr" ) ) then 
                        subornos[ target ] = { thePlayer, tonumber( amount ) }; 
                         
                        outputChatBox("#000000[#ff0000POLICIA#000000] #c1c1c1O Jogador algemado lhe ofereceu $" .. amount .. " para você liberar ele, digite /aceitarsuborno para aceitar ou /recusarsuborno para recusar.", target, 255, 255, 255, true ); 
                    else 
                        outputChatBox( "#000000[#ff0000POLICIA#000000] #c1c1c1Você precisa estar preso ou algemado para executar este comando!", thePlayer, 255, 255, 255, true ); 
                    end 
                else 
                    outputChatBox( "#000000[#ff0000POLICIA#000000] #c1c1c1Nenhum jogador encontrado com este nome!", thePlayer, 255, 255, 255, true ); 
                end 
            else 
                outputChatBox( "#000000[#ff0000POLICIA#000000] #c1c1c1Você não tem dinheiro suficiente!", thePlayer, 255, 255, 255, true ); 
            end 
        else 
            outputChatBox( "#000000[#ff0000POLICIA#000000] #c1c1c1Comando correto: /suborno nick_do_policial total_de_dinheiro!", thePlayer, 255, 255, 255, true ); 
        end 
    end 
    addCommandHandler ( "suborno", subornarpolicial ); 
      
    function aceitar_suborno( thePlayer ) 
        if ( subornos[thePlayer] ) then 
            local subornoInfo = subornos[thePlayer]; 
             
            takePlayerMoney ( subornoInfo[1], subornoInfo[2] ); 
            outputChatBox ( "O policial aceitou seu suborno ! Você perdeu $" .. subornoInfo[2], subornoInfo[1], 0, 255, 0 ); 
          
            subornos[ thePlayer ] = nil; 
        else 
            -- ninguem esta subornando o jogador. 
        end 
    end 
    addCommandHandler( "aceitarsuborno", aceitar_suborno ); 
    

  5. Não tem necessidade nenhuma em usar element data, Você pode fazer da seguinte maneira (Obviamente você vai precisar trocar as variáveis, checar se o jogador que ofereceu o suborno ainda esta online etc):

    No topo do script:

    subornos = {}; 
    

    No comando de oferecer suborno:

    subornos[ jogador que vai ser subornado ] = { jogador que esta oferecendo o suborno, quantia }; 
    

    No comando de aceitar o suborno:

    if subornos[ jogador que vai aceitar o suborno ] then 
        local subornoInfo = subornos[ jogador que vai aceitar o suborno ]; 
         
        takePlayerMoney ( subornoInfo[1], subornoInfo[2] ); 
        outputChatBox ( "O policial aceitou seu suborno ! Você perdeu $" .. subornoInfo[2], subornoInfo[1], 0, 255, 0 ); 
      
        subornos[ jogador que vai aceitar o suborno ] = nil; 
    else 
        -- ninguem esta subornando o jogador. 
    end 
    

  6. Entendi, e o codigo do n3wage? onde? :?
    function PedirReforcos ( thePlayer ) 
        local location = getZoneName ( getElementPosition ( thePlayer ) ); 
         
        for i, player in pairs ( getElementsByType ( "player" ) ) do 
            if ( isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( player ) ), aclGetGroup ( "ComandosPolicia" ) ) ) then 
                local x, y, z = getElementPosition ( player ); 
                local distancia = getDistanceBetweenPoints3D ( x, y, z, getElementPosition ( thePlayer ) ); 
                 
                outputChatBox ( "#000000[#ff0000POLICIA#000000] #c1c1c1O jogador " .. getPlayerName ( thePlayer ) .. " pediu reforços mais proximo de " .. location .." a ".. math.floor(distancia) .." Km/H.", player, 255, 255, 255, true ) 
            end 
        end 
    end 
    addCommandHandler( "reforcos", PedirReforcos ); 
    

  7. function PedirReforcos ( thePlayer ) 
        local location = getZoneName ( getElementPosition ( thePlayer ) ); 
         
        for i, player in pairs ( getElementsByType ( "player" ) ) do 
            if ( isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( player ) ), aclGetGroup ( "ComandosPolicia" ) ) ) then 
                local x, y, z = getElementPosition ( player ); 
                local distancia = getDistanceBetweenPoints3D ( x, y, z, getElementPosition ( thePlayer ) ); 
                 
                outputChatBox ( "#000000[#ff0000POLICIA#000000] #c1c1c1O jogador " .. getPlayerName ( thePlayer ) .. " pediu reforços mais proximo de " .. location .." a ".. math.floor(distancia) .." Km/H.", player, 255, 255, 255, true ) 
            end 
        end 
    end 
    addCommandHandler( "reforcos", PedirReforcos ); 
    

  8. [...]

    Esse codigo funcionaria? Eu digo usando ElementData durante o jogo e passando para o AccountData somente ao entrar/sair.

    Sim, é exatamente assim, Claro que pode ser aprimorado para salvar outros dados também, Mas como uma base funciona.

    Outra duvida, se eu tenho algumas Datas já registradas mas nao irei usa-las, segundo a wiki eu posso remover usando
    setAccountData(account, "myKey", false) 
    

    mas tenho como eu rodar todos os players registrados e limpar de todos, ou só consigo fazer isso com os jogadores online?

    Obrigado.

    Já que você precisa passar a conta no primeiro argumento da função setAccountData você pode fazer um loop de todas as contas usando a função getAccounts.

  9. Minha ideia é criar alguns itens nos quais precisaria salva-los para os players não perderem ao deslogarem. Por exemplo, se eu usar simplesmente um setElementData(getLocalPlayer(), "Item 1", 10) o player vai permanecer com essa propriedade até sair do jogo, mas eu quero salvar esse "Item 1".

    Minha duvida é qual a melhor opção de fazer isso, devo usar o executeSQLQuery e salvar dentro do registry.db, criar uma nova db ou alguma outra opção?

    Isso fica a sua escolha, Eu usaria as funções db* para poder trabalhar com MySQL támbem (Fora que acho mais organizado cada resource/gamemode ter seu database), Você também pode usar account datas (Que também são salvas na internal.db).

    Eu nao consigo imaginar a relação entre getElementData/setElementData e um banco de dados. Eu crio um banco de dado com as tabelas que eu preciso, ai durante todo o processo do jogo eu só vou modificando com getElementData/setElementData e quando o jogador sair do jogo eu atualizo o banco de dados, é mais ou menos assim?

    Exatamente, Quando o jogador se logar você carrega todos os dados e quando ele sair você obtêm eles usando getElementData ou getAllElementData e salva no database.

    Você também pode ir salvando de tempos em tempos para ter uma segurança a mais se quiser.

  10. Desculpa me meter no topico, mas tava lendo e me surgiu uma duvida.

    n3wage, no momento que você passa o nick do player como parâmetro para o lado cliente

    triggerClientEvent(root, "limparchat", root, getPlayerName( player ) ) 
    

    Por que ele recebe esse parâmetro na função abrirchat? Eu nao poderia escolher em qual funçao pegar esse parâmetro?

    Você "escolhe" a função quando adiciona o evento:

    addEventHandler ("limparchat", root, abrirchat) 
    

    Se ao invés de abrirchat tivéssemos outra função ali essa outra função que iria receber os parâmetros (Também podemos fazer duas (ou mais) funções receberem os parâmetros (usando outra vez a função addEventHandler)).

  11. [...] eu não entendi direito esse name = nick_de_quem_limpou;, ele serve para que? eu usei isso e deu erro global :(

    nick_de_quem_limpou vai ser o nick do jogador que limpou o chat, Porem essa variavel só existe na função abrirchat (porque passamos ela via triggerClientEvent) então definimos a variavel global name como sendo igual a variavel nick_de_quem_limpou, Assim teremos o nick fora da função abrirchat, e ai podemos usar ele no dxDrawText.

    function dxchat() 
        dxDrawRectangle(168, 203, 600, 62, tocolor(0, 0, 0, 109), false) 
        dxDrawBorderedText(""..name.." Limpou o Chat", posone, 215, 197, 383, tocolor(255, 255, 255, textAlpha),1.00, font) 
    end 
      
    function abrirchat(nick_de_quem_limpou) 
        name = nick_de_quem_limpou; 
        addEventHandler ("onClientRender", root, dxchat) 
        
        setTimer(function() 
            removeEventHandler ("onClientRender", root, dxchat) 
        end, 4000, 1 ) 
    end 
    addEvent ("limparchat", true) 
    addEventHandler ("limparchat", root, abrirchat) 
    

  12. Basta você passar o nick (ou o jogador) como argumento na função triggerClientEvent, Assim você terá o nick de quem limpou o chat no lado do cliente.

    -- server 
    triggerClientEvent(root, "limparchat", root, getPlayerName( player ) ) 
      
    -- client 
    function abrirchat( nick_de_quem_limpou ) 
        name = nick_de_quem_limpou; 
      
        -- continuação da função 
    

    Com esse código a variavel global name vai ser equivalente ao nick do jogador que limpou o chat.

    Outra coisa, vi que você repetiu varias vezes a função outputChatBox para "limpar" o chat, Você pode usar um loop para fazer isso mais facilmente:

    for _ = 1, 20 do -- 20 = numero de vezes que a função sera executada 
        outputChatBox ( " ", root ); 
    end 
    

  13. function dxchat() 
        dxDrawBorderedText(""..getPlayerName(localPlayer).." Está assaltando a loja", 197, 215, 197, 383, tocolor(255, 255, 255, textAlpha),1.00, font) 
        dxDrawRectangle(168, 203, 468, 62, tocolor(0, 0, 0, 109), false) 
          
        if fadeIn == false then 
            textAlpha = textAlpha - 7 
        elseif fadeIn == true then 
            textAlpha = textAlpha + 7 
        end 
         
        checkAlpha() 
    end 
    

  14. Porque você não seta a animação direto no lado do servidor ? Se você fizer isso no lado do client apenas ele (o jogador local) vai ver a animação, E uma dica, evite ao maximo usar os eventos de renderização, Eles são executados várias vezes por segundo, você não precisa verificar se o player esta algemado 30~60 vezes por segundo.

  15. Acho que usar parênteses para separar as operações já deve resolver o problema, tente:

    dxDrawImage(x * (564-cords), y * ( 737-(ls/2) ), x * ( 33+(ls or 0) ), y * ( 26+(ls or 0) ), "som.png", girar, 0, 0, tocolor(255, 255, 255, 255), true) 
    dxDrawImage(x * (801-cords2), y * ( 737-(ls/2) ), x * ( 33+(ls or 0) ), y * ( 26+(ls or 0) ), "som.png", girar, 0, 0, tocolor(255, 255, 255, 255), true) 
    

  16. O Erro ocorre porque a variavel source não existe, Sendo assim você não pode obter o dinheiro de um player inexistente, Acredito que tenha sido apenas falta de atenção sua, Você pode passar o jogador direto no segundo parametro da função triggerServerEvent, assim o servidor já irá receber a variavel source automaticamente (você não precisa colocar ela na lista de parâmetros da função comprareagle.

    --client: 
      
    triggerServerEvent("eaglecomprar", localPlayer) -- localPlayer vai ser o source do evento eaglecomprar 
      
    -- server: 
      
    function comprareagle () 
    

    Se você ainda tiver duvidas sobre a função triggerServerEvent vale a pena olhar os parâmetros na wiki.

  17. mais e se eu quizer fazer a contagem? por ex.. timestamp 1h aii conta do atual ate la entendeu?

    Você quer saber qual será a data daqui 1 hora? Se sim é só fazer isso:

    local timestampAtual = getRealTime().timestamp 
    local daquiUmaHora = timestampAtual + 3600; 
      
    print ( daquiUmaHora ); 
    

    No meu tópico sobre timestamp tem alguns cálculos uteis que você pode usar pra isso.

    Já se você quer fazer uma contagem regressiva de uma hora (não sei porque você vai querer isso mas enfim):

    local minutos = 60; 
      
    setTimer ( 
        function() 
            minutos = minutos - 1; 
             
            outputChatBox ( "Faltam " .. minutos .. " minutos !" ) 
        end 
    , 60000, 60 ) 
    

    Não precisa nem usar timestamp, Lembrando que com a mesma lógica da pra fazer uma contagem progressiva.

  18. seria isso?
    function Test01 () 
      local TempoReal = getRealTime().timestamp 
      local TempoReal01 = getRealTime() 
      local Segundos = TempoReal01.TempoReal 
      outputChatBox(Segundos) 
    end 
    

    Não, o timestamp já corresponde aos segundos, você não precisa obter ele de novo (a não ser que você queira).

    local timestamp = 1466853270 
      
    local dia = getRealTime ( timestamp ).monthday -- obter o dia do timestamp acima 
    local hora = getRealTime ( timestamp ).hour -- obter a hora 
    -- etc... 
    

    No exemplo acima se você não passar a variavel timestamp para a função getRealTime ela vai retornar o dia e a hora do momento em que você executou o script, mas como passamos o timestamp a função retorna o dia e a hora do timestamp.

  19. É mais fácil usar uma tabela pra isso.

    local dias = { 
        [0] = "Domingo"; 
        [1] = "Segunda"; 
        [2] = "Terça"; 
        [3] = "Quarta"; 
        [4] = "Quinta"; 
        [5] = "Sexta"; 
        [6] = "Sábado" 
    } 
      
    addEventHandler( "onClientRender", root, 
        function () 
            local time = getRealTime() 
            local Days = time.weekday       
            dxDrawText( dias[Days], 1045, 606, 1105, 624, tocolor(255, 255, 255, 255), 1.00, "default", "left", "center", false, false, false, false, false) 
        end 
    ) 
    

×
×
  • Create New...