Jump to content

[Duvida/Ajuda] LevelSystem por minutos


Recommended Posts

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

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

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

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 by iDannz [Breno]
Link to comment
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 by Angelo Pereira
Link to comment

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 by Breevz
Link to comment
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 by Angelo Pereira
Link to comment
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

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 by Lord Henry
Link to comment
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

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 :

RqxUv0O.png

Link to comment
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
Link to comment
10 minutes ago, iDannz [Breno] said:

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.

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
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
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
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
Link to comment
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 by Angelo Pereira
  • Thanks 1
Link to comment

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

  • Like 1
Link to comment
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.

  • Like 1
Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...