Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Attempt to Index Local Field 'sessionData' (A Nil Value)?

Asked by 6 years ago

I've expanded upon the saving player data tutorial using this code,


-- Setup table that we will return to scripts that require the ModuleScript. local PlayerStatManager = {} -- Create variable for the DataStore. local DataStoreService = game:GetService('DataStoreService') local playerData = DataStoreService:GetDataStore('CURRENTLYTESTING1') -- Create variable to configure how often the game autosaves the player data. local AUTOSAVE_INTERVAL = 60 -- Number of times we can retry accessing a DataStore before we give up and create -- an error. local DATASTORE_RETRIES = 3 -- Table to hold all of the player information for the current session. local sessionData = {} -- Function the other scripts in our game can call to change a player's stats. This -- function is stored in the returned table so external scripts can use it. function PlayerStatManager:ChangeStat(player, statName, changeValue) sessionData[player][statName] = sessionData[player][statName] + changeValue end -- Function to retry the passed in function several times. If the passed in function -- is unable to be run then this function returns false and creates an error. local function dataStoreRetry(dataStoreFunction) local tries = 0 local success = true local data = nil repeat tries = tries + 1 success = pcall(function() data = dataStoreFunction() end) if not success then wait(1) end until tries == DATASTORE_RETRIES or success if not success then error('Could not access DataStore! Warn players that their data might not get saved!') end return success, data end -- Function to retrieve player's data from the DataStore. local function getPlayerData(player) return dataStoreRetry(function() return playerData:GetAsync(player.UserId) end) end -- Function to save player's data to the DataStore. local function savePlayerData(player) if sessionData[player] then return dataStoreRetry(function() return playerData:SetAsync(player.UserId, sessionData[player]) end) end end -- Function to add player to the sessionData table. First check if the player has -- data in the DataStore. If so, we'll use that. If not, we'll add the player to -- the DataStore. local function setupPlayerData(player) local success, data = getPlayerData(player) if not success then -- Could not access DataStore, set session data for player to false. sessionData[player] = false else if not data then -- DataStores are working, but no data for this player sessionData[player] = {FirstTimePlaying = true, TotalEggs = 0} savePlayerData(player) print(player.Name.." has been given first-time stats") else -- DataStores are working and we got data for this player sessionData[player] = data print(player.Name.." has been given back their stats") end end end -- Function to run in the background to periodically save player's data. local function autosave() while wait(AUTOSAVE_INTERVAL) do for player, data in pairs(sessionData) do savePlayerData(player) end end end -- Bind setupPlayerData to PlayerAdded to call it when player joins. game.Players.PlayerAdded:connect(setupPlayerData) -- Call savePlayerData on PlayerRemoving to save player data when they leave. -- Also delete the player from the sessionData, as the player isn't in-game anymore. game.Players.PlayerRemoving:connect(function(player) savePlayerData(player) sessionData[player] = nil end) -- Start running autosave function in the background. spawn(autosave) -- Return the PlayerStatManager table to external scripts can access it. return {PlayerStatManager, sessionData}

and I attempt to call sessionData in this script

local result = PlayerStatManager.sessionData[player].FirstTimePlaying

but I get the error in the title. Does this mean the table doesn't array doesn't exist, if so, why?

0
Are you maybe trying to access sessionData before it's been initialized in one way or another by setupPlayerData? Reading and writing to datastores isn't instant, so if you're trying to get "result" before setupPlayerData has finished, sessionData[player] would be nil. Try somthing like "while not sessionData[player] do wait()"... to only run result AFTER data exists. whenallthepigsfly 541 — 6y
0
@whenallthepigsfly Hm. That didn't fix it. BouncingBrenda 44 — 6y

Answer this question