Ir para conteúdo
Entre para seguir isso  
Killua

Armazenar Tabelas em Storages (setGlobalTableStorage)

Recommended Posts

Killua    11
Killua

Introdução:

Esses dias eu estava fazendo um sistema e senti a necessidade de armazenar várias informações (por player) em um só lugar. Porém, todos nós sabemos que não é possível colocar uma tabela como valor de um storage. Por conta disso, decidi tornar possível esse armazenamento.

Tenho certeza de que essa biblioteca será uma ferramenta extremamente útil para todos os scripters. Ela abre muitas portas e vai permitir a criação de muitos sistemas interessantes.

Instalação:

Simplesmente crie o arquivo tableStorage.lua em data/lib e coloque esse código:

 

-- Biblioteca de funçoes feitas por Vitor Bertolucci (Killua)
-- Funçoes para armazenamento de tabelas em storages

killua_functions = {

    filtrateString = function(str) -- By Killua
        local tb, x, old, last = {}, 0, 0, 0
        local first, second, final = 0, 0, 0
        if type(str) ~= "string" then
            return tb
        end
        for i = 2, #str-1 do
            if string.byte(str:sub(i,i)) == string.byte(':') then
                x, second, last = x+1, i-1, i+2
                for t = last,#str-1 do
                    if string.byte(str:sub(t,t)) == string.byte(',') then
                        first = x == 1 and 2 or old
                        old, final = t+2, t-1
                        local index, var = str:sub(first,second), str:sub(last,final)
                        tb[tonumber(index) or tostring(index)] = tonumber(var) or tostring(var)
                        break
                    end
                end
            end
        end
        return tb
    end,

    translateIntoString = function(tb) -- By Killua
        local str = ""
        if type(tb) ~= "table" then
            return str
        end
        for i, t in pairs(tb) do
            str = str..i..": "..t..", "
        end
        str = "a"..str.."a"
        return tostring(str)
    end
}

function setPlayerTableStorage(cid, key, value)
    return doPlayerSetStorageValue(cid, key, killua_functions.translateIntoString(value))
end

function getPlayerTableStorage(cid, key)
    return killua_functions.filtrateString(getPlayerStorageValue(cid, key))
end

function setGlobalTableStorage(key, value)
    return setGlobalStorageValue(key, killua_functions.translateIntoString(value))
end

function getGlobalTableStorage(key)
    return killua_functions.filtrateString(getGlobalStorageValue(key))
end

 



Utilização: 

Para armazenar uma tabela em um storage de um player, use:

setPlayerTableStorage(cid, key, tabela)

Exemplo:

setPlayerTableStorage(cid, 199991, {["primeiro"] = 4, [8] = "Killua", [3] = 22})

Para armazenar uma tabela em um storage global, use:

setGlobalTableStorage(key, tabela)

Exemplo:

setGlobalStorageValue(123412, {1, 55, "c", 3})

Para retornar as tabelas, use:

getGlobalTableStorage(key)

ou

getPlayerTableStorage(cid, key)

Esclarecimento:

As tabelas retornadas pelas funções getGlobalTableStorage e getPlayerTableStorage são tabelas normais e podem ser manipuladas como qualquer outra, por exemplo:

for t, k in pairs(getPlayerTableStorage(cid, 123444)) do
      print("["..t.."] "..v) 
end

Observações:

As tabelas não armazenam valores booleanos, outras tabelas e nem funções, apenas strings e números. No entanto é claro que ela pode armazenar valores recebidos de funções, por exemplo:

setPlayerTableStorage(cid, 17271, {["level"] = getPlayerLevel(cid), ["sex"] = getPlayerSex(cid) == 1 and "female" or "male"})

Funcionará perfeitamente.

Mas:

setPlayerTableStorage(cid, 17271, {returnDouble = function(value) return value*2 end, try = 11, [2] = 10})

Não irá funcionar.

As tabelas podem ser preenchidas com ou sem index definido, de forma que os não definidos serão definidos automaticamente numa sequencia (Como qualquer tabela). Sendo assim:

setPlayerTableStorage(cid, 12344, {1,3,23,1999,"test"})
setPlayerTableStorage(cid, 12344, {[5] = "hi", ["mia"] = 32, c = 18})
setPlayerTableStorage(cid, 12344, {1, "c", 6, ["test"] = 18, b = "c", "hello world"})

São todas válidas.

 

Cuidado com com tabelas muito grandes! Elas podem acabar pesando bastante e consumindo bastante de sua database. Eu aconselho não ultrapassar 4 elementos. É claro que apenas um storage com uma tabela bem grande não vai causar problema mas, em um servidor com muitos jogadores, pode ser perigoso adicionar muitas tabelas grandes (1 por jogador).


Considerações:

Eu realmente acho que essa biblioteca vai abrir várias possibilidades para todos vocês, scripters. E espero que criem muitos sistemas legais a partir dela. Se tiverem dúvidas ou sugestões, podem dizer.

Abraços.

Editado por Killua

Compartilhar este post


Link para o post
Elwyn    106
Elwyn

Só por curiosidade, porquê adicionar "a" no começo e final de str?

Compartilhar este post


Link para o post
Killua    11
Killua

Tinha sido pra evitar um problema que eu tive com os types. Agora nem lembro mais qual tinha sido o problema exatamente, mas ele já tá resolvido. O as "a"s não são mais necessários, só fiquei com preguiça de tirar.

Compartilhar este post


Link para o post
Convidado Avuenja   
Convidado Avuenja

Muito bom Killua! >.<

Gostei de ver... Realmente muito útil! :3

Obrigado por partilhar conosco.

Compartilhar este post


Link para o post
Lordfire    110
Lordfire

Isso seria algo parecido com a função "serialize" do PHP, meio que transforma qualquer coisa em uma string? Se for, sugiro que tu dê uma olhada em funções assim e de transformar em JSON pra otimizar teu script :P

Compartilhar este post


Link para o post
Killua    11
Killua

Não Manjo PHP, mas é isso mesmo: transforma tabela em string e vice-versa. Vou dar uma procurada sim, vlw :)

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×