virgingod Posted February 29, 2020 Share Posted February 29, 2020 Estou tentando ativar uma função "nativa" de um LevelSystem que estou usando, seria para cada 10 minutos o player ganhar um de XP, mas isso não acontece, e não consigo imagina o que possa estar acontecendo. O que entendo da função é que ela fica rodando de segundo em segundo, e dependendo a condição ela faz X coisa, uma das condições é adicionar +1 "minuto" a cada vez que rodar o script, e se o minuto for maior que 600, ele da um XP e reseta os minutos, mas não é isso que acontece Spoiler -- Script only Server-Side-- function timecount ( ) for i, player in ipairs(getElementsByType("player")) do local acc = getPlayerAccount(player) if acc then if not isGuestAccount(acc) then if getElementData ( player, "AirNewSCR_LiberarXP" ) == "Sim" then setElementData ( player, "AirNewSCR_LiberarXP", "Não" ) 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 outputConsole("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) --outputChatBox ( "#ffffff[ #82FA58UP #ffffff] - Você Ganhou +1 de Experiência. (".. tonumber(exp)+1 .."/6)", player, 255, 255, 255, true ) 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 ) --DarSalario (player) -- Efetua os Pagamentos dos Jogadores else 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 ) end if tonumber(mins) < 600 then setElementData(player,"LSys:Mins",tonumber(mins)+1) setElementData(player,"LSys:Online",tonumber(onlinetime)+1) end end end end end end setTimer ( timecount, 1000, 0 ) Link to comment
iDannz [Breno] Posted March 1, 2020 Share Posted March 1, 2020 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. Link to comment
Tommy. Posted March 1, 2020 Share Posted March 1, 2020 Não está no gibi a quantidade de problemas que esses mods do AirNew tem. 1 Link to comment
iDannz [Breno] Posted March 1, 2020 Share Posted March 1, 2020 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. Link to comment
#RooTs Posted March 1, 2020 Share Posted March 1, 2020 24 minutes ago, Tommy. said: Não está no gibi a quantidade de problemas que esses mods do AirNew tem. Kkkkkkkk 1 hour ago, iDannz [Breno] said: 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. O tal de felix_mta também kkkkk se acham os programadores melhores do mundo kkkkkk Link to comment
virgingod Posted March 1, 2020 Author Share Posted March 1, 2020 1 hour ago, iDannz [Breno] said: 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. 20 minutes ago, Tommy. said: Não está no gibi a quantidade de problemas que esses mods do AirNew tem. Realmente, todo mundo diz que esses mods tem muitos problemas e bugs, alem de ser um tanto mal organizado, to aprendendo mais resolvendo os bugs do que lendo o código Spoiler 9 minutes ago, iDannz [Breno] said: 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. Me surgiram algumas duvidas, usar o setElementData pra todos ou varios scripts é um problema que pode comprometer o desempenho do servidor com muitos jogadores online? Usando essas tabelas, não é possivel eu syncronizar esses valores com outros scripts? tipo o level é um script e outro script precisa verificar esse nivel Link to comment
iDannz [Breno] Posted March 1, 2020 Share Posted March 1, 2020 (edited) 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. Edited March 1, 2020 by iDannz [Breno] Link to comment
Angelo Pereira Posted March 1, 2020 Share Posted March 1, 2020 (edited) 49 minutes ago, Breevz said: Realmente, todo mundo diz que esses mods tem muitos problemas e bugs, alem de ser um tanto mal organizado, to aprendendo mais resolvendo os bugs do que lendo o código Reveal hidden contents Me surgiram algumas duvidas, usar o setElementData pra todos ou varios scripts é um problema que pode comprometer o desempenho do servidor com muitos jogadores online? Usando essas tabelas, não é possivel eu syncronizar esses valores com outros scripts? tipo o level é um script e outro script precisa verificar esse nivel Eu indicaria usar setElementData só quando realmente necessário, quando você precisar manuseia esse elemento entre outros scripts, server-side e client-side. Só indago aqui, em minha percepção é : 1. Cada um tem sua maneira de manuseia códigos, fazer um resource, se delimitando ou não. 2. Se existe no wiki suas variedades de opções, é para serem usadas, e o que realmente define realmente um resource mal otimizado? Então para eu fazer um script, terei que inventar maneiras, para se dizer "foi diferente" e é mais "otimizado"? Quem garante? Bom, eu já fiz os testes, realmente tem muitas coisas que você consegue otimiza "Não estou polemizando", outras não fará nenhuma diferença, o que será mais indicado a fazer? eu ter que criar um resource que ficará recebendo informação? ou salva-lo diretamente em um elemento? utilizar exportações? triggers? pra mim, ambos é a mesma coisa, claro, cada um tem sua opinião. 3. E em timers, o que pode preocupar, é o tanto de timers sendo acionados, porem, vai depende para que você esta utilizando, você não pode apenas parar de usa-lo por que dizem que dará um resource menos otimizado, vai depende do código de como está sendo feito e para que, o indicado não é deixa um tempo muito rápido, porem, vai depende de cada necessidade. Edited March 1, 2020 by Angelo Pereira Link to comment
virgingod Posted March 1, 2020 Author Share Posted March 1, 2020 (edited) Entendi todos os pontos sobre novos modos de usar e quais problemas são causados, mas ainda não consegui resolver o problema (que acho que possa ser resolvido) dentro desse script 1° Modo de que tentei Spoiler --[[ Adicionei a função setElementData ( player, "AirNewSCR_LiberarXP", "Sim" ) nas linhas 20 e 40, mas o script continuou sem adicionar os niveis a cada 10 minutos --]] function timecount ( ) for i, player in ipairs(getElementsByType("player")) do local acc = getPlayerAccount(player) if acc then if not isGuestAccount(acc) then if getElementData ( player, "AirNewSCR_LiberarXP" ) == "Sim" then setElementData ( player, "AirNewSCR_LiberarXP", "Não" ) 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) setElementData ( player, "AirNewSCR_LiberarXP", "Sim" ) 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ê Ganhou +1 de Experiência. (".. tonumber(exp)+1 .."/6)", player, 255, 255, 255, true ) 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 ) --DarSalario (player) -- Efetua os Pagamentos dos Jogadores else 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 ) end if tonumber(mins) < 600 then setElementData(player,"LSys:Mins",tonumber(mins)+1) setElementData(player,"LSys:Online",tonumber(onlinetime)+1) setElementData ( player, "AirNewSCR_LiberarXP", "Sim" ) outputDebugString("adicionou minuto") end end end end end end setTimer ( timecount, 1000, 0 ) 2° Modo que tentei Spoiler --[[ Nesse modo eu removi o check de sim e o set de não if getElementData ( player, "AirNewSCR_LiberarXP" ) == "Sim" then setElementData ( player, "AirNewSCR_LiberarXP", "Não" ) Mas tava ganhando xp a cada vez que o timer executava a ação ]]-- 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ê Ganhou +1 de Experiência. (".. tonumber(exp)+1 .."/6)", player, 255, 255, 255, true ) 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 ) --DarSalario (player) -- Efetua os Pagamentos dos Jogadores else 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 ) 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 end setTimer ( timecount, 1000, 0 ) Edited March 1, 2020 by Breevz Link to comment
iDannz [Breno] Posted March 1, 2020 Share Posted March 1, 2020 O seu segundo método está quase funcional, você só esqueceu de remover um end (já que você removeu um if) Link to comment
Angelo Pereira Posted March 1, 2020 Share Posted March 1, 2020 (edited) 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. Edited March 1, 2020 by Angelo Pereira Link to comment
virgingod Posted March 1, 2020 Author Share Posted March 1, 2020 4 hours ago, iDannz [Breno] said: O seu segundo método está quase funcional, você só esqueceu de remover um end (já que você removeu um if) tlg, eu arrumei aqui, mas o problema que citei continua, sempre que a função é executada pelo timer, a pessoa ganha +1 xp Spoiler 6 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. Testei e não deu Modo que adicionei Spoiler function timecount ( ) for i, player in ipairs(getElementsByType("player")) do local acc = getPlayerAccount(player) if acc then if not isGuestAccount(acc) then if getElementData ( player, "AirNewSCR_LiberarXP" ) == "Sim" then setElementData ( player, "AirNewSCR_LiberarXP", "Não" ) 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ê Ganhou +1 de Experiência. (".. tonumber(exp)+1 .."/6)", player, 255, 255, 255, true ) 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 ) --DarSalario (player) -- Efetua os Pagamentos dos Jogadores else 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 ) 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 end setTimer ( timecount, 1000, 0 ) 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] >= 20 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 outputDebugString ( "#ffffff[ #82FA58UP #ffffff] - Você Ganhou +1 de Experiência. ("..tonumber(table_experiencia[player])"/20)", player, 255, 255, 255, true ) end end end end setTimer ( time_level, 1000*10, 0 ) --/> A Cada 10 min Ganha 1 EXP // só coloquei 1000 pra testar mais rapido ERRO APRESENTADO NO CONSOLE Link to comment
iDannz [Breno] Posted March 1, 2020 Share Posted March 1, 2020 (edited) 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 ) Edited March 1, 2020 by Lord Henry Link to comment
#RooTs Posted March 1, 2020 Share Posted March 1, 2020 20 minutes ago, iDannz [Breno] said: De tal mal feito que o código estava acabamos nao percebendo que as condições originais não faziam o minimo sentido, Kkkkkkk. Eu já não espero mais nada dessas coisas da net kkk Link to comment
Gw8 Posted March 1, 2020 Share Posted March 1, 2020 17 hours ago, Breevz said: Estou tentando ativar uma função "nativa" de um LevelSystem que estou usando, seria para cada 10 minutos o player ganhar um de XP, mas isso não acontece, e não consigo imagina o que possa estar acontecendo. Você está tentando mesclar 2 sistemas ou tentando apenas fazer está função ser executada a cada 10 minutos? function timecount ( ) for i, player in ipairs(getElementsByType("player")) do local acc = getPlayerAccount(player) if acc then if not isGuestAccount(acc) then --if getElementData ( player, "AirNewSCR_LiberarXP" ) == "Sim" then -- setElementData ( player, "AirNewSCR_LiberarXP", "Não" ) local level = tonumber(getElementData(player,"Level")) or 0 --if tonumber(level) == nil then level = 0 end local exp = tonumber(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 --outputConsole("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) --outputChatBox ( "#ffffff[ #82FA58UP #ffffff] - Você Ganhou +1 de Experiência. (".. tonumber(exp)+1 .."/6)", player, 255, 255, 255, true ) 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 ) --DarSalario (player) -- Efetua os Pagamentos dos Jogadores else 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 ) end --if tonumber(mins) < 600 then --setElementData(player,"LSys:Mins",tonumber(mins)+1) --setElementData(player,"LSys:Online",tonumber(onlinetime)+1) --end end --end end end end setTimer ( timecount, 1000*60*10, 0 ) Link to comment
Angelo Pereira Posted March 1, 2020 Share Posted March 1, 2020 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 2 Link to comment
Angelo Pereira Posted March 1, 2020 Share Posted March 1, 2020 Fiz umas correções de faltar .. e um outputDebugString (Que eu não tinha visto). 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, 10000, 0 ) --/> A Cada 10 S / Demostração. Testado : Link to comment
iDannz [Breno] Posted March 1, 2020 Share Posted March 1, 2020 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; 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. 1 Link to comment
Angelo Pereira Posted March 1, 2020 Share Posted March 1, 2020 10 minutes ago, iDannz [Breno] said: 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. 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. Link to comment
iDannz [Breno] Posted March 1, 2020 Share Posted March 1, 2020 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. Link to comment
Angelo Pereira Posted March 1, 2020 Share Posted March 1, 2020 2 minutes ago, iDannz [Breno] said: é, 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. Amigo, eu dei exemplo, não irei introduzir tudo o que é preciso, ou seja, "não que vou fazer tudo", apenas mostrei uma forma e uma estrutura de como pode ser feito. Entende isso? E Exatamente, cada um teu seu jeito, cada um vai passa uma parte do seu conhecimento, não que dizer que temos que fazer tudo. Vamos ter mais humildade, não sou eu que fico falando mal de códigos dos outros, mas, eu encerro por aqui. Link to comment
iDannz [Breno] Posted March 1, 2020 Share Posted March 1, 2020 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. 1 Link to comment
Angelo Pereira Posted March 1, 2020 Share Posted March 1, 2020 (edited) 14 minutes ago, iDannz [Breno] said: 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. Eu entendo, e concordo sobre dar dicas para melhorar, é algo valioso, mas, não estamos aqui pra causar discussão. Fiz de uma maneira funcional. -- Script only Server-Side-- function timecount ( ) for i, player in ipairs(getElementsByType("player")) do local acc = getPlayerAccount(player) if acc and 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 --/> Se o Player Tiver 600 Segundos Então Faça : 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 ) setElementData(player,"LSys:Mins", 0) playSoundFrontEnd ( player, 44 ) end if tonumber(exp) >= 20 then --/> Se o Player Tiver 20 EXP Então faça : setElementData(player,"LSys:EXP",0) setElementData(player,"Level",tonumber(level)+1) 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 ) --DarSalario (player) -- Efetua os Pagamentos dos Jogadores end if tonumber(mins) < 600 then --/> Se o Player Tiver Abaixo de 600 Segundos, Então Faça : setElementData(player,"LSys:Mins", tonumber(mins) + 10 ) --/>A Cada 10 Segundos Receberá + 10 s em seu Elemento Mins. setElementData(player,"LSys:Online",tonumber(onlinetime) + 10 ) end end end end setTimer ( timecount, 10000, 0 ) --/> 10 Segundos -- Calculo : -- 10000 s --> Adiciona +10s / em 60 Segundos Terá 1 Minuto = total de 60000 segundos / em 10 min atingirá 600000 onde receberá +1 EXP Aumentei o tempo como mencionei, para não fica disparando em 1 em 1s. Edited March 1, 2020 by Angelo Pereira 1 Link to comment
#RooTs Posted March 1, 2020 Share Posted March 1, 2020 calma gente. sem extress.. esse codes da net estão tudo zuado. não vale apena dar continuidade com isso ( Pelo Amor de Deus ) e ainda pra ajudar o pessoal vem pedir/suporte com esse tipo de coisa que não vale a pena.. estou vendo que todos querem ajudar, mais infelizmente não vamos ter progresso com esse code. minha ideia é que... já que todos querem ajudar vamos criar um LevelSystem descente. se precisar pode conta com minha ajuda. vamos nos juntar e fazer um e POSTAR NA NET 1 Link to comment
Gw8 Posted March 1, 2020 Share Posted March 1, 2020 22 hours ago, Breevz said: Estou tentando ativar uma função "nativa" de um LevelSystem que estou usando, seria para cada 10 minutos o player ganhar um de XP, mas isso não acontece, e não consigo imagina o que possa estar acontecendo. @Angelo Pereira por mais que pareça que o código que você criou está certo, ele ainda não está executando corretamente oque ele solicitou, tente interpretar o texto corretamente desta vez. 1 Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now