Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --//Modules
- local DataService = require(game.ServerScriptService.Services.DataService);
- local Schema = require(game.ServerScriptService.Services.Schema);
- local QuestModule = require(script.Parent.QuestController.Quest);
- --//Public Vars
- local DsName = "MainDs_v10";
- local PlayersAllowedToSave = {};
- local TypeConversions = {
- ["string"] = "StringValue",
- ["boolean"] = "BoolValue",
- ["number"] = "NumberValue"
- }
- --//Functions
- function formatJSON(json)
- local depth = 0
- local str = ""
- for i in json:gmatch(".") do
- if i == "{" then
- depth = depth + 1
- str = str..(" "):rep(depth - 1)..i.."\n"..(" "):rep(depth)
- elseif i == "}" then
- depth = depth - 1
- str = str.."\n"..(" "):rep(depth)..i
- elseif i == "," then
- str = str..i.."\n"..(" "):rep(depth)
- else
- str = str..i
- end
- end
- return str:sub(2)
- end
- local function GetQuestByName(QuestName)
- for i, v in pairs(QuestModule) do
- if v[QuestName] then
- return v[QuestName]
- end
- end
- end
- local function ConvertSchemaToObj(Schema)
- local PlayerStats = Instance.new("Folder");
- PlayerStats.Name = "PlayerStats";
- for Key, Value in pairs(Schema) do
- if (typeof(Value) ~= "table") then
- local ValueObj = Instance.new(TypeConversions[typeof(Value)]);
- ValueObj.Value = Value;
- ValueObj.Name = Key;
- ValueObj.Parent = PlayerStats;
- else
- local ParentObj = Instance.new("Folder");
- ParentObj.Name = Key;
- for Key2, Value2 in pairs(Value) do
- if ParentObj.Name == 'QuestFolder' then
- local CurrectQuest = Instance.new("Folder")
- CurrectQuest.Name = Key2
- CurrectQuest.Parent = ParentObj
- for Key3, Value3 in pairs(Value2) do
- if typeof(Value3) == "number" then
- local ValueObj = Instance.new("DoubleConstrainedValue");
- ValueObj.Value = Value3
- ValueObj.Name = Key3;
- ValueObj.Parent = CurrectQuest;
- ValueObj.MaxValue = GetQuestByName(Key2).QuestRequirements[Key3]
- else
- local ValueObj = Instance.new(TypeConversions[typeof(Value3)]);
- ValueObj.Value = Value3
- ValueObj.Name = Key3;
- ValueObj.Parent = CurrectQuest;
- end
- end
- else
- local ValueObj = Instance.new(TypeConversions[typeof(Value2)]);
- ValueObj.Value = Value2
- ValueObj.Name = Key2;
- ValueObj.Parent = ParentObj;
- end
- end
- ParentObj.Parent = PlayerStats;
- end
- end
- --print("Loaded")
- return PlayerStats;
- end
- local function ConvertObjToSchema(PlayerStats)
- local Schema = {};
- for i,v in pairs(PlayerStats:GetChildren()) do
- if (v:IsA("Folder")) then
- local DataToAdd = {};
- for _,obj in pairs(v:GetChildren()) do
- if (table.getn(obj:GetChildren()) > 0) then
- DataToAdd[obj.Name] = {};
- if obj:IsA("Folder") then
- for _, Value in pairs(obj:GetChildren()) do
- DataToAdd[obj.Name][Value.Name] = Value.Value;
- end
- else
- DataToAdd[obj.Name] = obj.Value
- end
- else
- DataToAdd[obj.Name] = obj.Value
- end
- end
- Schema[v.Name] = DataToAdd;
- else
- Schema[v.Name] = v.Value;
- end
- end
- print(formatJSON(game:GetService("HttpService"):JSONEncode(Schema)))
- return Schema;
- end
- --//Events
- game.Players.PlayerAdded:Connect(function(plr)
- local Data = DataService:GetAsync(DsName, plr.UserId) or Schema;
- local PlayerStats = ConvertSchemaToObj(Data);
- PlayerStats.Parent = plr;
- PlayersAllowedToSave[plr.Name] = true;
- repeat
- local PlayerData = ConvertObjToSchema(PlayerStats);
- DataService:SetAsync(DsName, plr.UserId, PlayerData);
- wait(50)
- until not plr
- end)
- game.Players.PlayerRemoving:Connect(function(plr)
- if (PlayersAllowedToSave[plr.Name]) then
- PlayersAllowedToSave[plr.Name] = nil;
- local PlayerStats = plr.PlayerStats;
- local Schema = ConvertObjToSchema(PlayerStats);
- DataService:SetAsync(DsName, plr.UserId, Schema);
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement