VI

Tabletostring E Loadtablestring

Por Vinc, 05 de jul. de 2012 em Mods, funções e outros

table
string
16
2.1k
VincV
05 de julho de 2012 às 11:11

bom essa duas funções são bem simples de entder o que elas fazem .

tabletostring comverte tabelas em strings iguais a elas(mas desordenadas pela função pairs)

loadtablestring transforma uma string de table em uma table comun

 

antes que venham pergunta ou criticar leiam as respostas abaixo

 

random noob:lord, ja n existe a função table.concat?pra que essa?

lordbug99: a funçao concat n ser pra isso,ela apenas pegas os elemtos de uma tabela e os junta numa string separados pelo sep que vc escolher ela excui os index, deixa sem as chaves(pois n fas parte da função dela),e se um dos elementos dessa tabela for uma tabela ela retorna um erro,já minha função tranforma em uma replica da tabela(com index,aceita tabelas dentro de tabelas).

 

random noob2:mas n é so usar tosting?

lordbug99:n se vc fiser isso ele vai so comverter a alocação da tabela em string(algo tipo 3xx2547)

 

 

aki vão as funções(nessesario copiar tudo),assim já ia esqucendo de fala tem mais duas funçoes de bonus(istable e isstring)

obs:obrigatoriamente tem que copiar as funções istring e istable(elas saõ usadas na tabletostring)

para adiconalas basta ir a pasta lib e em qualque um dos arquivos, apos o final adicionalas(de preferencia adicioneas no arquivo 050-functions para ficar organizado)

function tabletostring(tab)
st = "{"
k = 0
 for x,y in pairs(tab) do
 if istable(x) then
 st = st.."["..tabletostring(x).."] = "
 k =1
  elseif isstring(x) then
 st = st.."['"..x.."'] = "
 k =1
  else
 st = st.."["..x.."] = "
 k =1
  end
  if istable(y) then
 st = st..""..tabletostring(y)..","
 k =1
  elseif isstring(y) then
 st = st.."'"..y .."',"
 k =1
  else
 st = st..""..y..","
 k =1
  end
 end
 if k == 1 then
  st = st:sub(1,-2)
 end
 st = st.."}"
 return st
 end

function istable(t)
 if type(t) == "table" then
   return true
 else
   return false
 end
end

function isstring(t)
 if type(t) == "string" then
   return true
 else
   return false
 end
end

function loadstringtable(str)
if isstring(str) then
t = loadstring('return'..str)
tab = t()
return tab
end
return false						  
end
table.tostring = tabletostring
string.loadtable = loadstringtable

 

exexemplo de uso(bem simples)

function onSay(cid,words,param)
  if words:lower() == "savepos" then
 pos = getCreaturePos(cid)
 storagepos = tabletostring(pos)
 setPlayerStorageValue(cid,5754,storagepos)
 elseif words:lower() == "returnpos" then
   stroagepos = getPlayerStorageValue(cid,5754)
   pos = {}
  if isstring(storagepos) then
    pos = loadstringtable(storagepos)
	 if  pos then
	  doTeleportThing(cid, pos)
	 end
 end
  end
return true
end

 

 

obs: lembre-se quer tab.x == tab["x"] (então todos vão ficar da forma ['x'])

Editado Julho 6 por lordbug99

caoticC
05 de julho de 2012 às 11:30

Muito bom realmente teve uma boa explicaçao para tal bliblioteca pocha nem sabia que tinha essas opçoes.

 

Mais acho melhor melhorar a formataçao.

05 de julho de 2012 às 14:33

Não entendi o motivo das funções istable e isstring, visto que era só ter usado type(arg) == "string" ou type(arg) == "table".

 

Btw, parabéns pela função.

Editado Julho 5 por Demonbholder

VincV
05 de julho de 2012 às 18:55

so pra diminui mesmo,é mais rapido pra digitar.

sauhsasuahsauh

 

obs1:usei essas funções numa outra biblioteca que to fasendo,vai fica muito foda,e bem organizada(se fosse pra posta ela sem a organização ja teria postado a muito tempo)

