Advertisement
DanielSiqueira

Module - DataManager

Jul 17th, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.02 KB | None | 0 0
  1. -- Constructor: _G.DataManager.createManager(player)
  2. -- Nest functions: Manager.loadData(isEphemeral)
  3.  
  4. local module = {}
  5. module.__index = module
  6. local managerMethods = {}
  7. managerMethods.__index = managerMethods
  8.  
  9. local Network = require(game.ReplicatedStorage.Network)
  10. local Network2 = require(game.ReplicatedStorage.Network2)
  11.  
  12. local data_network = Network.new("data_network")
  13. local bindable_data_network = Network2.new("data_network")
  14.  
  15. local Managers = {}
  16. local starterData = function(shouldSave) local t = {}
  17.     if shouldSave then
  18.         t = {}
  19.         local add_data = bindable_data_network:invoke("on_data_created")
  20.         if add_data then
  21.             for node,value in pairs(add_data) do
  22.                 t[node] = value
  23.             end
  24.         end
  25.     else
  26.         t = {}
  27.         }
  28.     end
  29.     return t
  30. end
  31.  
  32. _G.DataStorage = game:GetService('DataStoreService'):GetDataStore('[TEST]-18')
  33.  
  34. local function get_equipped_title(manager,team)
  35.     for i,v in pairs(manager.Data.Saved.Inventory) do
  36.         if v.Equipped and v.ClassName == 'Title' and v.Team == team then
  37.             return v
  38.         end
  39.     end
  40. end
  41.  
  42. local function load_data(userId,shouldSave)
  43.     if shouldSave == false then
  44.         return starterData(shouldSave)
  45.     end
  46.     local dataToLoad = _G.DataStorage:GetAsync(userId) or starterData(shouldSave)
  47.     return dataToLoad
  48. end
  49.  
  50. local function table_to_object(tbl,folder)
  51.     for index,value in pairs(tbl) do
  52.         local typeOf = typeof(value)
  53.         if typeOf == 'table' then
  54.             local instance_folder = Instance.new('Folder')
  55.             instance_folder.Name = index
  56.             instance_folder.Parent = folder
  57.             table_to_object(value,instance_folder)
  58.         else
  59.             local value_object = Instance.new(_G.GeneralUtilities.getClassName(value))
  60.             value_object.Value = value
  61.             value_object.Name = index
  62.             value_object.Changed:Connect(function(newValue)
  63.                 tbl[index] = newValue
  64.             end)
  65.             value_object.Parent = folder
  66.         end
  67.     end
  68. end
  69.  
  70. function module.createManager(player)
  71.     local userId = player.UserId
  72.     local newManager = {UserId=userId;SavingAttempts=0;Data={Saved={};Ephemeral={}};IsSaving=false;Saved=Instance.new('BindableEvent')}
  73.     Managers[player.UserId] = newManager
  74.     print('Manager created for',player.Name)
  75.     bindable_data_network:fire("on_manager_created",newManager)
  76.     return setmetatable(newManager,module)
  77. end
  78.  
  79. function module:LoadData(shouldSave)
  80.     local dataKey = shouldSave and 'Saved' or 'Ephemeral'
  81.     self.Data[dataKey] = load_data(self.UserId,shouldSave)
  82.    
  83.     bindable_data_network:connect_event("value_changed",function(name,newValue,manager)
  84.         if name == 'Saved/Experience' then
  85.             if newValue == 260* 1.5^(self.Data.Saved.Level) then
  86.                 self:LevelUp()
  87.             end
  88.         end
  89.     end)
  90. end
  91. function module:SaveData(should_destroy)
  92.     self.IsSaving = true
  93.     self.SavingAttempts += 1
  94.     local data_to_save = self.Data.Saved
  95.     local success,error_code = pcall(_G.DataStorage:UpdateAsync(self.UserId,function(old)
  96.             if old then
  97.                 if old.Level > data_to_save.Level then
  98.                     return old
  99.                 end
  100.             end
  101.             return data_to_save
  102.     end))
  103.     if not success and self.SavingAttempts < 5 then
  104.         if error_code == 502 then
  105.             wait(1)
  106.             self:SaveData(should_destroy)
  107.             return
  108.         elseif error_code == 304 then
  109.             wait(6)
  110.             self:SaveData(should_destroy)
  111.             return
  112.         end
  113.         self:SaveData(should_destroy)
  114.         return
  115.     end
  116.     self.Saved:Fire()
  117.     if should_destroy then
  118.         Managers[self.UserId] = nil
  119.         self = nil
  120.     end
  121. end
  122.  
  123. function module:Change(settingPath,settingValue)
  124.     local splitPath = string.split(settingPath,'/')
  125.     local objectChanged
  126.     local pathNode
  127.     local pathNodeObject
  128.     for i = 1,#splitPath-1 do
  129.         if self.DataObject then
  130.             local firstPath = true
  131.             if splitPath[1] == 'Data' then firstPath = false end
  132.             pathNodeObject = pathNodeObject ~= nil and pathNodeObject[splitPath[i]] or firstPath and self.DataObject:FindFirstChild(splitPath[i]) or self.DataObject
  133.             pathNode = pathNode and pathNode[splitPath[i]] or self[splitPath[i]]
  134.         else
  135.             pathNode = pathNode and pathNode[splitPath[i]] or self[splitPath[i]]
  136.         end
  137.     end
  138.     if typeof(settingValue) ~= 'table' and pathNodeObject then
  139.         pathNodeObject[splitPath[#splitPath]].Value = settingValue
  140.         return pathNodeObject[splitPath[#splitPath]].Value
  141.     end
  142.     pathNode[splitPath[#splitPath]] = settingValue
  143.     data_network:fire(game.Players:GetPlayerByUserId(self.UserId),"value_changed",settingPath,settingValue,self)
  144.     bindable_data_network:fire("value_changed",settingPath,settingValue,self)
  145.     return pathNode[splitPath[#splitPath]]
  146. end
  147.  
  148. function module:createDataFolder(folderParent,folderName)
  149.     if self.DataObject then
  150.         self.DataObject:Destroy()
  151.     end
  152.     self.DataObject = Instance.new('Folder')
  153.     self.DataObject.Name = folderName
  154.     self.DataObject.Parent = folderParent
  155.     local function createFolder(key)
  156.         local tableObjects = self.Data[key]
  157.         local instanceFolder = Instance.new('Folder')
  158.         instanceFolder.Name = key
  159.            
  160.         table_to_object(tableObjects,instanceFolder)
  161.         instanceFolder.Parent = self.DataObject
  162.     end
  163.     createFolder('Saved')
  164.     createFolder('Ephemeral')
  165. end
  166.  
  167. function module:GetManagers()
  168.     return Managers
  169. end
  170.  
  171. function module:GetCurrentSkin(team)
  172.     local currentSkin
  173.     for node,value in pairs(self.Data.Saved.Inventory) do
  174.         if value.ClassName == 'Skin' and value.Equipped and value.Team == team then
  175.             value.Name = node
  176.             currentSkin = value
  177.         end
  178.     end
  179.     return currentSkin
  180. end
  181.  
  182.  
  183. function module:GetCurrentTitle()
  184.     local currentTitle
  185.     local success, msg = pcall(function()
  186.         for node,value in pairs(self.Data.Saved.Inventory) do
  187.             if value.ClassName == 'Title' and value.Equipped then
  188.                 value.Name = node
  189.                 currentTitle = value
  190.             end
  191.         end
  192.     end)
  193.    
  194.     if not success then
  195.         warn(msg)
  196.         warn(debug.traceback())
  197.     end
  198.    
  199.     return currentTitle
  200. end
  201.  
  202. function module:LevelUp()
  203.     local saved = self.Data.Saved
  204.     saved.Level = saved.Level + 1
  205. end
  206.  
  207. function module:AddTitle(titleName)
  208.     local Player = game.Players:GetPlayerByUserId(self.UserId)
  209.     self.Data.Saved.Inventory[titleName] = {Equipped=false; Equip = function()
  210.                
  211.             get_equipped_title(self,Player.Team.Name).Equipped = false
  212.             self.Data.Saved.Inventory[titleName].Equipped = true
  213.             _G.TitleEquipped:FireClient(Player,titleName)
  214.                
  215.         end
  216.     }
  217. end
  218.  
  219. return module
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement