I've attempted this and I'm not sure if I am close or not. The script doesn't work. I was just playing with it at the beginning now I want to learn how to fix this so it works.
function CreateData(Player) if Data[Player] == nil then for i,v in pairs(Player.Leaderstat:GetChildren()) do if v.ClassName == 'Folder' then Data[Player][""..v.Name] = CompileData(v) elseif v.ClassName == 'IntValue' or v.ClassName == 'StringValue' then v.Value = Data[Player][""..v.Name] end if v.ClassName == 'IntValue' then Data[Player][""..v.Name] = 0 elseif v.ClassName == 'StringValue' then Data[Player][""..v.Name] = "" end end function CompileData(Player, t) t = Data[Player] or {} for i,v in pairs(Player.Leaderstat:GetChildren()) do if v.ClassName == 'Folder' then Data[Player][""..v.Name] = CompileData(v) elseif v.ClassName == 'IntValue' or v.ClassName == 'StringValue' then v.Value = Data[Player][""..v.Name] end if v.Name ~= "Type" and v.Name ~= "Type2" then v.Value = Data[Player][""..v.Name] elseif v.Name == "Type" or "Type2" then end end return(t) end end end function LoadData(Player) if PlayersLoaded[Player] == nil then Data[Player] = DSS:GetAsync(""..Player.UserId) function CompileData(Player, t) t = Data[Player] or {} for i,v in pairs(Player.Leaderstat:GetChildren()) do if v.ClassName == 'Folder' then Data[Player][""..v.Name] = CompileData(v) elseif v.ClassName == 'IntValue' or v.ClassName == 'StringValue' then v.Value = Data[Player][""..v.Name] end end return (t) end end game.Players.PlayerAdded:connect(function(Player) game.ReplicatedStorage.Leaderstat:Clone().Parent = Player if DSS:GetAsync(Player.UserId) == nil then CreateData(Player) elseif DSS:GetAsync(Player.UserId) ~= nil then LoadData(Player) end end) game.Players.PlayerRemoving:connect(function(Player) DSS:SetAsync(""..Player.UserId, Data[Player]) end)