Jump to content

[ajuda]~Level System


Recommended Posts

Estou com um sistema de level system para dayz, a cada morte de player ou zombies o player ganha uma certa quantia de experiencia... mais ele não está ganhando level.. por exemplo quando chega a 1000 de experiencia quero que seja setado para ele level 1, porém não setá.. o unico modo de setar level que está funcionando é pelo painel.. mais eu quero que seja automatico, assim que ele chegar a 1000 de experiencia ele ganhe o level 1

-- Level System 
local sW, sH = guiGetScreenSize() 
local windowRank = guiCreateWindow ( (sW-500)/2, (sH-400)/2, 500, 400, "Manage Players Level System", false ) 
guiWindowSetSizable ( windowRank, false ) 
guiSetVisible ( windowRank, false) 
local windowRankGridList = guiCreateGridList ( 10, 28, 360, 360, false, windowRank ) 
local windowRankColumn = guiGridListAddColumn( windowRankGridList, "Name", 0.90 ) 
local windowRankEdit = guiCreateEdit( 383, 150, 100, 30, "", false, windowRank) 
local windowRankEdit2 = guiCreateEdit( 383, 250, 100, 30, "", false, windowRank) 
local windowRankButton = guiCreateButton( 383, 358, 100, 30, "Change", false, windowRank) 
local windowRankLabelLevel = guiCreateLabel(383, 120, 100, 20,"Level: None", false, windowRank) 
guiLabelSetHorizontalAlign (windowRankLabelLevel, "center") 
local windowRankLabelExp = guiCreateLabel(383, 220, 100, 20,"Experience: None", false, windowRank) 
guiLabelSetHorizontalAlign (windowRankLabelExp, "center") 
  
local ranksTable = 
{ 
  {"0","Teste","0"}, 
  {"1","Cabo","1000"}, 
  {"2","Recruta","2000"}, 
  {"3","Privado","3000"}, 
  {"4","Privado Primeira Classe","4000"}, 
  {"5","Corporal","5000"}, 
  {"6","Sargento","5800"}, 
  {"7","Sargento |","8100"}, 
  {"8","Sargento ||","11000"}, 
  {"9","Sergento |||","14600"}, 
  {"10","Sargento Primeira Classe |","18800"}, 
  {"11","Sargento Primeira Classe ||","23800"}, 
  {"12","Sargento Primeira Classe |||","29600"}, 
  {"13","Sargento Mestre |","36300"}, 
  {"14","Sargento Mestre ||","44100"}, 
  {"15","Sargento Mestre |||","53000"}, 
  {"16","Sargento Mestre ||||","63000"}, 
  {"17","Comandante Sargento Major |","74500"}, 
  {"18","Comandante Sargento Major |||","87400"}, 
  {"19","Comandante Sargento Major ||||","102000"}, 
  {"20","Comandante Sargento Major ||||","118400"}, 
  {"21","Comandante Sargento Major |||||","136700"}, 
  {"22","Segundo Tenente |","157200"}, 
  {"23","Segundo Tenente ||","180000"}, 
  {"24","Segundo Tenente |||","205200"}, 
  {"25","Segundo Tenente ||||","233300"}, 
  {"26","Segundo Tenente |||||","264400"}, 
  {"27","Primeiro Tenente |","298700"}, 
  {"28","Primeiro Tenente ||","336500"}, 
  {"29","Primeiro Tenente |||","378000"}, 
  {"30","Primeiro Tenente ||||","423700"}, 
  {"31","Primeiro Tenente |||||","473700"}, 
  {"32","Capitão |","528400"}, 
  {"33","Capitão |||","588100"}, 
  {"34","Capitão ||||","653400"}, 
  {"35","Capitão ||||","724400"}, 
  {"36","Capitão |||||","801600"}, 
  {"37","Major |","885500"}, 
  {"38","Major |||","976400"}, 
  {"39","Major ||||","1074800"}, 
  {"40","Major ||||","1181100"}, 
  {"41","Major |||||","1296000"}, 
  {"42","Tenente Coronel |","1419700"}, 
  {"43","Tenente Coronel ||","1552900"}, 
  {"44","Tenente Coronel |||","1696200"}, 
  {"45","Tenente Coronel ||||","1849900"}, 
  {"46","Tenente Coronel |||||","2014800"}, 
  {"47","Coronel |","2191200"}, 
  {"48","Coronel ||","2380000"}, 
  {"49","Coronel |||","2581500"}, 
  {"50","Coronel |||| ","2796400"}, 
} 
  
  
function getPlayerRankName() 
  for i=0,50 do 
    if getElementData(localPlayer, "level") == tonumber(ranksTable[i][0]) then 
      return ranksTable[i][2] 
    end 
  end 
end 
  
function getPlayerRankExperience() 
  for i=0,50 do 
    if getElementData(localPlayer, "level") == tonumber(ranksTable[i][0]) then 
      return tonumber(ranksTable[i][3]) 
    end 
  end 
end 
  
function mainRanks() 
  if getElementData(localPlayer, "logedin") == true then 
    if getElementData(localPlayer, "experience") > getPlayerRankExperience() then 
      if getElementData(localPlayer, "level") < 50 then 
        setElementData(localPlayer, "level", getElementData(localPlayer, "level") + 1) 
        local _ll = getElementData(localPlayer, "level") 
        DarItemsPorLevelUp(localPlayer,_ll)      
      end 
    end 
    dxDrawImage ( sW/65, sH/2.0, sW/20, sH/20, "images/level/rank"..getElementData(localPlayer, "level")..".jpg" )   
    dxDrawText ( getPlayerRankName().." ("..getElementData(localPlayer, "level")..")",sW/65, sH/1.8, sW/0, sH/0, tocolor ( 250, 0, 0, 255 ), 1.02, "default-bold" )  
    dxDrawText ( "Sua Experiencia: "..getElementData(localPlayer, "experience"), sW/65, sH/1.7, sW/0, sH/0, tocolor ( 250, 0, 0, 255 ), 1.02, "default-bold" ) 
    if getElementData(localPlayer, "level") < 50 then 
      dxDrawText ( "Proximo Level: "..getPlayerRankExperience(),sW/65, sH/1.6, sW/0, sH/0, tocolor ( 250, 0, 0, 255 ), 1.02, "default-bold" ) 
    else 
      dxDrawText ( "Patente Maxima Atingida",sW/65, sH/1.6, sW/0, sH/0, tocolor ( 0, 250, 0, 255 ), 1.02, "default-bold" ) 
    end    
  end 
end 
addEventHandler ( "onClientRender", root, mainRanks ) 
  
function toggleWindowRanks() 
  if getElementData(localPlayer, "adminRanks") == true then  
    if guiGetVisible(windowRank) == false then 
      guiSetVisible(windowRank, true) 
      showCursor(true) 
      for k, v in ipairs (getElementsByType("player")) do 
        if getElementData (v, "logedin") == true then 
          local row = guiGridListAddRow ( windowRankGridList ) 
          guiGridListSetItemText ( windowRankGridList, row, windowRankColumn, getPlayerName ( v ), false, false ) 
        end 
      end 
    else 
      guiSetVisible(windowRank, false) 
      showCursor(false) 
      guiGridListClear(windowRankGridList) 
    end 
  end 
end 
bindKey("F7", "down", toggleWindowRanks) 
  
function windowRankClick() 
local playerName = guiGridListGetItemText ( windowRankGridList, guiGridListGetSelectedItem ( windowRankGridList ), 1 ) 
  if source == windowRankGridList then 
    if guiGridListGetSelectedCount(windowRankGridList) == 0 then 
      guiSetText(windowRankLabelLevel, "Level: "..getElementData(getPlayerFromName(playerName), "level")) 
      guiSetText(windowRankLabelExp, "Experience: "..getElementData(getPlayerFromName(playerName), "experience")) 
    else 
      guiSetText(windowRankLabelLevel, "Level: None") 
      guiSetText(windowRankLabelExp, "Experience: None") 
    end 
  end  
  if source == windowRankButton then 
    if guiGridListGetSelectedCount(windowRankGridList) == 0 then 
    local playerName = guiGridListGetItemText ( windowRankGridList, guiGridListGetSelectedItem ( windowRankGridList ), 1 ) 
      if guiGetText(windowRankEdit) ~= "" then 
        setElementData(getPlayerFromName(playerName), "level", tonumber(guiGetText(windowRankEdit))) 
        guiSetText(windowRankLabelLevel, "Level: "..getElementData(getPlayerFromName(playerName), "level")) 
      end 
      if guiGetText(windowRankEdit2) ~= "" then 
        setElementData(getPlayerFromName(playerName), "experience", tonumber(guiGetText(windowRankEdit2))) 
        guiSetText(windowRankLabelExp, "Experience: "..getElementData(getPlayerFromName(playerName), "experience")) 
      end    
    else 
      outputChatBox("#FF0000[LEVEL SYSTEM]: #FFFFFFSelect the player!", thePlayer, 171, 205, 239, true) 
    end 
  end 
end 
addEventHandler ("onClientGUIClick", windowRank, windowRankClick) 
  
function DarItemsPorLevelUp(thePlayer,level) 
triggerServerEvent("onLevelUpRewards",thePlayer,level) 
end 
  

Link to comment

Reggae, apenas um comentário antes de mais nada: considere-se boa prática de programação dividir, em arquivos diferentes, as funções relacionadas à construção da interface e as funções que representem sua lógica de negócio, isto é, a lógica em si do programa (dar a experiência, transformar 1000 em 1 level, etc.).

