Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --Services
- local DataStoreService = game:GetService("DataStoreService")
- local Players = game:GetService("Players")
- --Services
- --Require
- local Event = require(game.ReplicatedStorage.GenericModules.Event)
- --Require
- --Declarations
- local datastore = DataStoreService:GetGlobalDataStore()
- local bannedPlayersStore = DataStoreService:GetDataStore("BannedPlayers")
- --Declarations
- local Data =
- {
- NewPlayerData = Event.new();
- PlayerDataLoaded = Event.new();
- UnloadingPlayerData = Event.new();
- }
- setmetatable(Data,
- {
- __index = function(key)
- pcall(function()
- local data = DataStoreService:GetDataStore(key)
- Data[key] = data
- return data
- end)
- end
- })
- local function ToPlayerId(playerOrId)
- if type(playerOrId) ~= "number" then
- if typeof(playerOrId) == "Instance" then
- if playerOrId.ClassName == "Player" then
- return playerOrId.UserId
- end
- end
- error("Expected Player instance or id, got " .. typeof(playerOrId))
- else
- return playerOrId
- end
- end
- function Data:WipePlayerData(player)
- datastore:RemoveAsync(ToPlayerId(player))
- end
- function Data:BanPlayer(player, dontKick)
- bannedPlayersStore:SetAsync(ToPlayerId(player), true)
- if not dontKick and typeof(player) == "Instance" then
- player:Kick(" ")
- end
- end
- function Data:UnbanPlayer(player)
- bannedPlayersStore:RemoveAsync(ToPlayerId(player))
- end
- --Connections
- local function PlayerAdded(player)
- local data
- if not pcall(function()
- data = datastore:GetAsync(player.UserId)
- end) then
- player:Kick("Your data failed to load. :/")
- end
- if not data then
- data = {}
- Data.NewPlayerData:Fire(player, data)
- end
- Data.PlayerDataLoaded:Fire(player, data)
- Data[player] = data
- local banned
- if not pcall(function()
- banned = bannedPlayersStore:GetAsync(player.UserId)
- end) then
- player:Kick("Your data failed to load. :/")
- elseif banned then
- player:Kick(" ")
- end
- end
- Players.PlayerAdded:Connect(PlayerAdded)
- for k, player in pairs(Players:GetPlayers()) do
- PlayerAdded(player)
- end
- function PlayerRemoving(player)
- local data = Data[player]
- Data.UnloadingPlayerData:Fire(player, data)
- datastore:SetAsync(player.UserId, data)
- Data[player] = nil
- end
- Players.PlayerRemoving:Connect(PlayerRemoving)
- --Connections
- return Data
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement