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

Datastore access issues....how do I work these tables?

Asked by
buu963 5
5 years ago

Hey all,

Pretty new to roblox coding. Took a few introductory classes in HS and college, but it's been a few years since I've done any actual coding. Very interested in learning though, so if anyone has a solution to my problem, please let me know!

I'm having some problems with datastores. I'm using the datastore that was used in the Datastores tutorial, and I can get my data to increment, but when trying to access the data in other scripts, I can't seem to make it work. Currently trying to get a value from my datastore to show on the leaderboard. Pretty sure the issue is me not fully understanding tables. I can often return the player and the value, but I can't get the value alone to return.

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

-- 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.
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)
    while(not (sessionData[player] and sessionData[player][statName]))do
        wait(1)
    end
    sessionData[player][statName] = sessionData[player][statName] + changeValue
    print("Incremented",statName,"by",changeValue,"for",player)
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 PlayerStatManager:getPlayerData(player, statName)
    return dataStoreRetry(function()
        return sessionData[player][statName]
    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)
    print("Setting up data for",player)
    local success, data = getPlayerData(player)
    print(player,success,data)
    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] = {Money = 0, Experience = 0, BlueEssence = 0}
            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

for _,plr in pairs(game.Players:GetPlayers())do
    setupPlayerData(plr)
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


local PlayerStatManager = require(game.ServerStorage.PlayerStatManager)
-- After player joins we'll periodically give the player money and experience
game.Players.PlayerAdded:connect(function(player)
    local gamer = PlayerStatManager:getPlayerData(player, 'Money')
    print (gamer)

    local leaderstats = Instance.new("Model")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    local money = Instance.new("IntValue")
    money.Name = "Money"
    money.Value = PlayerStatManager:getPlayerData(player, 'Money')
    money.Parent = leaderstats


    PlayerStatManager:ChangeStat(player, 'Money', 5)
    PlayerStatManager:ChangeStat(player, 'Experience', 1)
    print("ok")
end)




Answer this question