Postado Outubro 25, 2017 7 anos Esse script eu fiz para cada skill level aumentar um pouco a quantidade de mana que o player ganha. Postei apenas parte dele aqui porque ele é bem grande, segue sempre a mesma sequencia. queria saber se exite algum jeito de fazer a mesma coisa mas mais rezumido no script, porque com o script grande cada click faz o computador ler todos os códigos então vários players usando com certeza vai pesar. Não tenho ideia de como reduzir o script. Se tiver alguém bom que saiba fazer isso, ajuda ai. local mana = 100 function onUse(cid, item, frompos, item2, topos) if getPlayerSkillLevel(cid,3) >= 0 and getPlayerSkillLevel(cid,3) <= 1 then doCreatureAddMana(cid, mana/2) end if getPlayerSkillLevel(cid,3) >= 1 and getPlayerSkillLevel(cid,3) <= 2 then doCreatureAddMana(cid, mana/1.75) end if getPlayerSkillLevel(cid,3) >= 2 and getPlayerSkillLevel(cid,3) <= 3 then doCreatureAddMana(cid, mana/1.50) end if getPlayerSkillLevel(cid,3) >= 3 and getPlayerSkillLevel(cid,3) <= 4 then doCreatureAddMana(cid, mana/1.25) end end
Postado Outubro 25, 2017 7 anos local bonus = {{0, 1, 2}, {1, 2, 1.75}, {2, 3, 1.5}, {3, 4, 1.25} } function onUse(cid, item, frompos, item2, topos) for k, v in pairs(bonus) do if getPlayerSkillLevel(cid,3) >= v[1] and getPlayerSkillLevel(cid,3) <= v[2] then return doCreatureAddMana(cid, mana / v[3]) end end end
Postado Outubro 25, 2017 7 anos Solução Não tem como fazer menos se você precisa fazer algo, a menor distancia entre dois pontos é uma linha reta, então a melhor organização é usar a função mais adequada o possível, pra por exemplo, em vez de fazer duas ou três funções para um resultado, fazer uma só com a função certa(falando em funções do TFS). Nessa parte do código você já poderia ter usado elseif: Elseif pois lua não tem switch tipo o do C, algumas pessoas criam ela com caseof ou vararg, se tivessem varios elseif no código, seria melhor um function onUse(cid, item, frompos, item2, topos) if getPlayerSkillLevel(cid,3) <= 1 then doCreatureAddMana(cid, mana/2) elseif getPlayerSkillLevel(cid,3) == 1 or getPlayerSkillLevel(cid,3) == 2 then doCreatureAddMana(cid, mana/1.75) elseif getPlayerSkillLevel(cid,3) == 2 or getPlayerSkillLevel(cid,3) == 3 then doCreatureAddMana(cid, mana/1.50) elseif getPlayerSkillLevel(cid,3) == 3 or getPlayerSkillLevel(cid,3) == 4 then doCreatureAddMana(cid, mana/1.25) end end Caso tenha mais coisas no script. uma coisa que ajuda a limpar o código é criar funções, quando você vai repetir algo muitas vezes, é só usar a função em vez de escrever tudo de novo. Lua tem uma performance incrível, por isso que é bastante usada. Como não tem uma estrutura de repetição aí, não vejo notável diferença pra colocar a função getPlayerSkillLevel em uma variável local(local playerskilllevel = getPlayerSkillLevel(cid,3)), o que pode ser feito mas são poucos valores ali, mas se tivesse uma estrutura de repetição, você colocaria a função antes em uma variável. Os 3 R da reciclagem se aplicam em lua, reduza, reuse e recicle. Porém no seu caso, acho que a criação de uma formula seria melhor, mas você não poderia escolher um valor especifico para cada level. A sua formula teria que usar o getPlayerSkillLevel junto com outros valores para adicionar a mana. doCreatureAddMana(cid, (getPlayerMaxMana(cid) / 10) + (mana * ((getPlayerSkillLevel(cid,3) / alguma coisa)))) Esse é só um exemplo, não sei direito se você está usando um padrão, se quiser reduzir mesmo o script, vale a pena usar um, dá pra criar qualquer padrão, até usar alguns ifs pra isso. Essa aí do exemplo adiciona 10% da mana máxima do jogador + a mana que você colocou lá(100) * uma porcentagem do skill level ou alguma outra coisa, esse é só um exemplo. A solução pra mim então é, ou usar uma formula(aí não vai controlar os valores) ou reduzir usando uma alternativa pro switch pois a cadeia de comparação não é eficiente. Spoiler local valor local mudarmana = { [1] = function (x) valor = 2 end, [2] = function (x) valor = 1.75 end, [3] = function (x) valor = 1.50 end, [4] = function (x) valor = 1.25 end, } mudarmana[getPlayerSkillLevel(cid,3)] doCreatureAddMana(cid, mana/valor) Essa daí permite passar parâmetros no mudarmana[ ](parâmetro) por causa da função(é exemplo, tem que editar), você poderia remover pois não vai usar, mas pode usar se precisar colocar mais coisas. local valor local mudarmana = { [1] = 2, [2] = 1.75, [3] = 1.50, [4] = 1.25 } mudarmana[getPlayerSkillLevel(cid,3)] doCreatureAddMana(cid, mana/valor) Você pode repetir o mesmo valor pra 2 aí, ou então local mudarmana = { [0] = 2, [2] = 1.75, [4] = 1.50, [6] = x, } local i if (getPlayerSkillLevel(cid,3) % 2 == 0) then i = getPlayerSkillLevel(cid,3) else i = getPlayerSkillLevel(cid,3) + 1 end doCreatureAddMana(cid, mana/mudarmana[i]) Isso é pra somar um caso seja ímpar, pois não entendi muito bem, sua verificação tá meio bugada, maior ou igual a 0 ou menor ou igual a 1, seria 0 ou 1, o mesmo em seguida, 1 ou 2, então pra não repetir poderia verificar se é ímpar e somar 1, aí você só teria números pares, entãa só coloca números pares na tabela mudarmana com o valor, bom não sei se tá funcionando o script, foi só um exemplo. Tem varias outras maneiras só dar uma pesquisada, ah e a tabela ali fica fora da função onUse. Editado Outubro 25, 2017 7 anos por psychonaut (veja o histórico de edições)
Postado Outubro 26, 2017 7 anos Autor É por esse motivo que ainda acredito no TibiaKing. Explicação inteligentíssima psychonaut Gostei muito da sua resolução, e com o que agora eu sei posso usar de várias formas para reduzir varios outros scripts meus. Ta mais que reputado, parabéns e obrigado. Dúvida Sanada
Postado Outubro 26, 2017 7 anos 13 minutos atrás, koete disse: É por esse motivo que ainda acredito no TibiaKing. Explicação inteligentíssima psychonaut Gostei muito da sua resolução, e com o que agora eu sei posso usar de várias formas para reduzir varios outros scripts meus. Ta mais que reputado, parabéns e obrigado. Dúvida Sanada De boa, qualquer duvida traz aí pro fórum, tem mt mais coisa pra melhorar a performance dos scripts, mas lua no geral é bem rápida então mt gente não da atenção pra isso. Ah e se tu quiser limpar o código, da pra reduzir mais tirando o else e colocando direto o if para caso não seja par. local mudarmana = { [0] = 2, [2] = 1.75, [4] = 1.50, [6] = x, } local i = getPlayerSkillLevel(cid,3) if (i % 2 ~= 0) then i = i + 1 end doCreatureAddMana(cid, mana/mudarmana[i]) Tem a função math.fmod() também que é semelhante ao % usado antes mas um pouco melhor porque funciona com floats, só que em algumas versões antigas é só math.mod() então não passo pros outros.
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.