Jump to content

[AJUDA] Sistema de Nível


Recommended Posts

Boa tarde, estou a fazer um script de nível no qual o EXP é aumentado por tempo. Gostaria de saber como faço para a quantidade de exp necessária para upar aumentar quando o player passar de nível

Exemplo:

• Nível 1: Precisa de 50 de exp para passar para o nível 2

• Nível 2: Precisa de 100 de exp para passar para o nível 3

Link to comment
3 hours ago, ~ShooT said:

Boa tarde, estou a fazer um script de nível no qual o EXP é aumentado por tempo. Gostaria de saber como faço para a quantidade de exp necessária para upar aumentar quando o player passar de nível

Exemplo:

• Nível 1: Precisa de 50 de exp para passar para o nível 2

• Nível 2: Precisa de 100 de exp para passar para o nível 3

setElementData
setTimer

 

  • Like 1
Link to comment
  • Moderators

Primeiro, a tabela, crie uma tabela com o nível no índice e a exp para upar o nível no valor. Exemplo:

local levelsTable = 
{
	[1] = 500, --nível 1 -> exp necessária 500
	[2] = 900, --1
	[3] = 1100, --2
	[4] = 1300 --3
}

Isso será útil para a função que faz a checagem de quando o nível sobe.

Ambos, o nível do jogador e a exp você vai deixar armazenados com setElementData e na função que vai dar exp você seta o valor no element-data e chama a função que verifica se o jogador subiu de nível - essa função vou falar dela mais pra frente

A função que dá exp:

local level_maximo = 50 -- aqui fica definido o último level
function givePlayerExp( exp )
	if exp and tonumber(exp) and (getElementData( localPlayer, "level" ) or 0) ~= level_maximo then
    	-- "(getElementData( localPlayer, "level" ) or 0) ~= level_maximo" basicamente isso será para a função,
    	-- ser executada só se o level for diferente do último level
		local playerExp = getElementData( localPlayer, "playerExp" ) or 0 -- pega a exp atual; se falhar o valor será 0
		setElementData( localPlayer, "playerExp", playerExp + tonumber(exp) ) -- define a exp somando a atual + a exp ganha
		
		checkLevel( localPlayer ) -- aqui é a função que verifica se o jogador já atingiu a exp necessária
		return true
	end
	return false
end

Em seguida vem a parte mais difícil, ou mais complexa - a função que vai checar quando upar o nível. Leia os comentários no código para entender como funciona:

function checkLevel( player )
	local player = player or localPlayer
	local playerExp = getElementData( player, "playerExp" ) or 0
	local lv = getElementData( player, "level" ) or 0 -- pega o level do jogador
	
	local expCheck = levelsTable[lv] - playerExp
	--[[ aqui em "levelsTable[lv]" recebe a exp pra subir nível sendo que "lv" representa o level,
		poderia ser por exemplo, 900, que é o valor pra subir pro level 3.
		
		"playerExp" é a exp atual do jogador,
		suponhamos que seu level é 2, e com a exp ganha sua exp passa a ser 1000,
		então será a variável "expCheck" retornará o valor -100 (900 - 1000)
	]]--
	if expCheck <= 0 then -- se "expCheck" for negativo ou igual a zero, então o lv subiu
		local exp = (lv + 1) == level_maximo and 0 or playerExp - levelsTable[lv]
		--[[ seguindo a suposição feita acima, aqui vai setar a nova exp com aqueles -100 restantes
			sendo aproveitados. Então será definido a exp como 100
			
			Em "(lv + 1) == level_maximo and 0" está verificando se o novo level é o último,
			caso seja, a exp para upar será sempre 0
		]]
		
		setElementData( player, "level", lv + 1 ) -- aqui seta o novo level; level atual + 1
		setElementData( player, "playerExp", exp ) -- seta a nova exp do jogador
	end
end

Outra coisa necessária será o evento "onClientElementDataChange", esse será para detectar uma alteração direta no element-data:

addEventHandler( "onClientElementDataChange", root,
	function (dataName)
		if (dataName == "playerExp") then
			checkLevel( source ) -- chama a função para verificar se o level subiu
		end
	end
)

Feito isso, o resto fica bem fácil, como o que você citou que é dar exp ao jogador a cada x tempo. Aqui um exemplo simples:

setTimer(
	function()
		givePlayerExp( 10 ) -- dá 10 pontos de exp
	end, 60000 * 10, 0
	-- 60000 * 10 -> 10 minutos
)

Pra salvar na conta, use a função mencionada pelo LordHenry e os eventos onPlayerQuit e onPlayerLogout; E para carregar os dados use onPlayerLogin + getAccountData + setAccountData.

Finalizando, o código ficará assim:


local level_maximo = 50 -- aqui fica definido o último level

local levelsTable = 
{
	[1] = 500, --nível 1 -> exp necessária 500
	[2] = 900, --1
	[3] = 1100, --2
	[4] = 1300 --3
}

function checkLevel( player )
	local player = player or localPlayer
	local playerExp = getElementData( player, "playerExp" ) or 0
	local lv = getElementData( player, "level" ) or 1 -- pega o level do jogador
	
	local expCheck = levelsTable[lv] - playerExp
	--[[ aqui em "levelsTable[lv]" recebe a exp pra subir nível sendo que "lv" representa o level,
		poderia ser por exemplo, 900, que é o valor pra subir pro level 3.
		
		"playerExp" é a exp atual do jogador,
		suponhamos que seu level é 2, e com a exp ganha sua exp passa a ser 1000,
		então será a variável "expCheck" retornará o valor -100 (900 - 1000)
	]]--
	if expCheck <= 0 then -- se "expCheck" for negativo ou igual a zero, então o lv subiu
		local exp = (lv + 1) == level_maximo and 0 or playerExp - levelsTable[lv]
		--[[ seguindo a suposição feita acima, aqui vai setar a nova exp com aqueles -100 restantes
			sendo aproveitados. Então será definido a exp como 100
			
			Em "(lv + 1) == level_maximo and 0" está verificando se o novo level é o último,
			caso seja, a exp para upar será sempre 0
		]]
		
		setElementData( player, "level", lv + 1 ) -- aqui seta o novo level; level atual + 1
		setElementData( player, "playerExp", exp ) -- seta a nova exp do jogador
	end
end

function givePlayerExp( exp )
	if exp and tonumber(exp) and (getElementData( localPlayer, "level" ) or 0) ~= level_maximo then
		local playerExp = getElementData( localPlayer, "playerExp" ) or 0 -- pega a exp atual; se falhar o valor será 0
		setElementData( localPlayer, "playerExp", playerExp + tonumber(exp) ) -- define a exp somando a atual + a exp ganha
		
		checkLevel( localPlayer ) -- aqui é a função que verifica se o jogador já atingiu a exp necessária
		return true
	end
	return false
end

addEventHandler( "onClientElementDataChange", root,
	function (dataName)
		if (dataName == "playerExp") then
			checkLevel( source ) -- chama a função para verificar se o level subiu
		end
	end
)

setTimer(
	function()
		givePlayerExp( 10 ) -- dá 10 pontos de exp
	end, 60000 * 10, 0
	-- 60000 * 10 -> 10 minutos
)

 

Edited by DNL291
  • Like 3
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...