Advertisement
immibis

nbt

Feb 21st, 2013
1,045
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.08 KB | None | 0 0
  1. local function nbtToTable(typ, val)
  2.     if typ == "compound" then
  3.         local rv = {}
  4.         for _, key in ipairs(val.getKeys()) do
  5.             local typ2, val2 = val.getValue(key)
  6.             rv[key] = nbtToTable(typ2, val2)
  7.         end
  8.         return {type="compound", value=rv}
  9.     elseif typ == "list" then
  10.         local n = val.getSize()
  11.         local rv = {}
  12.         for k = 0, n - 1 do
  13.             local typ2, val2 = val.get(k)
  14.             rv[k+1] = nbtToTable(typ2, val2)
  15.         end
  16.         return {type="list", value=rv}
  17.     elseif typ == "string" or typ == "double" or typ == "float" or typ == "byte" or typ == "short" or typ == "int" or typ == "long" then
  18.         return {type=typ, value=val}
  19.     elseif typ == "intArray" or typ == "byteArray" then
  20.         local rv = {}
  21.         for k = 0, val.getLength() - 1 do
  22.             rv[k+1] = val.get(k)
  23.         end
  24.         return {type=typ, value=rv}
  25.     else
  26.         error("unimplemented tag type: "..typ)
  27.     end
  28. end
  29.  
  30. local function tableToNbt(typ, tag, tbl)
  31.     assert(type(tag) == "table" and tbl.type == typ and tag.getType() == typ)
  32.     if typ == "compound" then
  33.         for _, key in ipairs(tag.getKeys()) do
  34.             if not tbl.value[key] then
  35.                 tag.remove(key)
  36.             end
  37.         end
  38.         for key, value in pairs(tbl.value) do
  39.             if value.type == "compound" or value.type == "list" then
  40.                 tag.setValue(key, value.type)
  41.                 tableToNbt(value.type, select(2, tag.getValue(key)), value)
  42.             elseif value.type == "intArray" or value.type == "byteArray" then
  43.                 tag.setValue(key, value.type, #value.value)
  44.                 tableToNbt(value.type, select(2, tag.getValue(key)), value)
  45.             elseif value.type == "string" or value.type == "double" or value.type == "float" or value.type == "byte" or value.type == "short" or value.type == "int" then
  46.                 tag.setValue(key, value.type, value.value)
  47.             elseif value.type == "long" then
  48.                 tag.setValue(key, value.type, value.value[1], value.value[2])
  49.             else
  50.                 error("unimplemented tag type: "..value.type)
  51.             end
  52.         end
  53.     elseif typ == "list" then
  54.         while tag.getSize() > 0 do
  55.             tag.remove(0)
  56.         end
  57.         for _, value in ipairs(tbl.value) do
  58.             if value.type == "compound" or value.type == "list" then
  59.                 tag.add(tag.getSize(), value.type)
  60.                 tableToNbt(value.type, select(2, tag.get(tag.getSize() - 1)), value)
  61.             elseif value.type == "intArray" or value.type == "byteArray" then
  62.                 tag.add(tag.getSize(), value.type, #value.value)
  63.                 tableToNbt(value.type, select(2, tag.get(tag.getSize() - 1)), value)
  64.             elseif value.type == "string" or value.type == "double" or value.type == "float" or value.type == "byte" or value.type == "short" or value.type == "int" then
  65.                 tag.add(tag.getSize(), value.type, value.value)
  66.             elseif value.type == "long" then
  67.                 tag.add(tag.getSize(), value.type, value.value[1], value.value[2])
  68.             else
  69.                 error("unimplemented tag type: "..value.type)
  70.             end
  71.         end
  72.     elseif typ == "intArray" or typ == "byteArray" then
  73.         for k = 0, tag.getLength() - 1 do
  74.             tag.set(k, tbl.value[k+1])
  75.         end
  76.     else
  77.         error("unimplemented tag type: "..typ)
  78.     end
  79. end
  80.  
  81. function readTileNBT(te)
  82.     te.readNBT()
  83.     return nbtToTable("compound", te.getNBT())
  84. end
  85.  
  86. function writeTileNBT(te, nbt)
  87.     tableToNbt("compound", te.getNBT(), nbt)
  88.     te.writeNBT()
  89. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement