deserialize.lua 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. local import_mod = ...
  2. function import_mod.deserialize(data, mapblock_pos)
  3. local pos1 = vector.multiply(mapblock_pos, 16)
  4. local pos2 = vector.add(pos1, 15) -- inclusive
  5. local manip = minetest.get_voxel_manip()
  6. local e1, e2 = manip:read_from_map(pos1, pos2)
  7. local area = VoxelArea:new({MinEdge=e1, MaxEdge=e2})
  8. local node_data = manip:get_data()
  9. local param1 = manip:get_light_data()
  10. local param2 = manip:get_param2_data()
  11. local j = 1
  12. for z=pos1.z,pos2.z do
  13. for x=pos1.x,pos2.x do
  14. for y=pos1.y,pos2.y do
  15. local i = area:index(x,y,z)
  16. node_data[i] = data.node_ids[j]
  17. param1[i] = data.param1[j]
  18. param2[i] = data.param2[j]
  19. j = j + 1
  20. end
  21. end
  22. end
  23. manip:set_data(node_data)
  24. manip:set_light_data(param1)
  25. manip:set_param2_data(param2)
  26. manip:write_to_map(false)
  27. -- deserialize metadata
  28. if data.metadata and data.metadata.meta then
  29. for pos_str, md in pairs(data.metadata.meta) do
  30. local relative_pos = minetest.string_to_pos(pos_str)
  31. local absolute_pos = vector.add(pos1, relative_pos)
  32. minetest.get_meta(absolute_pos):from_table(md)
  33. end
  34. end
  35. -- deserialize node timers
  36. if data.metadata and data.metadata.timers then
  37. for pos_str, timer_data in pairs(data.metadata.timers) do
  38. local relative_pos = minetest.string_to_pos(pos_str)
  39. local absolute_pos = vector.add(pos1, relative_pos)
  40. minetest.get_node_timer(absolute_pos):set(timer_data.timeout, timer_data.elapsed)
  41. end
  42. end
  43. end