Advertisement
DanielSiqueira

Mah DataScript

Dec 6th, 2019
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.23 KB | None | 0 0
  1. local module = {}
  2. module.__index = module
  3.  
  4. local RunService = game:GetService('RunService')
  5. local DataStoreService = game:GetService('DataStoreService')
  6.  
  7. local InternalSignals = script:WaitForChild('InternalSignals')
  8. local DataSignals = script:FindFirstChild('DataSignals') or Instance.new('Folder',script,{Name='DataSignals'})
  9.  
  10. if RunService:IsServer() then
  11.    
  12.     local MaxData = {
  13.        
  14.         Level = 300;
  15.        
  16.         }
  17.    
  18.     local StarterData = function(dataType)
  19.        
  20.         local data = {}
  21.        
  22.         if dataType == 'PlayerLoadData' then
  23.            
  24.             data = {
  25.                
  26.                 CharacterOutfit = {};
  27.                
  28.                 }
  29.            
  30.         elseif dataType == 'GameData' then
  31.            
  32.             data = {
  33.            
  34.             Level = 1;
  35.             Experience = 0;
  36.             Yen = 0;
  37.             Inventory = {};
  38.            
  39.             }
  40.            
  41.         end
  42.        
  43.         return data
  44.        
  45.     end
  46.    
  47.     local function reviewDataStructure(data,dataType)
  48.         for index,value in pairs(StarterData(dataType)) do
  49.             if data[index] == nil then
  50.                 data[index] = value
  51.             end
  52.         end
  53.     end
  54.    
  55.     local function DataStore(DataType)
  56.        
  57.         return DataStoreService:GetDataStore(DataType)
  58.        
  59.     end
  60.    
  61.    
  62.     -- [[ VARIABLES ]] --
  63.    
  64.     local LoadedPlayers = {}
  65.    
  66.     local ServerStorage = game:GetService('ServerStorage')
  67.     local Modules = ServerStorage:WaitForChild('Modules')
  68.  
  69.     local TextCompressor = Modules:WaitForChild('TextCompressor')
  70.     local HttpService = game:GetService('HttpService')
  71.    
  72.     -- [[ - ]] --
  73.    
  74.     function module.loadData(player,dataType)
  75.        
  76.         assert(player:IsA('Player'),'Given player is not valid')
  77.        
  78.         if LoadedPlayers[player.UserId] then return LoadedPlayers[player.UserId] end
  79.        
  80.         local Data = TextCompressor:Decompress(DataStore(dataType or 'GameData'):GetAsync(player.UserId)) or StarterData(dataType or 'GameData')
  81.        
  82.         if typeof(Data) == 'string' then
  83.            
  84.             Data = HttpService:JSONDecode(Data)
  85.            
  86.         end
  87.        
  88.         reviewDataStructure(Data)
  89.         Data.ID = player.UserId
  90.         Data.DataType = dataType or 'GameData'
  91.        
  92.         LoadedPlayers[player.UserId] = Data
  93.        
  94.         return setmetatable(Data,module)
  95.        
  96.     end
  97.    
  98.     function module:Change(keys,newValue)
  99.        
  100.         local dataPath = #keys == 1 and self or nil
  101.        
  102.         for i=1,#keys-1 do
  103.             dataPath = dataPath and dataPath[keys[i]] or self[keys[i]]
  104.         end
  105.    
  106.         local oldValue = dataPath[keys[#keys]]
  107.  
  108.         if MaxData[keys[#keys]] then
  109.             if newValue > MaxData[keys[#keys]] then return end
  110.         end
  111.  
  112.         dataPath[keys[#keys]] = newValue
  113.    
  114.         if DataSignals['DataEvent-'..keys[#keys]] then
  115.             DataSignals['DataEvent-'..keys[#keys]]:FireClient(game.Players:GetPlayerByUserId(self.ID),{newValue=newValue,oldValue=oldValue,maxValue = MaxData[keys[#keys]] or nil})
  116.         end
  117.        
  118.     end
  119.  
  120.     function module:Add(keys,key,newValue,forceChange)
  121.        
  122.         forceChange = forceChange or false
  123.        
  124.         local dataPath = #keys == 1 and self or nil
  125.        
  126.         for i=1,#keys-1 do
  127.             dataPath = dataPath and dataPath[keys[i]] or self[keys[i]]
  128.         end
  129.    
  130.         local oldValue = dataPath[keys[#keys]][key]
  131.  
  132.         if typeof(oldValue) ~= 'table' then return end
  133.  
  134.         if typeof(newValue) == 'number' then
  135.             dataPath[keys[#keys]][key] = dataPath[keys[#keys]][key] == nil and newValue or not forceChange and dataPath[keys[#keys]][key] + newValue or newValue
  136.         else
  137.             dataPath[keys[#keys]][key] = newValue
  138.         end
  139.  
  140.         newValue = dataPath[keys[#keys]][key]
  141.  
  142.         if DataSignals['DataEvent-'..keys[#keys]..'Added'] then
  143.             DataSignals['DataEvent-'..keys[#keys]..'Added']:FireClient(game.Players:GetPlayerByUserId(self.ID),{newValue=newValue,oldValue=oldValue})
  144.         end
  145.  
  146.     end
  147.  
  148.     function module:Save()
  149.    
  150.         local dataToSave = TextCompressor:Compress(HttpService:JSONEncode(self))
  151.        
  152.         if self.DataType == 'GuildData' or self.DataType == 'PlayerLoadData' then
  153.             DataStore(self.DataType or 'GameData'):UpdateAsync(self.ID,function(old)
  154.                 local dataSave = dataToSave or old
  155.                 return dataSave
  156.             end)
  157.         elseif self.DataType == 'GameData' then
  158.             DataStore(self.DataType or 'GameData'):UpdateAsync(self.ID,function(old)
  159.                 local dataSave
  160.                 local oldValue = old and HttpService:JSONDecode(TextCompressor:Decompress(old)) or nil
  161.                 if oldValue then
  162.                     print('Verifying data...')
  163.                     if self.Level > oldValue.Level then
  164.                         dataSave = dataToSave
  165.                     elseif self.Level < oldValue.Level then
  166.                         dataSave = old
  167.                     elseif self.Level == oldValue.Level then
  168.                         if self.Experience > oldValue.Experience then
  169.                             dataSave = dataToSave
  170.                         elseif self.Experience > oldValue.Experience then
  171.                             dataSave = old
  172.                         elseif self.Experience == oldValue.Experience then
  173.                             dataSave = dataToSave
  174.                         end
  175.                     end
  176.                 else
  177.                     dataSave = dataToSave
  178.                 end
  179.                 print('Saving '..self.ID..' data...',TextCompressor:Decompress(dataSave))
  180.                 return dataSave
  181.             end)
  182.         end
  183.        
  184.         LoadedPlayers[self.ID] = nil
  185.         self = nil
  186.        
  187.     end
  188.    
  189.     function module:Delete()
  190.        
  191.         local success, val = pcall(function()
  192.             return DataStore(self.DataType or 'GameData'):RemoveAsync(self.ID)
  193.         end)
  194.            
  195.         if success == true then
  196.             self = nil
  197.         end
  198.        
  199.     end
  200.        
  201.        
  202. elseif RunService:IsClient() then
  203.        
  204.     function module.listen(eventKey,func)
  205.        
  206.         local listenerKey = 'EventListener-'..eventKey
  207.        
  208.         if DataSignals:FindFirstChild(listenerKey) then
  209.            
  210.             DataSignals[listenerKey].OnClientEvent:Connect(func)
  211.            
  212.         else
  213.            
  214.            
  215.            
  216.         end
  217.        
  218.     end
  219.    
  220. end
  221.  
  222. return module
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement