ITS_SELINASOON

DataStore Module

Sep 2nd, 2022 (edited)
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.41 KB | None | 0 0
  1. local RunService = game:GetService("RunService")
  2.  
  3. if RunService:IsServer() == false then error("DataStore module should be used by server.") end
  4.  
  5. local Players = game:GetService("Players")
  6. local ServerStorage = game:GetService("ServerStorage")
  7. local DataStoreService = game:GetService("DataStoreService")
  8. local PlayerDataStore = DataStoreService:GetDataStore("UserData1")
  9.  
  10. export type YIELD = {[any] : any}
  11.  
  12. local SessionData = {}
  13. local DataStoreHandler = {}
  14.  
  15. DataStoreHandler.PlayerSessionData = SessionData
  16. DataStoreHandler.StarterData = {
  17.  
  18. }
  19.  
  20. -- FUNCTION
  21.  
  22. local function GetPlayerData(userId : number) : {any}?
  23.     local success, data = pcall(PlayerDataStore.GetAsync,PlayerDataStore,userId)
  24.    
  25.     if not success then
  26.         warn(data)
  27.         local player = Players:GetPlayerByUserId(userId)
  28.        
  29.         if player then
  30.             player:Kick(data)
  31.         end
  32.        
  33.         return
  34.     end
  35.    
  36.     local isDataWiped = true
  37.    
  38.     for _,_ in pairs(data) do
  39.         isDataWiped = false
  40.         break
  41.     end
  42.    
  43.     if isDataWiped == true then
  44.         print("DATA WIPE DETECTED")
  45.         data = DataStoreHandler.StarterData
  46.     end
  47.    
  48.     data = data or DataStoreHandler.StarterData
  49.    
  50.     if not success then
  51.         warn(data)
  52.         return nil
  53.     end
  54.    
  55.     return data
  56. end
  57.  
  58. local function CommitSavePlayerData(userId : number)
  59.     local success, result = pcall(PlayerDataStore.SetAsync,PlayerDataStore,userId,SessionData[userId])
  60.    
  61.     if not success then
  62.         warn(result)
  63.     end
  64. end
  65.  
  66. local function CommitSavePlayerDataEmpty(userId : number) : boolean
  67.     local success, result = pcall(PlayerDataStore.SetAsync,PlayerDataStore,userId,{})
  68.  
  69.     if not success then
  70.         warn(result)
  71.     end
  72.    
  73.     return success
  74. end
  75.  
  76. local function PlayerAdded(player : Player)
  77.     SessionData[player.UserId] = GetPlayerData(player.UserId)
  78. end
  79.  
  80. local function PlayerRemoving(player : Player)
  81.     DataStoreHandler.SaveData(player)
  82.     SessionData[player.UserId] = nil
  83. end
  84.  
  85. local function BindToClose()
  86.     while next(SessionData) ~= nil do
  87.         RunService.Heartbeat:Wait()
  88.     end
  89. end
  90.  
  91. local function WipeDataAsync(userid : number)
  92.     local playerdata = GetPlayerData(userid)
  93.    
  94.     if playerdata then
  95.         coroutine.wrap(CommitSavePlayerDataEmpty)(userid)
  96.     end
  97. end
  98.  
  99. -- STATIC METHOD
  100.  
  101. function DataStoreHandler.WipeDataWithUserIdAsync(userid : number)
  102.     coroutine.wrap(WipeDataAsync)(userid)
  103. end
  104.  
  105. function DataStoreHandler.WipeData(player : Player)
  106.     SessionData[player.UserId] = {}
  107. end
  108.  
  109. function DataStoreHandler.GetDataAsync(userid : number) : YIELD
  110.     return GetPlayerData(userid)
  111. end
  112.  
  113. function DataStoreHandler.GetValue(player : Player, name : string) : any?
  114.     return SessionData[player.UserId][name]
  115. end
  116.  
  117. function DataStoreHandler.FindValue(player : Player,name : string) : any?
  118.     return SessionData[player.UserId][name] ~= nil and SessionData[player.UserId][name]
  119. end
  120.  
  121. function DataStoreHandler.SaveData(player : Player)
  122.     coroutine.wrap(CommitSavePlayerData)(player.UserId)
  123. end
  124.  
  125. function DataStoreHandler.CheckData(player : Player) : boolean
  126.     return SessionData[player.UserId] ~= nil
  127. end
  128.  
  129. function DataStoreHandler.WaitUntilDataLoaded(player : Player) : YIELD
  130.     while DataStoreHandler.CheckData(player) == false do
  131.         RunService.Heartbeat:Wait()
  132.     end
  133. end
  134.  
  135. function DataStoreHandler.GetData(player : Player) : any?
  136.     return SessionData[player.UserId]
  137. end
  138.  
  139. Players.PlayerAdded:Connect(PlayerAdded)
  140. Players.PlayerRemoving:Connect(PlayerRemoving)
  141.  
  142. if RunService:IsServer() then
  143.     game:BindToClose(BindToClose)
  144. end
  145.  
  146. return DataStoreHandler
  147.  
Advertisement
Add Comment
Please, Sign In to add comment