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

Why is this module script giving errors?

Asked by 7 years ago
Edited 7 years ago

I have a module script that saves player data, but it is giving me errors all over the place when trying to find player data.

local PlayerStatManager = {}


local DataStoreService = game:GetService('DataStoreService')
local playerData = DataStoreService:GetDataStore('PlayerData')

-- 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:ChangeData(player, store, dataName, changeValue)
    sessionData[player][store][dataName] = sessionData[player][store][dataName] + changeValue
end

-- Function to retrieve player's data from the DataStore.
function PlayerStatManager:getPlayerData(player, store)
    local key = store .. "_" .. player.UserId
    return playerData:GetAsync(key)
end

-- Function to save player's data to the DataStore.
function PlayerStatManager:savePlayerData(player)
    local stores = {"stats", "attributes", "items"}
    for i = 1, #stores do
        local key = stores[i] .. '_' .. player.UserId
        playerData:SetAsync(key, sessionData[player][stores[i]])
    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.


function PlayerStatManager:setupPlayerData(player)
    local statsData = self:getPlayerData(player, "stats")
    local attributesData = self:getPlayerData(player, "attributes")
    local itemsData = self:getPlayerData(player, "items")
    if not (statsData and attributesData and itemsData) then

        sessionData[player] = {stats = {}, attributes = {}, items = {}}

        sessionData[player]["stats"] = {Coins = 0, Gold = 0, Level = 1, cpCurrent = 0, 
            cpMax = 0, cpPerLvl = 0, cpRecovery = 0, expCurrent = 0, 
            expNeeded = 0, hpMax = 75}

        sessionData[player]["attributes"] = {CON = 5, 
            DEX = 5, END = 5, STR = 5, freePTs = 6}

        sessionData[player]["items"] = {

        }


        self:savePlayerData(player)
    elseif (statsData and attributesData and itemsData) then
        -- DataStores are working and we got data for this player
        sessionData[player]["stats"] = statsData
        sessionData[player]["attributes"] = attributesData
        sessionData[player]["itemsData"] = itemsData
    else
        print("ERROR! " .. player.UserId .. " has some data but not all!")
    end
end

-- Return the PlayerStatManager table to external scripts can access it.
return PlayerStatManager

Here is an example of a call to the module script from a local script

local attributes = PlayerStatManager:getPlayerData(player, "attributes")
local stats = PlayerStatManager:getPlayerData(player, "stats")
local END = attributes["END"]
for i = 1, END, 1 do
    PlayerStatManager:ChangeData(player, "stats", "hpMax", stats["hpMax"] * 0.025)
end

Error Log

17:44:36.020 - Auto-Saving...
Finished Loading.
17:44:53.437 - ServerStorage.PlayerStatManager:14: attempt to index field '?' (a nil value)
17:44:53.438 - Stack Begin
17:44:53.439 - Script 'ServerStorage.PlayerStatManager', Line 14 - method ChangeData
17:44:53.477 - Script 'Players.Player1.PlayerGui.interface.Frame.LocalScript', Line 46
17:44:53.478 - Stack End
17:44:53.528 - ServerStorage.PlayerStatManager:60: attempt to index field '?' (a nil value)
17:44:53.529 - Stack Begin
17:44:53.529 - Script 'ServerStorage.PlayerStatManager', Line 60 - method setupPlayerData
17:44:53.530 - Script 'Workspace.Setup', Line 6
17:44:53.530 - Stack End
17:44:58.360 - ServerStorage.PlayerStatManager:28: attempt to index field '?' (a nil value)
17:44:58.361 - Stack Begin
17:44:58.363 - Script 'ServerStorage.PlayerStatManager', Line 28 - method savePlayerData
17:44:58.363 - Script 'Workspace.Setup', Line 17
17:44:58.364 - Stack End
17:45:00.104 - ServerStorage.PlayerStatManager:28: attempt to index field '?' (a nil value)
17:45:00.105 - Stack Begin
17:45:00.105 - Script 'ServerStorage.PlayerStatManager', Line 28 - method savePlayerData
17:45:00.106 - Script 'Workspace.Setup', Line 10
17:45:00.106 - Stack End

It appears that the nested tables I created are not working, in that I could be trying to access them the wrong way. I just can't seem to figure it out after looking at it all day.

0
What are the errors? TheDeadlyPanther 2460 — 7y
0
Have you require'd your module script? As in, is 'PlayerStatManager' in your main script equal to 'require(game.ServerStorage.PlayerStatManager)'? honeygold13843 136 — 7y
0
yes dragonkeeper467 453 — 7y

Answer this question