Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

How do I access saved PlayerData?

So I did the Saving Player Data tutorial on the ROBLOX Wiki but it never told me how a script would access the data? I want the data to be stored in a variable for another script.

The script I wrote from the tutorial

-- 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('PlayerData')
 
-- Create variable to configure how often the game autosaves the player data.
local AUTOSAVE_INTERVAL = 60

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

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] = {Shirt = "rbxassetid://1", Pants = "rbxassetid://624636052"}
			savePlayerData(player)
		else
			-- DataStores are working and we got data for this player
			sessionData[player] = data
		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

The script I want to make variables for

local PlayerStatManager = require(game.ServerStorage.PlayerStatManager)

game.Players.PlayerAdded:connect(function(player)
	player.CharacterAdded:connect(function(character)
		if character:findFirstChild("Shirt") ~= nil then
			character.Shirt.ShirtTemplate = "http://www.roblox.com/asset/?id=" .. Shirt
		else
			local newshirt = Instance.new("Shirt")
			newshirt.Parent = character
			newshirt.Name = "Shirt"
			newshirt.ShirtTemplate = "http://www.roblox.com/asset/?id=" .. Shirt
		end
		if character:findFirstChild("Pants") ~= nil then
			character.Pants.PantsTemplate = "rbxassetid://" .. Pants
		else
			local newPants = Instance.new("Pants")
			newPants.Parent = character
			newPants.Name = "Pants"
			newPants.PantsTemplate = "rbxassetid://" .. Pants
		end
	end)
end)

1 answer

✓ Accepted answer

Well you would need to access the array that holds the player data (sessionData). To access the playes data do

PlayerStatManager.sessionData = {} 

instead of local then when you want to access it just call PlayerStatManager.sessionData[player].You could just return both the arrays

return {PlayerStatManger, sessionData}

,but they both do the same thing basically.

2 comments

0

how do i get the shirt and pants variable out of that

0

PlayerStatManager.sessionData[player].Shirt/PlayerStatManager.sessionData[player].Pants

This discussion is preserved as it was. New answers, comments, and votes are closed.