Ir para conteúdo

Featured Replies

Postado

Pensei em fazer esta função há um tempo. Alguns membros, que também programam, tentaram desenvolve-la quando comentei sobre ela em um grupo do skype.

math.round reconhece, automaticamente, se o número é um inteiro ou decimal e o arredonda para cima ou para baixo, seguindo a condição >= ou < do que 5, respectivamente.
Eu preferi fazer para que o arredondamento sempre resulte em um inteiro não-negativo e não-nulo. Ao meu ver, a função tem mais utilidade desse modo e, já que o resultado de n segue essa regra, não é possível utilizar números negativos ou nulos. Se utilizados, nil é retornado.

Sem mais delongas, adicione a qualquer arquivo com extensão Lua da library do seu servidor (data\lib):

math.round = function (n) -- Developed by Wise ~ TibiaKing.com
    if not tonumber(n) or n < 1 then return nil end
    
    n = tostring(n)
    local d = string.format('%.1f', n)
    
    if n:find('%.') then
        n = tonumber(string.explode(d, '.')[2]) > 4 and math.round(math.ceil(tonumber(d))) or math.round(math.floor(tonumber(d)))
    else
        local r = tonumber(n:sub(n:len()))
        n = tonumber(n)
        n = n > 10 and (r > 4 and n + (10 - r) or n - r) or (n > 4 and 10 or 1)
    end
    
    return n
end





Mas, quando e como ela seria útil?

t = {10, 30, 50, 70, 90}
if isInArray(t, math.round(getPlayerStorageValue(cid, storage))) then
    block
end

Por exemplo, temos uma tabela com n elementos.
Os n elementos são números inteiros não-negativos e não-nulos, e um creatureid recebe values em quantidades decimais ou simplesmente aleatórios, dos quais serão arredondados pela função, formando um value "final". Se esse value estiver incluso na tabela, então executará um bloco..etc.


Há inúmeras possibilidades, use a sua criatividade..mentalize.




Saiba também que, para executar a função de arredondamento, é necessário ter a função string.explode:

string.explode = function (str, separator)
    local ret = {}
    str = tostring(str) .. separator
    
    local sep
    for a = 1, #str do
        if not sep then
            sep = a
        end
        
            for b = a, #str do
                if a ~= 1 and str:sub(a, b) == separator then
                    table.insert(ret, str:sub(sep, b - 1))
                    sep = nil
                end
            end
    end
    
    return ret
end

No caso, essa função acima não é a própria para o Open Tibia, portanto, pode ser utilizada em qualquer ambiente que tenha Lua como linguagem.

Abraços.

The corrupt fear us.

The honest support us.

The heroic join us.

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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo