I was searching around for this error, found another answer on scriptinghelpers, but the fix the guy gave didn't work for me. I get the error 17:48:16.066 - Cannot store Array in DataStore 17:48:16.067 - Script 'Workspace.Script', Line 49 17:48:16.068 - Stack End" Note: That is not the actual data store name..
local DSService = game:GetService('DataStoreService'):GetDataStore("Name") game.Players.PlayerAdded:connect(function(plr) local uniquekey = 'id-'..plr.userId local leaderstats = Instance.new('IntValue', plr) local savevalue = Instance.new('IntValue') local SaveFolder = Instance.new('Folder') local SaveStone = Instance.new('IntValue') local SaveClay = Instance.new('IntValue') local SaveBrick = Instance.new('IntValue') local SaveRawIron = Instance.new('IntValue') local SaveIron = Instance.new('IntValue') leaderstats.Name = 'leaderstats' savevalue.Parent = leaderstats savevalue.Name = 'Cash' SaveFolder.Name = "SaveFolder" SaveFolder.Parent = plr SaveStone.Name = "SaveStone" SaveStone.Parent = SaveFolder SaveClay.Name = "SaveClay" SaveClay.Parent = SaveFolder SaveBrick.Name = "SaveBrick" SaveBrick.Parent = SaveFolder SaveRawIron.Name = "SaveRawIron" SaveRawIron.Parent = SaveFolder SaveIron.Name = "SaveIron" SaveIron.Parent = SaveFolder local GetSaved = DSService:GetAsync(uniquekey) if GetSaved then savevalue.Value = GetSaved[1] SaveFolder = GetSaved[2] SaveStone.Value = GetSaved[3] SaveClay.Value = GetSaved[4] SaveBrick.Value = GetSaved[5] SaveRawIron.Value = GetSaved[6] SaveIron.Value = GetSaved[7] plr.PlayerGui.Invintory.Inv.Stone.Text = "Stone: "..SaveStone.Value plr.PlayerGui.Invintory.Inv.Clay.Text = "Stone: "..SaveClay.Value plr.PlayerGui.Invintory.Inv.Bricks.Text = "Stone: "..SaveBrick.Value plr.PlayerGui.Invintory.Inv.RawIron.Text = "Stone: "..SaveRawIron.Value plr.PlayerGui.Invintory.Inv.Iron.Text = "Stone: "..SaveIron.Value else local NumbersForSaving = {savevalue.Value, SaveFolder, SaveStone.Value, SaveClay.Value, SaveBrick.Value, SaveRawIron.Value, SaveIron.Value} DSService:SetAsync(uniquekey, NumbersForSaving) end end) game.Players.PlayerRemoving:connect(function(plr) local uniquekey = 'id-'..plr.userId local Savetable = {plr.leaderstats.Cash.Value, plr.SaveFolder, plr.SaveFolder.SaveStone.Value, plr.SaveFolder.SaveClay.Value, plr.SaveFolder.SaveBrick.Value, plr.SaveFolder.SaveRawIron.Value, plr.SaveFolder.SaveIron.Value} DSService:SetAsync(uniquekey, Savetable) end)
You can only have one (1) type of statistic stored in a table in a datastore...
plr.SaveFolder
cannot be saved, because it is not the same type of object
as plr.SaveFolder.SaveStone.Value
Solution?
JSONEncoding, and JSONDecoding...
To do JSONEncoding:
http://wiki.roblox.com/index.php?title=API:Class/HttpService/JSONEncode
Why is this useful? You can convert data into Strings.
But how do I do this? First, you must access the HttpService, this does not mean HttpService needs to be enabled though:
HttpService = game:GetService("HttpService")
Now, you will give the table you want to encode:
local atable = {"A","B","a","b"}
Since you have this, you can now begin to encode it...
local encoding = HttpService:JSONEncode(atable) print(encoding)
Now, you have a string.
http://wiki.roblox.com/index.php?title=API:Class/HttpService/JSONDecode
When retrieving the data given to the datastore, you must now decode the encoding...
You can go about this by using the JSONDecode("AString")
event...
local decoding = HttpService:JSONDecode(encoding)
Now you have a table... hooray.
As for your script, now that I have explained this... will go as follows:
HttpService = game:GetService("HttpService") -- Put this at the start of the script. local EncodedTable = DSService:GetAsync(uniquekey) local DecodedTable if EncodedTable then DecodedTable = EncodedTable:JSONDecode(EncodedTable) end if DecodedTable ~= nil then savevalue.Value = DecodedTable[1] SaveFolder = DecodedTable[2] SaveStone.Value = DecodedTable[3] SaveClay.Value = DecodedTable[4] SaveBrick.Value = DecodedTable[5] SaveRawIron.Value = DecodedTable[6] SaveIron.Value = DecodedTable[7] plr.PlayerGui.Invintory.Inv.Stone.Text = "Stone: "..SaveStone.Value plr.PlayerGui.Invintory.Inv.Clay.Text = "Stone: "..SaveClay.Value plr.PlayerGui.Invintory.Inv.Bricks.Text = "Stone: "..SaveBrick.Value plr.PlayerGui.Invintory.Inv.RawIron.Text = "Stone: "..SaveRawIron.Value plr.PlayerGui.Invintory.Inv.Iron.Text = "Stone: "..SaveIron.Value else local NumbersForSaving = { savevalue.Value, SaveFolder, SaveStone.Value, SaveClay.Value, SaveBrick.Value, SaveRawIron.Value, SaveIron.Value} local EnocdedNFS = HttpService:JSONEncode(NumbersForSaving) DSService:SetAsync(uniquekey,EncodedNFS) end
That's for the PlayerAdded, for the PlayerRemoving:
game.Players.PlayerRemoving:connect(function(plr) local uniquekey = 'id-'..plr.userId local Savetable = {plr.leaderstats.Cash.Value, plr.SaveFolder, plr.SaveFolder.SaveStone.Value, plr.SaveFolder.SaveClay.Value, plr.SaveFolder.SaveBrick.Value, plr.SaveFolder.SaveRawIron.Value, plr.SaveFolder.SaveIron.Value} local EncodedSt = HttpService:JSONEncode(Savetable) DSService:SetAsync(uniquekey, EncodedSt) end)
This should do it for you... There could be errors, it was done in the Tab for this.
-Taryo
Thgirypoc (C) 6102 Oyrat