iDannz [Breno]

Members
  • Content Count

    38
  • Joined

  • Last visited

Everything posted by iDannz [Breno]

  1. its working fine here, just tested it now.
  2. 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 --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)
  3. 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
  4. 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)
  5. Você não deu apenas o exemplo, você está incitando ele a ele introduzir seu código incompleto ao servidor dele; 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.
  6. é, 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.
  7. O código que você fez não parece ter o resultado que ele espera pelos seguintes motivos; 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. 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. 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.
  8. 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 )
  9. O seu segundo método está quase funcional, você só esqueceu de remover um end (já que você removeu um if)
  10. 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.
  11. 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.
  12. 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.
  13. Sim, e o mais dahora é que da pra "hackear" esse código compilado dele facilmente, já vi que tem fileExists, fileOpen, fileGetSize, fileClose, md5
  14. 1m:10s Eu não recebi o feedback Devo falar como fiz?
  15. 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
  16. I also got good results, this is the performance I got with 100 objects: 100 objects (looking directly at them): 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) 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
  17. maybe isElementOnScreen can help in pre render event
  18. no, rockstar doesn't allow
  19. iDannz [Breno]

    Problem FPS

    it can be server problem
  20. you can use if isElement(element) before deleting it
  21. 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
  22. Everyone knows that there is a bug that occurs when there is a dead ped, and if you are not around at the time of your death, the ped can bug and stand (even dead) The question is: is there any way to fix this? maybe creating some kind of loop? Pic: https://prnt.sc/nbs67g
  23. 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