~ShooT Posted December 4, 2018 Share Posted December 4, 2018 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
AirNew Posted December 4, 2018 Share Posted December 4, 2018 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 1 Link to comment
Other Languages Moderators Lord Henry Posted December 4, 2018 Other Languages Moderators Share Posted December 4, 2018 Rapaz, isso é relativamente complexo de ser feito. E vai precisar de setAccountData também. 1 Link to comment
DNL291 Posted December 5, 2018 Share Posted December 5, 2018 (edited) 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 December 5, 2018 by DNL291 3 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