Hi guys. Im trying to create a position saver with datastore. This part below is how i saved the data. The second part is where it reads nil aways instead of the saved value.
Why is this happening?
-- saving:
local playerUserId = "Player_"..player.UserId
local character = sessionData[playerUserId].Char
sessionData[playerUserId].X = character.HumanoidRootPart.CFrame.Position.X
sessionData[playerUserId].Y = character.HumanoidRootPart.CFrame.Position.Y
sessionData[playerUserId].Z = character.HumanoidRootPart.CFrame.Position.Z
sessionData[playerUserId].x = character.HumanoidRootPart.CFrame.LookVector.X
sessionData[playerUserId].y = character.HumanoidRootPart.CFrame.LookVector.Y
sessionData[playerUserId].z = character.HumanoidRootPart.CFrame.LookVector.Z
print("saved X =",sessionData[playerUserId].X)
local tries = 0
local success
local errormsg
repeat
tries = tries + 1
success, errormsg = pcall(function() playerData:SetAsync(playerUserId, sessionData[playerUserId]) end)
-- reading:
local data
local sussess, errormsg = pcall(function() data = playerData:GetAsync(playerUserId) end)
if data then -- se tiver
warn("DataStore downloaded for", player)
sessionData[playerUserId] = data
print("reading X =", sessionData[playerUserId].X) -- prints nil
spawn(function() -- this part is constanty atualizing character info for when player leaves.
while saving and player.Character do
if character.Humanoid.SeatPart ~= nil then
seat = character.Humanoid.SeatPart
end
if seat then
sessionData[playerUserId].Vehicle = character.Humanoid.SeatPart.Parent.Name
else
sessionData[playerUserId].Vehicle = "None"
end
sessionData[playerUserId].Char = player.Character
print(character, "saving")
wait(2)
end
end)
Notes: I checked that “sessionData[playerUserId].Char” is saving corectly with all infos needed. Also I tried putting a generic number instead of Position.X and it keeps returning nil instead of the number, same with string, to make sure I can save Position.XYZ in datastore. The “data” variable is sussessfuly returning a table. All the data saved comes just as “nil nil nil nil”. PCalls sucess and errormsgs are OK.
Whole code:
-- Set up table to return to any script that requires this module script
local PositionSaver = {}
local DataStoreService = game:GetService("DataStoreService")
local playerData = DataStoreService:GetDataStore("PlayerData")
-- Table to hold player information for the current session
local sessionData = {}
-- Function to add player to the "sessionData" table
local function LoadData(player)
repeat wait() until player.Character and player.Character.HumanoidRootPart
character = player.Character
local playerUserId = "Player_"..player.UserId
---Remove Data When Player is Loaded---
--playerData:RemoveAsync(playerUserId)
--playerData:RemoveAsync("Player_65654127")
---------------------------------------
local data
local sussess, errormsg = pcall(function() data = playerData:GetAsync(playerUserId) end)
print("Error: ", errormsg)
if data then -- se tiver
warn("DataStore baixada para", player)
sessionData[playerUserId] = data -- traz do dado da datastore para a sessiondata
player.Character:MoveTo(Vector3.new(sessionData[playerUserId].X,
sessionData[playerUserId].Y,sessionData[playerUserId].Z))
player.Character.HumanoidRootPart.Orientation = Vector3.new(sessionData[playerUserId].x,
sessionData[playerUserId].y, sessionData[playerUserId].z)
print(player, "replaced to:", sessionData[playerUserId].X,
sessionData[playerUserId].Y, sessionData[playerUserId].Z)
if sessionData[playerUserId].Vehicle ~= "None" and sessionData[playerUserId].Vehicle ~= nil then
print(player,"com veiculo: ", sessionData[playerUserId].Vehicle, " carregado.")
local veh = game.Workspace:FindFirstChild("Vehicles"):FindFirstChild(sessionData[playerUserId].Vehicle):Clone()
veh:SetPrimaryPartCFrame(character.HumanoidRootPart.CFrame)
character.Humanoid:Sit(veh.DriveSeat)
end
else -- user novo
sessionData[playerUserId] = {}
table.insert(sessionData[playerUserId], "X")
table.insert(sessionData[playerUserId], "Y")
table.insert(sessionData[playerUserId], "Z")
table.insert(sessionData[playerUserId], "x")
table.insert(sessionData[playerUserId], "y")
table.insert(sessionData[playerUserId], "z")
table.insert(sessionData[playerUserId], "Vehicle")
sessionData[playerUserId].Vehicle = "None"
table.insert(sessionData[playerUserId], "Char")
sessionData[playerUserId].Char = character
warn("DataStore nova criada para", player)
end
spawn(function()
while player.Character do
if character.Humanoid.SeatPart ~= nil
and character.Humanoid.SeatPart.Parent.Name ~= "None" then
sessionData[playerUserId].Vehicle = character.Humanoid.SeatPart.Parent.Name
else
sessionData[playerUserId].Vehicle = "None"
end
sessionData[playerUserId].Char = player.Character
wait(2)
end
end)
end
local function savePlayerData(player) -- called in autosave and in PlayerRemoving(SaveOnExit)
local playerUserId = "Player_"..player.UserId
local character = sessionData[playerUserId].Char
sessionData[playerUserId].X = character.HumanoidRootPart.CFrame.Position.X
sessionData[playerUserId].Y = character.HumanoidRootPart.CFrame.Position.Y
sessionData[playerUserId].Z = character.HumanoidRootPart.CFrame.Position.Z
sessionData[playerUserId].x = character.HumanoidRootPart.CFrame.LookVector.X
sessionData[playerUserId].y = character.HumanoidRootPart.CFrame.LookVector.Y
sessionData[playerUserId].z = character.HumanoidRootPart.CFrame.LookVector.Z
print("saved X =",sessionData[playerUserId].X)
local tries = 0
local success
local errormsg
repeat
tries = tries + 1
success, errormsg = pcall(function() playerData:SetAsync(playerUserId, sessionData[playerUserId]) end)
if not success then
wait(1)
warn("|retrying save data for", player,".|| Error:", errormsg)
end
until tries == 3 or success -- tries to save 3 times
if not success then
warn("Cannot save data for", player,".|| Error:", errormsg)
else
warn("Data de", player, "salva", "Error: ", errormsg)
end
end
----------------------------------------------------------------
game.Players.PlayerAdded:Connect(LoadData)
local RemoteEvent = game.ReplicatedStorage.RemoteEvent
RemoteEvent.OnServerEvent:Connect(function(plr, request)
if request == "love" then
savePlayerData(plr)
end
end)
----------------------------------------------------------------
return PositionSaver