obs2:a outra lib que citei acima tbm usara essa funções( na verdade fiz elas exatamente para isso).

eduardo190696E
06 de julho de 2012 às 01:17

não intendi muito bem o que essas funções fazem poderia me explicar de alguma outra forma ?

 

Edite - fui testa a sua função e deu esse erro

 

Tag usada

 

 <talkaction  words="savepos;returnpos" event="script" value="savepos.lua"/> 

[1:43:48.302] [Error - TalkAction Interface]
[1:43:48.304] data/talkactions/scripts/savepos.lua:onSay
[1:43:48.306] Description:
[1:43:48.308] data/talkactions/scripts/savepos.lua:3: attempt to call global 'ge
tCreaturepos' (a nil value)
[1:43:48.312] stack traceback:
[1:43:48.313]   data/talkactions/scripts/savepos.lua:3: in function <data/talkac
tions/scripts/savepos.lua:1>

[1:43:50.730] [Error - TalkAction Interface]
[1:43:50.733] data/talkactions/scripts/savepos.lua:onSay
[1:43:50.736] Description:
[1:43:50.737] data/talkactions/scripts/savepos.lua:7: attempt to call global 'ge
tCreatureStorageValue' (a nil value)
[1:43:50.741] stack traceback:
[1:43:50.742]   data/talkactions/scripts/savepos.lua:7: in function <data/talkac
tions/scripts/savepos.lua:1> 

 

Editado Julho 6 por eduardobean

06 de julho de 2012 às 12:59

não tem nada a ver com a função dele...

 

vc usou uma função errada.

 

é getPlayerStorageValue e getCreaturePosition.

VincV
06 de julho de 2012 às 13:41

na verdade o erro foi meu,eu coloquei uma letra minuscula no getCreaturePos o 'p' ta va minusculo), e o getCreaturestorageValue é que tava fasendo ums negocio pra pokemon pruncara,dae no pokemon tem essa função(que na verdade é a mesma coisa que com player).

editado la

 

obs: ele uso o script do exemplo.

Editado Julho 6 por lordbug99

06 de julho de 2012 às 16:40

ah, não tinha visto o script de exemplo.

eduardo190696E
06 de julho de 2012 às 17:16

veja se estou certo, caso eu queria criar um script para remover a que foi salvada Exemplo "cleanpos" é só remover o storage ?

VincV
06 de julho de 2012 às 19:12

Sim,so mudar pra qualquer numero ou nil(sem aspas mesmo).

 

 

A pos pode ser muda quando quiser,sem nessecidade de remover a antiga posição,ele é feito para sobre por uma nova position emcima da antiga.

07 de julho de 2012 às 01:34

tava testando aqui e a sua func não funciona com meta tabelas.

 

 

n = {i=3}
a = setmetatable({}, n)

print(tabletostring(a))

 

>> {}

 

 

n = {i=3}
a = setmetatable({}, n)

print(tabletostring(getmetatable(a)))

 

>> {['i'] = 3}

 

falo.

VincV
07 de julho de 2012 às 11:31

n tinha lenbrado de metatables,mais vo ve o que da pra fase

 

 

e a segundo eu deixei uma observação no fim tab.x é igual a tab['x'],(em meta table eu n sei,mas em tables normais é assim)

exemplo se vc usa pos['x'] vai retorna x da tabela,eu ate queria diferencia um do outro so pra fica bunitinho mais n achei nenhuma diferença entre os dois.

OneshotO
13 de julho de 2012 às 13:51

Não é querendo ser chato não, mas essas funções já existem e se chamam table.serialize e table.unserialize.

 

Um grande abraço.

13 de julho de 2012 às 20:04

Mas não é uma função que existe em lua pura...

Editado Julho 13 por Demonbholder

OneshotO
14 de julho de 2012 às 12:11

Sim, não são nativas da linguagem Lua, mas existem nas bibliotecas de praticamente qualquer servidor atual.

 

Observação: Notei que você adora me contrariar em tudo rsrs.

Editado Julho 14 por Oneshot