For some context, Im trying to make a build saving system that saves a part relative to the plot, for some reason its not saving and i cannot find the error. I have the roblox api datastore thing on and its published to roblox.
I’m pretty sure that you can’t save Vectors to a database, probably applies to CFrames too.
Addressing the Issue
You might wrap the :SetAsync()
, :GetAsync()
… etc. in pcall()
.
Also I thought storing whole DataModels are not possible. Consider about refraining from storing those. Instead, you could store relevant data about each object into the table and then store it. Woops, this was irrelavant.
Also CFrame are extremely long if you print out one. Ahahahaha!
~~Source: Saving parts/models via datastore?
That’s actually what he already does.
I just found out, my bad. Try the first paragraph.
Instead of saving the CFrame value, could he save the Position and use Part.CFrame = Plot.CFrame * Vector3
?
It could be both the position and the orientation, if the matrix thing is not necessary.
{position, orientation}
Or else this will be saved:
-6, 0.500001013, -11, 1, 0, 0, 0, 1, 0, 0, 0, 1
Is it only me or this looks really wrong?
You’re deleting the player data.
You’re definitely completely right about that. It rarely happens, so it should be replaced with something else such as:
- Disabling auto-saving
- Kicking the player
- Print out the error message for the players
This is the datastore that I always use.
local Module = {};
local ServerStorage = game:GetService("ServerStorage")
function Module:Load(plr,folder,GDS,key)
local Success,Data = pcall(GDS.GetAsync,GDS,key..plr.UserId);
if not (Success) then
plr.DataLoaded.Value = false;
return;
end
if (Data == nil) then
plr.DataLoaded.Value = true;
return;
end
if (Success) then
plr.DataLoaded.Value = true;
for i,v in next,Data do
if (folder:FindFirstChild(v.name)) then
folder:FindFirstChild(v.name).Value = v.value;
else
warn(v.name.." is not valid member of "..folder.Name);
end
end
end
end
function Module:Save(folder)
local Data = {};
for i,v in next,folder:GetChildren() do
local TempData = {
name = v.Name;
value = v.Value;
};
table.insert(Data,TempData);
end
return Data;
end
return Module;
function PlayerLeft(Player)
if (Player.DataLoaded.Value == false) then
return
end
local Data1 = DataStoreModule:Save(ServerStorage[Player.Name]);
local success,err = pcall(StatsData.SetAsync,StatsData,Key..Player.UserId,Data1);
end
Also, there is no need to use pcall here
Instead of that you need to wrap SetAsync in pcall
Wrapping the function in protected call mode isn’t the issue. That’s only helpful if you want to catch errors. Typically you should wrap DataStore calls in pcall but that’s not what’s happening here.
The issue is that OP is trying to save a CFrame value to a DataStore. You can’t do this. You need to save the individual values to allow it to work (i.e. CFrame.X, CFrame.Y, CFrame.Z).
That’s because a CFrame is comprised of it’s coordinates and a rotation matrix.