Ok, so here is my datastore. As you can see, it is a table of values that are saved.
When I change one thing in the character creator, it saves just fine, but if I customise more than a couple of things, it just refuses to save.
I had used a while wait do loop for every few seconds, and it was fine, but I want to refrain from doing so, otherwise the player will have to wait a minute just for the changes to save.
local Defaults = { Stats = {Level = 1, Experience = 0, Health = 0, Melee = 0, Weapon = 0, Fruit = 0, Ability = "None"}; Inventory = { Weapons = {}; Fruits = {}; KeyItems = {}; Other = {}; }; Appearance = { Hair = "Hair1"; Shirt = "Short"; Pants = "Short"; Shoes = "Sandals"; Tone = "Pastel Brown"; HairPrimary = {0, 0, 0}; ShirtPrimary = {0, 0, 0}; ShirtSecondary = {0, 0, 0}; PantsPrimary = {0, 0, 0}; PantsSecondary = {0, 0, 0}; ShoesPrimary = {0, 0, 0}; }; Codes = {}; Equipment = {}; } local datalist = {} local store = game:GetService("DataStoreService") local getstore = store:GetDataStore("Playerstats1") local runservice = game:GetService("RunService") local writedata = function(key, savedtable, newdata) if newdata.dataloaded == nil then return end if newdata.dataloaded == true then local succeed, errored = pcall(function() getstore:SetAsync(key, savedtable) end) if succeed then print("New Data saved successfully") else warn("Newdata has not been saved. Reason: "..errored) end end end game:GetService("Players").PlayerAdded:Connect(function(plr) datalist[plr.UserId] = {} local newdata = datalist[plr.UserId] newdata.dataloaded = false local key = plr.UserId local savedtable local success, errormessage = pcall(function() savedtable = getstore:GetAsync(key) end) if success then if savedtable ~= nil then newdata.dataloaded = true newdata.mydata = savedtable else --new player savedtable = Defaults newdata.mydata = savedtable newdata.dataloaded = true writedata(key, savedtable, newdata) end else --failed to load data newdata.dataloaded = false wait() plr:Kick("Failed to load data. Rejoin to try again.") end coroutine.resume(coroutine.create(function() local remotes = game:GetService("ReplicatedStorage"):WaitForChild("RemoteEvents") local loadcharacterdata = remotes:WaitForChild("LoadCharacterData") loadcharacterdata:Fire(plr, savedtable, "Completely")--creates avatar using given data end)) end) local updatedata = function(plr) local key = plr.UserId local newdata = datalist[plr.UserId] ----------------------------------------------------------- if newdata.dataloaded == nil or newdata.dataloaded == false then plr:Kick() else print("player has data") end ----------------------------------------------------------- local savingdata = newdata.mydata if not savingdata then plr:Kick() end local successfully, warningmessage = pcall(function() getstore:SetAsync(key, savingdata) end) if successfully then --data successfully saved print("save successful") else warn("warning, data could not be saved! Retrying!") local retry_count = 0 while retry_count <6 do wait(60) local success, errormessage = pcall(function() getstore:SetAsync(key, savingdata) end) if success then break else retry_count = retry_count + 1 end end end end game:GetService("Players").PlayerRemoving:Connect(updatedata) game:BindToClose(function() if runservice:IsStudio() then print("is studio") return else if not runservice:IsStudio() then print("not in studio") for i, v in pairs(game:GetService("Players"):GetPlayers()) do updatedata(v) end end end end) local remotes = game:GetService("ReplicatedStorage"):WaitForChild("RemoteEvents") local loadcharacterdata = remotes:WaitForChild("LoadCharacterData") local sethair = remotes:WaitForChild("SetHair") local setshirt = remotes:WaitForChild("SetShirt") local setpants = remotes:WaitForChild("SetPants") local setshoes = remotes:WaitForChild("SetShoes") local settone = remotes:WaitForChild("SetTone") local sethaircolour = remotes:WaitForChild("SetHairColour") local setshirtcolour = remotes:WaitForChild("SetShirtColour") local setpantscolour = remotes:WaitForChild("SetPantsColour") local setshoescolour = remotes:WaitForChild("SetShoesColour") sethair.Event:Connect(function(plr, id) local newdata = datalist[plr.UserId] if not newdata then return end local mydata = newdata.mydata if not mydata then return end mydata.Appearance.Hair = tostring(id) loadcharacterdata:Fire(plr, mydata, "Hair")--creates avatar using given data end) setshirt.Event:Connect(function(plr, id) local newdata = datalist[plr.UserId] if not newdata then return end local mydata = newdata.mydata if not mydata then return end mydata.Appearance.Shirt = tostring(id) loadcharacterdata:Fire(plr, mydata, "Shirt")--creates avatar using given data end) setpants.Event:Connect(function(plr, id) local newdata = datalist[plr.UserId] if not newdata then return end local mydata = newdata.mydata if not mydata then return end mydata.Appearance.Pants = tostring(id) loadcharacterdata:Fire(plr, mydata, "Pants")--creates avatar using given data end) setshoes.Event:Connect(function(plr, id) local newdata = datalist[plr.UserId] if not newdata then return end local mydata = newdata.mydata if not mydata then return end mydata.Appearance.Shoes = tostring(id) loadcharacterdata:Fire(plr, mydata, "Shoes")--creates avatar using given data end) settone.Event:Connect(function(plr, id) local newdata = datalist[plr.UserId] if not newdata then return end local mydata = newdata.mydata if not mydata then return end mydata.Appearance.Tone = tostring(id) loadcharacterdata:Fire(plr, mydata, "Tone") --creates avatar using given data end) sethaircolour.Event:Connect(function(plr, h, s, value) local newdata = datalist[plr.UserId] if not newdata then return end local mydata = newdata.mydata if not mydata then return end mydata.Appearance.HairPrimary[1] = tonumber(h) mydata.Appearance.HairPrimary[2] = tonumber(s) mydata.Appearance.HairPrimary[3] = tonumber(value) end) setshirtcolour.Event:Connect(function(plr, h, s, value) local newdata = datalist[plr.UserId] if not newdata then return end local mydata = newdata.mydata if not mydata then return end mydata.Appearance.ShirtPrimary[1] = tonumber(h) mydata.Appearance.ShirtPrimary[2] = tonumber(s) mydata.Appearance.ShirtPrimary[3] = tonumber(value) end) setpantscolour.Event:Connect(function(plr, h, s, value) local newdata = datalist[plr.UserId] if not newdata then return end local mydata = newdata.mydata if not mydata then return end mydata.Appearance.PantsPrimary[1] = tonumber(h) mydata.Appearance.PantsPrimary[2] = tonumber(s) mydata.Appearance.PantsPrimary[3] = tonumber(value) end) setshoescolour.Event:Connect(function(plr, h, s, value) local newdata = datalist[plr.UserId] if not newdata then return end local mydata = newdata.mydata if not mydata then return end mydata.Appearance.ShoesPrimary[1] = tonumber(h) mydata.Appearance.ShoesPrimary[2] = tonumber(s) mydata.Appearance.ShoesPrimary[3] = tonumber(value) end)
I'm looking for answers as to why this could be happening.