Jump to content

iDannz [Breno]

Members
  • Posts

    38
  • Joined

  • Last visited

Posts posted by iDannz [Breno]

  1. All you should do is get new look at coordinates -> send to server -> sync to others clients
    but remember; dont try to destroy your server's network :D
     

    --serverside
    addEvent('syncLookAt', true)
    addEventHandler('syncLookAt', root, function(x,y,z)
    	triggerLatentClientEvent("setLookAt", 30000, false, client, x,y,z)
    	-- triggerClientEvent("setLookAt", client, x,y,z)
    end)
    
    --clientside
    local screenW, screenH = guiGetScreenSize()
    
    setTimer(function()
        local x,y,z = getWorldFromScreenPosition(screenW*0.5, screenH*0.5, 10)
        triggerLatentServerEvent("syncLookAt", 30000, false, localPlayer, x,y,z)
    --    triggerServerEvent("syncLookAt", localPlayer, x,y,z)
    end, 200, 0)
    
    addEvent('setLookAt', true)
    addEventHandler('setLookAt', root, function(x,y,z)
        setPedLookAt(source, x,y,z)
    end)

     

    • Like 1
  2. Das das uma, ou você remove/adiciona o onClientRender quando quiser, ou pode usar variáveis, como no exemplo abaixo; onde a variável será trocada a cada 1 segundo e meio

    local mostrandoOutroRetangulo = true
    
    addEventHandler('onClientRender', root, function()
        dxDrawRectangle(...)
    
        if mostrandoOutroRetangulo then
            dxDrawRectangle(...)
        end
    end)
    
    setTimer(function()
        mostrandoOutroRetangulo = not mostrandoOutroRetangulo --(recebe o valor contrario do atual, ou seja, se estiver true vira false e vice-versa)
    end, 1500, 0)

    no seu caso quando quiser que tal coisa não apareça você pode remover a variável com e quando quiser que volte a aparecer basta voltar a variavel pra true

    • Thanks 1
  3. Você deve usar um dos eventos que que são ativados quando o jogador entra em um veiculo, e então verificar se ele possui a licença e caso não tenha, você deve aumentar o nivel de procurado, como no exemplo abaixo:

    -- evento ativado quando o jogador entra no veiculo
    addEventHandler('onPlayerVehicleEnter', root, function()
        --// se o jogador não tenha a licença
        if not getElementData(source, 'carLicense') then
            local stars = getPlayerWantedLevel(source)
            -- se o nivel de procurados for menor que 6
            if stars < 6 then
                -- checamos se as novas estrelas (atual+3) ultrapassa o numero 6, e corrigimos
                local newStars = stars+3 <= 6 and stars+3 or 6
                --setamos o novo nivel de procurado
                setPlayerWantedLevel(source, newStars)
                --enviamos a mensagem no chat
                outputChatBox('Você não possui a carteira de motorista, então ganhou +3 niveis de procurado.', source)
            end
        end
    end)
    • Confused 1
  4. 6 minutes ago, Angelo Pereira said:

    Amigo, eu dei exemplo

    Você não deu apenas o exemplo, você está incitando ele a ele introduzir seu código incompleto ao servidor dele;

    1 hour ago, Angelo Pereira said:

    Obviamente vai da erro, você colocou 2 sistem level, o que eu fiz do 0, e o seu bugado.

    Bastava ler o que eu fiz, para ver que a cada 10 minutos iria da 1 EXP, e não disse nenhum momento pra junta os dois LOL

    e "falar mal" do código dos outros nem sempre é ruim, tendo vista que se o código está mal feito e pode melhorar, só sendo tolo pra querer lutar tanto pra não melhora-lo, só estou dando dicas de como podem obter melhores resultados, boa tarde pra você também, humildão.

    • Like 1
  5. Just now, Angelo Pereira said:

    Hum, então você quer que eu faça um usando elemento? mas, antes era a favor das tabelas? engraçado, comenta isso, mais tudo bem.

    E para finalizar, sobre o tempo é de 1:20min, 10 + do tempo de receber a tabela + 10 min de verificar em 6 EXP.

    é, parece que você quer polemizar sim. 
    Você poderia ao menos salvar os dados na conta a partir da tabela no onPlayerQuit e então remover os dados do player da tabela, mas faça-o como quiser, como você disse; cada um tem seu jeito de codificar e escrever seus resources.

  6. 13 hours ago, Angelo Pereira said:
    
    local table_experiencia = { }
    
    function time_level ( )
       for i, player in ipairs(getElementsByType("player")) do
       local acc = getPlayerAccount(player)
          if acc and not isGuestAccount(acc) then
             if not table_experiencia[player] then --/> Caso o Jogador não Estiver na Tabela Então faça :
                table_experiencia[player] = 0 --/> Adiciona-lo com 0
             elseif table_experiencia[player] >= 6 then --/> Caso o Jogador Já Tenha 6 EXP então faça :
                setElementData(player,"Level", tonumber(getElementData(player,"Level") or 0) +1) --/> Jogador Recebeu +1 Level
                outputChatBox ( "#ffffff[ #82FA58UP #ffffff] - Você Ganhou +1 Level", player, 255, 255, 255, true )
                table_experiencia[player] = 0 --/> Seta-lo 0 novamente
             elseif table_experiencia[player] then --/> Caso o Jogador Esteja na Tabela Então Faça :
                table_experiencia[player] = tonumber(table_experiencia[player]) + 1 --/> Adicionar +1 a Cada 10min
                outputChatBox ( "#ffffff[ #82FA58UP #ffffff] - Você Ganhou +1 de Experiência. ("..tonumber(table_experiencia[player])"/6)", player, 255, 255, 255, true )
             end
          end
       end
    end
    setTimer ( time_level, 60000*10, 0 ) --/> A Cada 10 min Ganha 1 EXP
    

    Tente isso, caso você não conseguir resolver o seu.

    Obs: Não testei.

    O código que você fez não parece ter o resultado que ele espera pelos seguintes motivos;

    1. O código será executado a cada 10 minutos. Ou seja, se o jogador jogador X jogou por 9 minutos e acabou se desconectando, ao retornar ele terá que ficar online por 10 minutos pra obter a experiência onde no caso o correto seria ele jogar por apenas mais 1 minuto pra obter a experiência.
    2. Pra ganhar level ele terá que ficar conectado por uma 1h:10m, sem sair, já que a experiencia recebida não é salva e a tabela se inicia com 0 de experiência, e não por 1. Ou seja, mesmo que você já tenha jogado por 60 minutos e tenha 5/6 de experiência, caso você saia do jogo, ao voltar sua experiência será 0.
    3. Os dados que são inseridos na tabela table_experiencia nunca são removidos, e isso depois de um tempo vai começar a causar problemas de desempenho.
    • Haha 1
  7. De tão mal feito que o código estava acabamos nao percebendo que as condições originais não faziam o minimo sentido, 
    desta maneira deve funcionar como vc espera;

    function timecount ( )
    	for i, player in ipairs(getElementsByType("player")) do
    		local acc = getPlayerAccount(player)
    		if acc then
    			if not isGuestAccount(acc) then
                    local level = getElementData(player,"Level") or 0 if tonumber(level) == nil then level = 0 end
                    local exp = getElementData(player,"LSys:EXP") or 0 if tonumber(exp) == nil then exp = 0 end
                    local onlinetime = getElementData(player,"LSys:Online") or 0 if tonumber(onlinetime) == nil then onlinetime = 0 end
                    local mins = getElementData(player,"LSys:Mins") or 0 if tonumber(mins) == nil then mins = 0 end
                    if tonumber(mins) >= 600 then
                        outputDebugString("resetou minuto")
                        outputChatBox ( "#ffffff[ #82FA58UP #ffffff] - Você Ganhou +1 de Experiência. (".. tonumber(exp)+1 .."/20)", player, 255, 255, 255, true )
                        setElementData(player,"LSys:EXP",tonumber(exp)+1)
                        playSoundFrontEnd ( player, 44 )
                        setElementData(player,"LSys:Mins",1)
                    end
                    if tonumber(exp) >= 19 then
                        setElementData(player,"LSys:EXP",0)
                        setElementData(player,"Level",tonumber(level)+1)
                        outputDebugString ( "Adicionou um nivel" )
                        outputChatBox ( "#ffffff[ #82FA58UP #ffffff] - Você Juntou 20 de Experiência e Ganhou +1 Level ("..tonumber(level)+1 ..")", player, 255, 255, 255, true )
                        playSoundFrontEnd ( player, 45 )
                    end
                    if tonumber(mins) < 600 then	     
                        setElementData(player,"LSys:Mins",tonumber(mins)+1)
                        setElementData(player,"LSys:Online",tonumber(onlinetime)+1)	
                        outputDebugString("adicionou minuto")
                    end
                end
    	    end
        end
    end
    setTimer ( timecount, 1000, 0 )	

     

  8. A solução que eu dei seria viável apenas para alguns casos, principalmente pelo fato de que se a resource for parada os dados obviamente serão resetados.

    Mas se no caso você queira utilizar pra salvar dados como Level, Experiência, ou outros dados que são muito utilizados, você deve setar usando elementData com sync on, para de fato possibilitar as checagens dos outros clientes, o ponto que eu quis chegar é de que existem dados que não precisam ser enviados, mas que as pessoas os enviam (muitas vezes sem querer) só por ser o caminho mais fácil de se obter tal resultado.

    De qualquer maneira, caso você queira utilizar o sistema que eu enviei acima, eu recomendo que você o replique nas resources em que você vai usar, principalmente por ser um código pequeno (se você apagar os comentários não irá passar de 15 linhas) e também porque se você utilizar exportações nas funções getData e setData chamando-as para salvar dados de uma resource X, caso a resource em que o código está configurado com exports seja reiniciada você vai acabar tendo resultados inesperados na resource X.

  9. Tente otimizar um pouco este código (na minha opinião isso tudo poderia ser feito client-side com no máximo 10 linhas).

    O uso excessivo de elementData pode ferrar o fluxo de rede do seu servidor, pois cada vez que você o utiliza sem desativar o argumento de sincronização da função ele será enviado e atualizado para todos os outros elementos. Ou seja, quando o servidor possui 10 jogadores online, mesmo que você use setElementData em apenas um, esses dados serão enviados para os outros 9 da mesma maneira pra sincronização.
    Agora imagine uma situação escalável, onde você vai setar vários elementData pra cada jogador (que serão enviados pra todos os outros elementos), e o pior; tudo isso a cada 1 segundo.

    A melhor maneira de manter dados armazenados em Lua é o uso de tabelas (inclusive no caso do MTA, onde isso continua sendo mais rápido do que usar setElementData com sync off), esse é um dos diferenciais da linguagem, já que em Lua se pode indexar quase tudo em uma tabela (não que seja sempre uma boa ideia).

    Segue um breve exemplo de como utilizar tabelas de uma maneira semelhante a elementDatas;

    -- iniciamos a tabela, armazenando-a na variável "datas"
    local datas = {}
    
    -- criamos uma função pra facilitar o nosso trabalho
    function setData(element, key, value)
        -- caso o jogador não possua seu registro na tabela "datas", o registro é criado
        if not datas[element] then
            datas[element] = {}          
        end
        --inserimos o valor ligado ao nome do dado setado
        datas[element][key] = value
    end
    
    function getData(element, key)
        return datas[element] and datas[element][key] -- recebemos o valor salvo na tabela a partir do jogador e o nome do dado
    end
    
    -- removemos o registro do jogador quando ele sai do servidor.
    -- (isso pode ser bastante necessário, faça-o também com onElementDestroy caso vá utilizar com outros tipos de elementos.)
    addEventHandler('onPlayerQuit', root, function()
        if datas[source] then
            datas[source] = nil
        end
    end)

    Com o código acima adicionado ao seu script você pode utilizar os seguintes métodos:

    setData(jogador, 'Nome do nosso dado', 'teste123')
    
    getData(jogador, 'Nome do nosso dado')

    Onde setData funcionará como um setElementData e getData funcionará como um getElementData, mas obviamente sem a sincronização com os outros clientes e de maneira até mais rápida.

    Vale lembrar que o código acima não lhe dará a liberdade de importar os dados salvos na tabela a partir de outros resources, a não ser que você exporte as funções setData e getData, cenário o qual eu não sei dizer se seria vantajoso, apenas testando, pois acho que usar elementData com sync off seria mais rápido.

  10. Eu acho que esse é um dos piores códigos que eu já vi,  mas de qualquer maneira, observe a linha 10 onde ele verifica se o jogador possui a data "AirNewSCR_LiberarXP" igual a "Sim", e em seguida seta a data para "Não", e acaba não retornando a data pra "Sim" (não nesse código), então aparentemente o problema está ai.

  11. try to use the latest version of this resource (here), it doesnt happens to me 

     yeah, happened now, but only in bone id 3, if we change the bone for any other number (1~20) we will not experience that

    Bone IDs:
    1: head
    2: neck
    3: spine
    4: pelvis
    5: left clavicle
    6: right clavicle
    7: left shoulder
    8: right shoulder
    9: left elbow
    10: right elbow
    11: left hand
    12: right hand
    13: left hip
    14: right hip
    15: left knee
    16: right knee
    17: left ankle
    18: right ankle
    19: left foot
    20: right foot

     

  12. 31 minutes ago, majqq said:

    Thanks for suggestion, but i already tested isElementOnScreen, it would cause object stay for a moment when not looking on it. However this was so far ago, so i might did something incorrect. Whatsoever performance in render can be improved by declaring variables out of rendering scope (so basically in main one), and reusing them. I will rewrite bone attach once again to apply some tricks what i've learnt since this topic (to gain even more than 50% performance boost), and let you know about results in this topic :)

    I also got good results, this is the performance I got with 100 objects:

    100 objects (looking directly at them):
    vqhQ8wF.png

    100 objects (without looking at them):
    (I didn't notice any apparent problems when using isElementOnScreen, maybe I'll be back to test it soon)

    nDEIOVn.png

     

    I would like to thank you and everyone who commented here, as this topic inspired me to learn a little more about optimization in Lua :D

    • Like 1
  13. Já que já há o data "isVIP", porque um evento serverside pra dar trigger no evento de abrir o painel? 
    nao seria mais facil checar se é vip direto clientside?

    adicione o argumento source dentro dos parametros da funcao que tem o comando adicionado

    • addCommandHandler('vip',function(source)
    • usa source no lugar de localPlayer na verificacao se ha vip


    outro erros estao nas linhas 10 e 19, você está usando o serial (string) como conta, se o seu sistema de login é por meio de serial, voce deve usar a funcao getAccount.

    • tem que usar getAccount(getPlayerSerial(source)), então vai poder usar o set/getAccountData corretamente


    outra coisa, você está salvando que o player é VIP, mas nao está dando o VIp dele de volta quando ele faz login, adicione um evento de login, fazendo a verificacao se na conta do cara tem o vip com getAccountData, e devolva-o com setElementData

  14. I use it to check if localplayers cursor is inside gui, i add event to mouse enter, and setup variable to true, and on mouseleave change the variable to false, but if the cursor is inside gui, and the gui get destroyed, the event isnt triggered, any other way to do it different to this?

    Im using if variable then variable = false end

    Before destroying the gui

×
×
  • Create New...