1) Primeiro, vamos refatorar a sua função getPlayerRankName():

a) Você não precisa navegar por toooodos os elementos da lista, fazendo uma condição em cada um deles. Pode simplesmente usar:

function getPlayerRankName() 
    return ranksTable[getElementData(localPlayer, "level")][2] 
  

Obs.: a única coisa que não me lembro é se arrays em Lua são indexados a partir de 0 ou a partir de 1. Alguém por favor me tira essa dúvida? Não encontrei respostas concretas.

2) Refatore o getPlayerRankExperience()

A lógica é a mesma da refatoração anterior. Elimine as n condições, retornando diretamente o que você quer. Exatamente o que fizemos acima.

3) Deixe somente as funções de DX no mainRanks()

Sua função mainRanks() é chamada no evento onClientRender, evento que é chamado dezenas de vezes num único segundo, afinal, é chamado à cada renderização do seu computador. Fazer "condições" em eventos assim, quando não necessário, é perder performance sem necessidade.

Reescreva uma nova função que faça somente essa checam de experiência e subida de level. E então chame essa função toda vez que um jogador ganhar experiência, ou seja, toda vez que você setar a experiência desse jogador em algum lugar do código.

Dê importância para as refatorações que visam melhoria de performance. Muitos servidores investem dezenas de reais mensalmente em servidores cada vez mais potentes para evitar o "lag" quando, na verdade, poderiam investir na reconstrução do DayZ. Ele em si é lento e inimigo dos processadores.

[OK] Código agora é performático.

Vamos "debugar" seu código:

Eu sou level 1, Cabo, cujo valor mínimo é 1000 pontos de experiência.

Num dado momento, estou com 1001 pontos de experiência. Logo, quando a condição para me upar vier, ela vai ter como valores:

1001 > 1000? Se sim, aumente o level do jogador.

1001: retornado pelo getElementData()

1000: retornado pelo getPlayerRankName(), afinal, ele pega a experiência mínima do meu level ATUAL (o level é 1, então a experiência mínima é 1000)

Logo, pela lógica, quando eu tiver 1001, ele me upa para o level 2. O certo é que, na função getPlayerRankName(), ele não chece o valor de experiência mínima do meu level atual, mas sim do meu level atual + 1

Tudo isso pode não resolver o seu problema de fato, embora solucione outros. Pelo que vi, fora o último problema citado acima, a lógica está correta. O que falta é um debug mais apurado, para saber exatamente onde algo está recebendo o que não devia.

Link to comment
Amigo ao invés de se cansar lendo esse tutorial, e quebrar a cabeça pra tentar entender, chama mp que eu te ajudo, arrumamos seu código e digo aonde você errou. Obg.

é realmente tenso isso, tentando ajudar mais o cara escreve um Livro kkkkkkkkkkkkkkkk

omg :lol::lol:

Link to comment

Hábito de programador, rs. Scripter não entende de performance e manuseio de processador. O famoso commit e já era. #extremeGoHorse

Reggae, se você não tem intenção de ser programador um dia, realmente o que escrevi não é proveitoso para você. O que não é problema, afinal, querer desenvolver pra MTA não significa que você quer desenvolver outras aplicações.

Agora, se for seu objetivo ser desenvolvedor, e não somente um scripter, leia com atenção o que eu disse. No começo, você não vai entender muito. Mas tudo que se lê de estranho todos os dias vão se encaixando dia após dia com muita teoria e, mais ainda: prática.

Link to comment

Perfeita a resposta do Stanley, explicou os erros e ainda ensinou a arrumar, as pessoas tem que aprender que

"ajudar" ~= "dar codigo pronto" 

Considerando que a maioria só copia os códigos e pronto, resolvido (nem ao menos veem oque foi alterado) essa é a melhor coisa a se fazer, Triste saber que tem dono de servidor 'lotado' que nem sabe 'programar' :P

ah se eu tivesse alguem que me ajudasse assim quando eu estava aprendendo rs

obs: sei que foi 'meio' 'offtopic' isso mas ok, como tocaram no assunto resolvi responder tbm.

obs²: antes que se ofendam, as afirmações feitas por mim neste tópico não se referem a nenhum dos que aqui postaram.

Link to comment
  • Moderators
Amigo ao invés de se cansar lendo esse tutorial, e quebrar a cabeça pra tentar entender, chama mp que eu te ajudo, arrumamos seu código e digo aonde você errou. Obg.

Se eu fosse o Reggae estaria muito grato por toda a explicação do Stanley. Se ele prefere o código pronto e não quer aprender lendo tutoriais é problema dele. O post está lá, e será de grande proveito pra quem está interessado.

É questão de interesse, de que adianta querer fazer um servidor com bases de códigos feitas por outro? Se for por preguiça, então o servidor será sempre fraco e a pessoa nunca vai aprender nada e sempre vai precisar de ajuda.

