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

Data not saving, getting "error when saving data" ?

Asked by
Vlym 19
2 years ago
local dataStoreService = game:GetService("DataStoreService")
local playerData = dataStoreService:GetOrderedDataStore("PlayerData")
local teams = game:GetService("Teams")
local free = teams.Free
local leaderboard = workspace:FindFirstChild("Leaderboard")
local updateEvent = leaderboard:FindFirstChild("UpdateEvent")

game.Players.PlayerAdded:Connect(function(plr)
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = plr

    local arrests = Instance.new("IntValue")
    arrests.Value = 0
    arrests.Name = "Arrests"
    arrests.Parent = leaderstats

    local arrested = Instance.new("IntValue")
    arrested.Value = 0
    arrested.Name = "Arrested"
    arrested.Parent = leaderstats

    local playerUserId = "Player_"..plr.UserId
    local data = playerData:GetAsync(playerUserId)
    if data then
        arrests.Value = data["Arrests"]
        arrested.Value = data["Arrested"]
    --  plr.Team = data["Team"]
    --  print(plr.Team)
    else
        arrests.Value = 0
        arrested.Value = 0
    --  plr.Team = free
    --  print("put on free team")
    end
end)

local function createTable(player)
    local playerStats = {}
    for i,stat in pairs(player.leaderstats:GetChildren()) do
        playerStats[stat.Name] = stat.Value
    end
    --playerStats["Team"] = player.Team.Name
    return playerStats
end

local function onPlayerExit(player)
    local playerStats = createTable(player)
    print(playerStats)
    local success, errorMessage = pcall(function()
        local playerUserId = "Player_"..player.UserId
        print(playerUserId)
        playerData:SetAsync(playerUserId,playerStats)
    end)
    if not success then
        warn("error when saving data")
    end
end

game.Players.PlayerRemoving:Connect(onPlayerExit)

--game:BindToClose(onPlayerExit)

while true do
    for i,v in ipairs(game.Players:GetChildren()) do
        local leaderstats = v:FindFirstChild("leaderstats")
        if leaderstats then
            local arrests = leaderstats:FindFirstChild("Arrests")
            if arrests then
                local success, err = pcall(function()
                    playerData:SetAsync(v.Name,arrests.Value)
                end)
            end
        end
    end
    updateEvent:Fire()
    wait(60)
end

In the game, the player's arrests and arrested values are saved, and then put on a leaderboard for the top 5 player's in the game (the while true do loop). However the player's data is just not saving. I was thinking maybe it had something to do with playerData:SetAsync(v.Name,arrests.Value) and playerData:SetAsync(playerUserId,playerStats)

being a bit different in the way data is saved but i could be wrong.

0
b Vlym 19 — 2y

1 answer

Log in to vote
0
Answered by
Miniller 562 Moderation Voter
2 years ago
Edited 2 years ago

I ran your script and the errorMessage was Dictionary is not allowed in data stores.

I found this post on the Roblox devforum, where they used HttpService:JSONEncode and JSONDecode. (As they said in the post, your data could be lost)

You can use JSONEncode with SetAsync, and JSONDecode with GetAsync. The post also says how you can create the same stats(Instances - IntValue, etc)you had before. You would need to do something like this

First of all enable HttpService in your game by running this: game:GetService("HttpService").HttpEnabled = true

local HttpService = game:GetService("HttpService")

--saving
local success, errorMessage = pcall(function()
    local playerUserId = "Player_"..player.UserId
    playerData:SetAsync(playerUserId,HttpService:JSONEncode(playerStats))
end)


--reading
local data = HttpService:JSONDecode(HttpService:GetAsync(playerUserId))
for k,v in pairs(data) do
    local i = Instance.new("IntValue") --obviously this only works if every stat was an int. If not, you need to save the class name as well.
    i.Name = k
    i.Value = v
    i.Parent = player.leaderstats
end

(I didn't test this code)

Ad

Answer this question