Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local datastoreService = game:GetService("DataStoreService")
- local datastore = datastoreService:GetDataStore("PlayerData")
- local players = game.Players
- local module = {}
- local timeSinceLeft = {}
- module.PlayerData = {}
- module.TempPlayerData = {}
- module.Datastore = datastore
- module.Save = function(id, data)
- local tries = 0
- local success, err = false, ""
- while tries < 10 do--retries for failed saves
- success, err = pcall(function()
- datastore:SetAsync(id, data)
- end)
- if not success then
- tries += 1
- wait(1)
- else
- break
- end
- end
- end
- module.SaveData = function(player : Player)
- module.Save(player.UserId, module.PlayerData[player.UserId].SaveData)
- end
- --function to force create new key even if it already exist (good for overwriting)
- module.CreateKey = function(parent, key, value)
- parent[key] = value
- return parent[key]
- end
- --function to only create key if it doesnt already exist (good when you dont want to overwrite)
- module.TryCreateKey = function(parent, key, value)
- if parent[key] == nil then
- parent[key] = value
- end
- return parent[key]
- end
- module.Load = function(id)
- local tries = 0
- local data
- while tries < 10 do--retries for failed loading
- local success, err = pcall(function()
- data = datastore:GetAsync(id)
- end)
- if not success then
- tries += 1
- wait(1)
- else
- break
- end
- end
- return data
- end
- module.LoadData = function(player : Player)
- return module.Load(player.UserId)
- end
- module.RemoveKey = function(parent, key)
- parent[key] = nil
- end
- module.Init = function()
- players.PlayerAdded:Connect(function(player)
- if module.PlayerData[player.UserId] and (os.time() - timeSinceLeft[player.UserId]) < 60 then--returns data already inside, used when they do a quick rejoin
- local data = module.PlayerData[player.UserId].SaveData
- if typeof(data.Banned) == "string" and #data.Banned > 1 then
- player:Kick("You are banned")
- end
- return
- end --dont load whats already in module
- local data = module.LoadData(player)
- if data == nil then--fresh player, creates new data
- local playerData = module.CreateKey(module.PlayerData, player.UserId,{})
- module.CreateKey(playerData,"SaveData", {})
- module.CreateKey(playerData, "TempData", {})
- else
- if typeof(data.Banned) == "string"and #data.Banned > 1 then player:Kick("You are banned") return end
- local playerData = module.CreateKey(module.PlayerData, player.UserId,{})
- module.CreateKey(playerData,"SaveData", data)
- module.CreateKey(playerData, "TempData", {})
- end
- end)
- players.PlayerRemoving:Connect(function(player)
- timeSinceLeft[player.UserId] = os.time()
- module.SaveData(player)
- end)
- game:BindToClose(function()
- for _, player in pairs(players:GetPlayers()) do
- module.SaveData(player)
- end
- end)
- end
- return module
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement