Reggae Posted August 14, 2015 Share Posted August 14, 2015 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
Stanley Sathler Posted August 15, 2015 Share Posted August 15, 2015 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
Tremidinha Posted August 17, 2015 Share Posted August 17, 2015 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. Link to comment
#RooTs Posted August 18, 2015 Share Posted August 18, 2015 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 Link to comment
Stanley Sathler Posted August 18, 2015 Share Posted August 18, 2015 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
n3wage Posted August 18, 2015 Share Posted August 18, 2015 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' 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
DNL291 Posted August 18, 2015 Share Posted August 18, 2015 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
Tremidinha Posted August 18, 2015 Share Posted August 18, 2015 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
#RooTs Posted August 18, 2015 Share Posted August 18, 2015 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. é disso que estou falando Link to comment
Besta Posted August 18, 2015 Share Posted August 18, 2015 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. é disso que estou falando O seu novo conceito sobre aprendizagem se resume em seu conhecimento em lua, que por sinal é muito baixo. Link to comment
Stanley Sathler Posted August 18, 2015 Share Posted August 18, 2015 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
Tremidinha Posted August 18, 2015 Share Posted August 18, 2015 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
DNL291 Posted August 19, 2015 Share Posted August 19, 2015 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
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