Digo isto, porque já fui assim, daqueles que "não quer estudar mas quer aprender" (ou no caso: fazer um servidor). E quando aprendi Lua foi sem base sobre o funcionamento de tudo; isso porque havia aprendido quase tudo na prática, mas quando minha 'cabeça mudou' passei a aproveitar todo tutorial que lia aliado da prática que nunca deixei de lado.

Sei que isso já é uma outra discussão e está fora do assunto do tópico. De qualquer forma, quis deixar minha opinião para aqueles que tem o conceito errado.

Link to comment
Amigo ao invés de se cansar lendo esse tutorial, e quebrar a cabeça pra tentar entender, chama mp que eu te ajudo, arrumamos seu código e digo aonde você errou. Obg.

Se eu fosse o Reggae estaria muito grato por toda a explicação do Stanley. Se ele prefere o código pronto e não quer aprender lendo tutoriais é problema dele. O post está lá, e será de grande proveito pra quem está interessado.

É questão de interesse, de que adianta querer fazer um servidor com bases de códigos feitas por outro? Se for por preguiça, então o servidor será sempre fraco e a pessoa nunca vai aprender nada e sempre vai precisar de ajuda.

Digo isto, porque já fui assim, daqueles que "não quer estudar mas quer aprender" (ou no caso: fazer um servidor). E quando aprendi Lua foi sem base sobre o funcionamento de tudo; isso porque havia aprendido quase tudo na prática, mas quando minha 'cabeça mudou' passei a aproveitar todo tutorial que lia aliado da prática que nunca deixei de lado.

Sei que isso já é uma outra discussão e está fora do assunto do tópico. De qualquer forma, quis deixar minha opinião para aqueles que tem o conceito errado.

Se aprende com exemplos. Ele poderia ler o tutorial, demorar 10 horas pra descobrir aonde ele errou, ou eu poderia concertar o que estava errado explicar aonde errou e porque errou, e qual a maneira correta de se fazer. E ele aprenderia mais rápido :)

Link to comment
Se aprende com exemplos. Ele poderia ler o tutorial, demorar 10 horas pra descobrir aonde ele errou, ou eu poderia concertar o que estava errado explicar aonde errou e porque errou, e qual a maneira correta de se fazer. E ele aprenderia mais rápido :)

BOAAAAA, esse é o novo conceito para aprender.

estamos em uma nova era pessoal, vamos nos adaptar a ela. :wink:

é disso que estou falando :roll:

Link to comment
Se aprende com exemplos. Ele poderia ler o tutorial, demorar 10 horas pra descobrir aonde ele errou, ou eu poderia concertar o que estava errado explicar aonde errou e porque errou, e qual a maneira correta de se fazer. E ele aprenderia mais rápido :)

BOAAAAA, esse é o novo conceito para aprender.

estamos em uma nova era pessoal, vamos nos adaptar a ela. :wink:

é disso que estou falando :roll:

O seu novo conceito sobre aprendizagem se resume em seu conhecimento em lua, que por sinal é muito baixo.

Link to comment

Tremidinha, devo dizer que seu conceito não é errado. Talvez fosse realmente mais eficaz apontar onde ele errou e o porquê de ter errado. Não discordo.

Se um dia cursarem algum curso de nível superior (RooTs e você), aprenderão que, no início, códigos não se escrevem nos computadores, mas sim no papel. Se não souber debugar com a cabeça, meu amigo, não passa do primeiro semestre. Quero ajudar o garoto a começar a pensar como se deve.

Se meus tutoriais têm incomodado vocês, façamos uma trégua: eu ensino do jeito que eu prefiro, e vocês ensinam do jeito que vocês preferem. E o autor do tópico lê o que ele preferir. Tão fácil, não é mesmo?

Link to comment

StanleySathler Sei como funciona. No começo do curso você não usa uma máquina e sim papel lápis e borracha.

Outra coisa, eu não estou nenhum pouco incomodado amigo, cada um ajuda como pode e você fez sua parte, apenas dei outra alternativa ao rapaz. Agora nego já chegou fazendo texto enorme pra apenas dizer que não se aprende com código pronto. Eu aprendi, depois de várias e várias edições fui aprendendo como fazer.https://community.multitheftauto.com/index.php?p=profile&id=254298

Link to comment
  • Moderators
Agora nego já chegou fazendo texto enorme pra apenas dizer que não se aprende com código pronto. Eu aprendi, depois de várias e várias edições fui aprendendo como fazer.https://community.multitheftauto.com/index.php?p=profile&id=254298

Desculpa se fui implicante. Mas em resumo, quis dizer que o negócio é ler tutoriais e usar a prática para absolver as coisas. Olhar códigos de recursos disponíveis no community.multitheftauto.com também é algo que ajuda muito.

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