Advertisement
DanielSiqueira

Untitled

Dec 22nd, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.51 KB | None | 0 0
  1. local Service = {}
  2. Service.__index = Service
  3.  
  4. local DataStoreService = game:GetService('DataStoreService')
  5. local RunService = game:GetService('RunService')
  6. local maxData = {Level=60}
  7.  
  8. local dataSignals = game:GetService('ReplicatedStorage'):WaitForChild('GameExtras'):WaitForChild('DataSignals')
  9. local InternalSignals = script:WaitForChild('InternSignals')
  10.  
  11. if RunService:IsServer() then
  12.  
  13.     shared.PlayerDataStore = DataStoreService:GetDataStore('[TEST]-PlayerDataStore-9')
  14.     shared.GuildDataStore = DataStoreService:GetDataStore('[TEST]-GuildDataStore-1')
  15.    
  16.     local TextCompressor = require(script:WaitForChild('TextCompressor'))
  17.     local HttpService = game:GetService('HttpService')
  18.     local dataSignals = game:GetService('ReplicatedStorage'):WaitForChild('GameExtras'):WaitForChild('DataSignals')
  19.    
  20.     local dataTable = {}
  21.    
  22.     local function starterData()
  23.         local starterData = {Level=1;Experience=0;Gold=0;Silver=0;Class='none';Inventory={};Guild={ID=0;Name='none';Rank={PermissionLevel=0;Name='none'}}}
  24.         return starterData
  25.     end
  26.    
  27.     local function newGuildPlayer(PlayerName,PermissionLevel,RankName)
  28.         local newPlayer = {Name=PlayerName;Rank={PermissionLevel=PermissionLevel or 0;Name=RankName or 'Recruit'}}
  29.         return newPlayer
  30.     end
  31.    
  32.     local function reviewDataStructure(data)
  33.         for index,value in pairs(starterData()) do
  34.             if data[index] == nil then
  35.                 data[index] = value
  36.             end
  37.         end
  38.     end
  39.    
  40.     function Service.getPlayer(player)
  41.        
  42.         assert(player:IsA('Player'),'Player not valid')
  43.        
  44.         local playerData = dataTable[player.UserId] or TextCompressor:Decompress(shared.PlayerDataStore:GetAsync(player.UserId)) or starterData();
  45.         if typeof(playerData) == 'string' then
  46.             playerData = HttpService:JSONDecode(playerData)
  47.         end
  48.        
  49.         playerData.DataType = 'PlayerData'
  50.         playerData.ID = player.UserId
  51.        
  52.         reviewDataStructure(playerData)
  53.        
  54.         dataTable[player.UserId] = playerData
  55.        
  56.         return setmetatable(playerData,Service)
  57.        
  58.     end
  59.    
  60.     function Service.getPlayerByUserId(userId)
  61.        
  62.         local player = game:GetService('Players'):GetPlayerByUserId(userId)
  63.        
  64.         assert(player,'UserId not valid')
  65.        
  66.         local playerData = dataTable[userId] or HttpService:JSONDecode(TextCompressor:Decompress(shared.PlayerDataStore:GetAsync(userId))) or starterData();
  67.        
  68.         player.DataType = 'PlayerData'
  69.         player.ID = userId
  70.        
  71.         reviewDataStructure(playerData)
  72.        
  73.         dataTable[userId] = playerData
  74.        
  75.         return setmetatable(playerData,Service)
  76.        
  77.     end
  78.    
  79.     function Service.createGuild(guildName,guildOwner)
  80.        
  81.         local guildData = {Name=guildName;Owner=guildOwner}
  82.         guildData.DataType = 'GuildData'
  83.         guildData.ID = tostring(tick() - math.random(0,1))
  84.         guildData.Members = {[guildOwner.UserId]=newGuildPlayer(guildOwner,255,'Leader')}
  85.         guildData.Economy = 0
  86.         guildData.Level = 0
  87.        
  88.         shared.GuildDataStore:SetAsync(guildData.ID,guildData)
  89.        
  90.         return setmetatable(guildData,Service)
  91.        
  92.     end
  93.    
  94.     function Service.getGuild(guildID)
  95.        
  96.         local guildData = shared.GuildDataStore:GetAsync(guildID)
  97.        
  98.         if not guildData then return error('Guild not valid') end
  99.        
  100.         return setmetatable(guildData,Service)
  101.        
  102.     end
  103.    
  104.     function Service:Add(keys,key,newValue,forceChange)
  105.        
  106.         forceChange = forceChange or false
  107.        
  108.         local dataPath = #keys == 1 and self or nil
  109.        
  110.         for i=1,#keys-1 do
  111.             dataPath = dataPath and dataPath[keys[i]] or self[keys[i]]
  112.         end
  113.    
  114.         local oldValue = dataPath[keys[#keys]][key]
  115.  
  116.         if typeof(oldValue) ~= 'table' then return end
  117.  
  118.         if typeof(newValue) == 'number' then
  119.             dataPath[keys[#keys]][key] = dataPath[keys[#keys]][key] == nil and newValue or not forceChange and dataPath[keys[#keys]][key] + newValue or newValue
  120.         else
  121.             dataPath[keys[#keys]][key] = newValue
  122.         end
  123.  
  124.         newValue = dataPath[keys[#keys]][key]
  125.  
  126.         if dataSignals['DataEvent-'..keys[#keys]..'Added'] then
  127.             dataSignals['DataEvent-'..keys[#keys]..'Added']:FireClient(game.Players:GetPlayerByUserId(self.ID),{newValue=newValue,oldValue=oldValue})
  128.         end
  129.  
  130.     end
  131.    
  132.     function Service:Change(keys,newValue)
  133.        
  134.         local dataPath = #keys == 1 and self or nil
  135.        
  136.         for i=1,#keys-1 do
  137.             dataPath = dataPath and dataPath[keys[i]] or self[keys[i]]
  138.         end
  139.    
  140.         local oldValue = dataPath[keys[#keys]]
  141.  
  142.         if maxData[keys[#keys]] then
  143.             if newValue > maxData[keys[#keys]] then return end
  144.         end
  145.  
  146.         dataPath[keys[#keys]] = newValue
  147.    
  148.         if dataSignals['DataEvent-'..keys[#keys]] then
  149.             dataSignals['DataEvent-'..keys[#keys]]:FireClient(game.Players:GetPlayerByUserId(self.ID),{newValue=newValue,oldValue=oldValue,maxValue = maxData[keys[#keys]] or nil})
  150.         end
  151.        
  152.     end
  153.    
  154.     function Service:Save()
  155.    
  156.         local dataToSave = TextCompressor:Compress(HttpService:JSONEncode(self))
  157.        
  158.         if self.DataType == 'GuildData' then
  159.             shared.GuildDataStore:UpdateAsync(self.ID,function(old)
  160.                 local dataSave = dataToSave or old
  161.                 return dataSave
  162.             end)
  163.         elseif self.DataType == 'PlayerData' then
  164.             shared.PlayerDataStore:UpdateAsync(self.ID,function(old)
  165.                 local dataSave
  166.                 local oldValue = old and HttpService:JSONDecode(TextCompressor:Decompress(old)) or nil
  167.                 if oldValue then
  168.                     print('Verifying data...')
  169.                     if self.Level > oldValue.Level then
  170.                         dataSave = dataToSave
  171.                     elseif self.Level < oldValue.Level then
  172.                         dataSave = old
  173.                     elseif self.Level == oldValue.Level then
  174.                         if self.Experience > oldValue.Experience then
  175.                             dataSave = dataToSave
  176.                         elseif self.Experience > oldValue.Experience then
  177.                             dataSave = old
  178.                         elseif self.Experience == oldValue.Experience then
  179.                             dataSave = dataToSave
  180.                         end
  181.                     end
  182.                 else
  183.                     dataSave = dataToSave
  184.                 end
  185.                 print('Saving '..self.ID..' data...',TextCompressor:Decompress(dataSave))
  186.                 return dataSave
  187.             end)
  188.         end
  189.        
  190.         dataTable[self.ID] = nil
  191.         self = nil
  192.        
  193.     end
  194.    
  195.     function Service:Delete()
  196.        
  197.         if self.DataType == 'GuildData' then
  198.             local success, val = pcall(function()
  199.                 return shared.GuildDataStore:RemoveAsync(self.ID)
  200.             end)
  201.            
  202.             if success == true then
  203.                 self = nil
  204.             end
  205.            
  206.         elseif self.DataType == 'PlayerData' then
  207.             local success, val = pcall(function()
  208.                 return shared.PlayerDataStore:RemoveAsync(self.ID)
  209.             end)
  210.            
  211.             if success == true then
  212.                 self = nil
  213.             end
  214.            
  215.         end
  216.        
  217.     end
  218.    
  219. elseif RunService:IsClient() then
  220.    
  221.     function Service.listen(name)
  222.         local Event = dataSignals:FindFirstChild('DataEvent-'..name)
  223.         if not Event then
  224.             InternalSignals.createEventListener:InvokeServer('DataEvent-'..name)
  225.         end
  226.         return Event
  227.     end
  228.    
  229. end
  230.  
  231. return Service
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement