Hello, I’m re-writing my DataStore to save everything in one table/dictionary, when I get to saving the data (PlayerRemoving) and run the pcall, nothing happens. It doesn’t print the success or error message.
The actual table/dictionary is as follows →
Data = {crystals=(IntValue),gems=(IntValue),doors=(table of bool values),items=(table of int values)}
When I try and run the pcall:
local Datasuccess, DataErrorMsg = pcall(function()
DataSave:SetAsync(DataKey,Data)
end)
Nothing happens, in the if statement to check weather it returns as an error or success, nothing happens as well. If I put a print() statement above the SetAsync() it prints, but below it doesn’t print. Leading me to believe the SetAsync() isn’t firing and I’m not sure why.
The table is correct as well, if I print each part of the table/dictionary it returns correctly, I’m not sure what I might be missing so any help is appreciated. Thanks in advanced,
~Notrealac0unt
No need to sign your posts, your username is already on your posts.
I don’t know what you mean?
:SetAsyncwas called, you probably didn’t print the information given correctly.
-- I used this code and it works.
local successful, exception_data = pcall(DataSave.SetAsync, DataSave, DataKey, Data)
print(successful and "Yes" or "No", exception_data or "NO FAIL :D")
I have correctly set the print statement to print either a yes or no if it saved. I also tried your method above using the pcall() and still no print or error was given.
However, when I load the game Data is presented as “nil” and I get the following error message. attempt to index local ‘Data’ (a nil value)
This error is given when I join the game within a PlayerAdded function, and have looked into this error as well with no success as to fix it.
-- Data
local Data -- This is for the Int Values
local DoorData -- Data Table for the table of bool values
local ItemData -- Data Table for the table of int values
local DataSuccess, DataErrorMsg = pcall(function()
Data = DataSave:GetAsync(DataKey)
end)
if DataSuccess then
cry.Value = Data.crystals -- where the error originated from
gms.Value = Data.gems
for i, v in pairs(drs:GetChildren()) do
local DataTable = Data.doors
v.Value = DataTable[i]
end
for a, b in pairs(itms:GetChildren()) do
local DataTable = Data.items
b.Value = DataTable[a]
end
else
warn(DataErrorMsg)
end
Now this probably isn’t all that great code, so any tips to improve it would be nice as well as I’m still learning same with the saving section.
local function GetDoorValues()
local DoorValues = {}
for _, v in pairs(d_folder:GetChildren()) do
table.insert(DoorValues,v.Value)
end
return DoorValues
end
local function GetItemValues()
local ItemValues = {}
for _, v in pairs(i_folder:GetChildren()) do
table.insert(ItemValues,v.Value)
end
return ItemValues
end
local d = GetDoorValues() -- works
local i = GetItemValues() -- works
local Data = {crystals=c.Value,gems=g.Value,doors=d,items=i} -- table/dictionary is correct printing each section correctly
-- Data
local Datasuccess, DataErrorMsg = pcall(DataSave.SetAsync,DataSave,DataKey,Data)
print(Datasuccess) -- this doesn't print
print(DataErrorMsg)-- this doesn't print either
Also I tried different methods of the pcall as well. Like the first one in the original post but that didn’t work either.
This is a terrible way to use pcall. Don’t use the call as the condition of an if statement, use what it returns as the condition of an if statement. You’re effectively throwing away the values by using pcall as the condition of an if statement which defeats the purpose of it being an error handler.
local function doSomething()
print(a[i])
end
local success, ret = pcall(doSomething)
if success then
-- Succeeded
if ret then
-- We have returned data
else
-- We do not have returned data
end
else
-- Not successful
end