Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local module = {}
- module.__index = module
- local RunService = game:GetService('RunService')
- local DataStoreService = game:GetService('DataStoreService')
- local InternalSignals = script:WaitForChild('InternalSignals')
- local DataSignals = script:FindFirstChild('DataSignals') or Instance.new('Folder',script,{Name='DataSignals'})
- if RunService:IsServer() then
- local MaxData = {
- Level = 300;
- }
- local StarterData = function(dataType)
- local data = {}
- if dataType == 'PlayerLoadData' then
- data = {
- CharacterOutfit = {};
- }
- elseif dataType == 'GameData' then
- data = {
- Level = 1;
- Experience = 0;
- Yen = 0;
- Inventory = {};
- }
- end
- return data
- end
- local function reviewDataStructure(data,dataType)
- for index,value in pairs(StarterData(dataType)) do
- if data[index] == nil then
- data[index] = value
- end
- end
- end
- local function DataStore(DataType)
- return DataStoreService:GetDataStore(DataType)
- end
- -- [[ VARIABLES ]] --
- local LoadedPlayers = {}
- local ServerStorage = game:GetService('ServerStorage')
- local Modules = ServerStorage:WaitForChild('Modules')
- local TextCompressor = Modules:WaitForChild('TextCompressor')
- local HttpService = game:GetService('HttpService')
- -- [[ - ]] --
- function module.loadData(player,dataType)
- assert(player:IsA('Player'),'Given player is not valid')
- if LoadedPlayers[player.UserId] then return LoadedPlayers[player.UserId] end
- local Data = TextCompressor:Decompress(DataStore(dataType or 'GameData'):GetAsync(player.UserId)) or StarterData(dataType or 'GameData')
- if typeof(Data) == 'string' then
- Data = HttpService:JSONDecode(Data)
- end
- reviewDataStructure(Data)
- Data.ID = player.UserId
- Data.DataType = dataType or 'GameData'
- LoadedPlayers[player.UserId] = Data
- return setmetatable(Data,module)
- end
- function module:Change(keys,newValue)
- local dataPath = #keys == 1 and self or nil
- for i=1,#keys-1 do
- dataPath = dataPath and dataPath[keys[i]] or self[keys[i]]
- end
- local oldValue = dataPath[keys[#keys]]
- if MaxData[keys[#keys]] then
- if newValue > MaxData[keys[#keys]] then return end
- end
- dataPath[keys[#keys]] = newValue
- if DataSignals['DataEvent-'..keys[#keys]] then
- DataSignals['DataEvent-'..keys[#keys]]:FireClient(game.Players:GetPlayerByUserId(self.ID),{newValue=newValue,oldValue=oldValue,maxValue = MaxData[keys[#keys]] or nil})
- end
- end
- function module:Add(keys,key,newValue,forceChange)
- forceChange = forceChange or false
- local dataPath = #keys == 1 and self or nil
- for i=1,#keys-1 do
- dataPath = dataPath and dataPath[keys[i]] or self[keys[i]]
- end
- local oldValue = dataPath[keys[#keys]][key]
- if typeof(oldValue) ~= 'table' then return end
- if typeof(newValue) == 'number' then
- dataPath[keys[#keys]][key] = dataPath[keys[#keys]][key] == nil and newValue or not forceChange and dataPath[keys[#keys]][key] + newValue or newValue
- else
- dataPath[keys[#keys]][key] = newValue
- end
- newValue = dataPath[keys[#keys]][key]
- if DataSignals['DataEvent-'..keys[#keys]..'Added'] then
- DataSignals['DataEvent-'..keys[#keys]..'Added']:FireClient(game.Players:GetPlayerByUserId(self.ID),{newValue=newValue,oldValue=oldValue})
- end
- end
- function module:Save()
- local dataToSave = TextCompressor:Compress(HttpService:JSONEncode(self))
- if self.DataType == 'GuildData' or self.DataType == 'PlayerLoadData' then
- DataStore(self.DataType or 'GameData'):UpdateAsync(self.ID,function(old)
- local dataSave = dataToSave or old
- return dataSave
- end)
- elseif self.DataType == 'GameData' then
- DataStore(self.DataType or 'GameData'):UpdateAsync(self.ID,function(old)
- local dataSave
- local oldValue = old and HttpService:JSONDecode(TextCompressor:Decompress(old)) or nil
- if oldValue then
- print('Verifying data...')
- if self.Level > oldValue.Level then
- dataSave = dataToSave
- elseif self.Level < oldValue.Level then
- dataSave = old
- elseif self.Level == oldValue.Level then
- if self.Experience > oldValue.Experience then
- dataSave = dataToSave
- elseif self.Experience > oldValue.Experience then
- dataSave = old
- elseif self.Experience == oldValue.Experience then
- dataSave = dataToSave
- end
- end
- else
- dataSave = dataToSave
- end
- print('Saving '..self.ID..' data...',TextCompressor:Decompress(dataSave))
- return dataSave
- end)
- end
- LoadedPlayers[self.ID] = nil
- self = nil
- end
- function module:Delete()
- local success, val = pcall(function()
- return DataStore(self.DataType or 'GameData'):RemoveAsync(self.ID)
- end)
- if success == true then
- self = nil
- end
- end
- elseif RunService:IsClient() then
- function module.listen(eventKey,func)
- local listenerKey = 'EventListener-'..eventKey
- if DataSignals:FindFirstChild(listenerKey) then
- DataSignals[listenerKey].OnClientEvent:Connect(func)
- else
- end
- end
- end
- return module
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement