datastorage.lua 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. datastorage={}
  2. datastorage["!registered_players"]={}
  3. datastorage.save_data = function(table_pointer)
  4. local data = minetest.serialize( datastorage[table_pointer] )
  5. local path = minetest.get_worldpath().."/datastorage_"..table_pointer..".data"
  6. local file = io.open( path, "w" )
  7. if( file ) then
  8. file:write( data )
  9. file:close()
  10. return true
  11. else return nil
  12. end
  13. end
  14. datastorage.load_data = function(table_pointer)
  15. local path = minetest.get_worldpath().."/datastorage_"..table_pointer..".data"
  16. local file = io.open( path, "r" )
  17. if( file ) then
  18. local data = file:read("*all")
  19. datastorage[table_pointer] = minetest.deserialize( data )
  20. file:close()
  21. return true
  22. else return nil
  23. end
  24. end
  25. datastorage.get_container = function (player, key)
  26. local player_name = player:get_player_name()
  27. local container = datastorage[player_name]
  28. if container[key] == nil then
  29. container[key] = {}
  30. end
  31. datastorage.save_data(player_name)
  32. return container[key]
  33. end
  34. -- forced save of all player's data
  35. datastorage.save_container = function (player)
  36. local player_name = player:get_player_name()
  37. datastorage.save_data(player_name)
  38. end
  39. -- Init
  40. if datastorage.load_data("!registered_players") == nil then
  41. datastorage["!registered_players"]={}
  42. datastorage.save_data("!registered_players")
  43. end
  44. minetest.register_on_joinplayer(function(player)
  45. local player_name = player:get_player_name()
  46. local registered = nil
  47. for __,tab in ipairs(datastorage["!registered_players"]) do
  48. if tab["player_name"] == player_name then registered = true break end
  49. end
  50. if registered == nil then
  51. local new={}
  52. new["player_name"]=player_name
  53. table.insert(datastorage["!registered_players"],new)
  54. datastorage[player_name]={}
  55. datastorage.save_data("!registered_players")
  56. datastorage.save_data(player_name)
  57. else
  58. datastorage.load_data(player_name)
  59. end
  60. end
  61. )
  62. minetest.register_on_leaveplayer(function(player)
  63. local player_name = player:get_player_name()
  64. datastorage.save_data(player_name)
  65. datastorage[player_name] = nil
  66. end
  67. )
  68. minetest.register_on_shutdown(function()
  69. for __,tab in ipairs(datastorage["!registered_players"]) do
  70. if datastorage[tab["player_name"]] == nil then break end
  71. datastorage.save_data(tab["player_name"])
  72. end
  73. end
  74. )