Advertisement
world_killer

Datastore setup

Sep 13th, 2023 (edited)
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.84 KB | Source Code | 0 0
  1. local datastoreService = game:GetService("DataStoreService")
  2. local datastore = datastoreService:GetDataStore("PlayerData")
  3. local players = game.Players
  4.  
  5. local module = {}
  6. local timeSinceLeft = {}
  7.  
  8. module.PlayerData = {}
  9. module.TempPlayerData = {}
  10. module.Datastore = datastore
  11.  
  12. module.Save = function(id, data)
  13.     local tries = 0
  14.     local success, err = false, ""
  15.  
  16.     while tries < 10 do--retries for failed saves
  17.         success, err = pcall(function()
  18.             datastore:SetAsync(id, data)
  19.         end)
  20.  
  21.         if not success then
  22.             tries += 1
  23.             wait(1)
  24.         else
  25.             break
  26.         end
  27.     end
  28. end
  29.  
  30. module.SaveData = function(player : Player)
  31.     module.Save(player.UserId, module.PlayerData[player.UserId].SaveData)
  32. end
  33.  
  34. --function to force create new key even if it already exist (good for overwriting)
  35. module.CreateKey = function(parent, key, value)
  36.     parent[key] = value
  37.     return parent[key]
  38. end
  39.  
  40. --function to only create key if it doesnt already exist (good when you dont want to overwrite)
  41. module.TryCreateKey = function(parent, key, value)
  42.     if parent[key] == nil then
  43.         parent[key] = value
  44.     end
  45.  
  46.     return parent[key]
  47. end
  48.  
  49. module.Load = function(id)
  50.     local tries = 0
  51.     local data
  52.  
  53.     while tries < 10 do--retries for failed loading
  54.         local success, err = pcall(function()
  55.             data = datastore:GetAsync(id)
  56.         end)
  57.  
  58.         if not success then
  59.             tries += 1
  60.             wait(1)
  61.         else
  62.             break
  63.         end
  64.     end
  65.  
  66.     return data
  67. end
  68.  
  69. module.LoadData = function(player : Player)
  70.     return module.Load(player.UserId)
  71. end
  72.  
  73. module.RemoveKey = function(parent, key)
  74.     parent[key] = nil
  75. end
  76.  
  77. module.Init = function()
  78.     players.PlayerAdded:Connect(function(player)
  79.         if module.PlayerData[player.UserId] and (os.time() - timeSinceLeft[player.UserId]) < 60 then--returns data already inside, used when they do a quick rejoin
  80.             local data = module.PlayerData[player.UserId].SaveData
  81.             if typeof(data.Banned) == "string" and #data.Banned > 1 then
  82.                 player:Kick("You are banned")
  83.             end
  84.             return
  85.         end --dont load whats already in module
  86.         local data = module.LoadData(player)
  87.        
  88.         if data == nil then--fresh player, creates new data
  89.             local playerData = module.CreateKey(module.PlayerData, player.UserId,{})
  90.             module.CreateKey(playerData,"SaveData", {})
  91.             module.CreateKey(playerData, "TempData", {})
  92.         else
  93.             if typeof(data.Banned) == "string"and #data.Banned > 1 then player:Kick("You are banned") return end
  94.            
  95.             local playerData = module.CreateKey(module.PlayerData, player.UserId,{})
  96.             module.CreateKey(playerData,"SaveData", data)
  97.             module.CreateKey(playerData, "TempData", {})
  98.         end
  99.        
  100.     end)
  101.    
  102.     players.PlayerRemoving:Connect(function(player)
  103.         timeSinceLeft[player.UserId] = os.time()
  104.         module.SaveData(player)
  105.     end)
  106.    
  107.     game:BindToClose(function()
  108.         for _, player in pairs(players:GetPlayers()) do
  109.             module.SaveData(player)
  110.         end
  111.     end)
  112. end
  113.  
  114. return module
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement