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

{NEED HELP} why is the obby script im using not saving the stages?

Asked by 5 years ago

I was trying to make an obby system checkpoint that saves your stage but it doesnt seem to work. This is what the output says:

RegularRival has no data 15:19:05.771 - ServerScriptService.PlrHandler:64: attempt to index local 'part' (a nil value)

15:19:18.962 - ServerScriptService.ObbyHandler:27: attempt to index local 'stage' (a number value)

These are the 2 script that i used:

ObbyHandler

local obbyStages = workspace:WaitForChild("ObbyStages")

for _,stage in pairs(obbyStages:GetChildren()) do

    stage.Touched:connect(function(hit)

        local hum

        if hit.Parent:FindFirstChild("Humanoid") then

            hum = hit.Parent.Humanoid

        end

        if hit.Parent and hit.Parent.Parent:FindFirstChild("Humanoid") then

            hum = hit.Parent.Parent.Humanoid

        end

        if hum then

            local plr = game.Players:GetPlayerFromCharacter(hum.Parent)

            local stage = plr.leaderstats.Stage.Value

            if tonumber(stage.Name) == plr + 1 then

                plr.leaderstats.Stage.Value = plr.leaderstats.Stage.Value + 1

            elseif tonumber(stage.Name) > plr + 1 then

                hum.Health = 0 

            end

        end

    end)

end

PlrHandler

local players = game:GetService("Players")
local dataStoreService = game:GetService("DataStoreService")
local saveDataStore = dataStoreService:GetDataStore("SaveDataTest")

local function savePlrData(plr)

    local success,err = pcall(function()

        local saveData = {}

        for _,stat in pairs(plr.Leaderstats:GetChildren()) do

            saveData[stat.Name] = stat.Value

        end

        saveDataStore:SetAsync(plr.UserId,saveData)

    end)

    if not success then return err end

end

players.PlayerAdded:connect(function(plr)

    local stats = Instance.new("Folder")
    stats.Name = "leaderstats"
    stats.Parent = plr

    local stage = Instance.new("IntValue")
    stage.Name = "Stage"
    stage.Parent = stats

    local data = saveDataStore:GetAsync(plr.UserId)

    if data then

        print(data.Stage)

        for _,stat in pairs(stats:GetChildren()) do

            stat.Value = data[stat.Name]

        end

    else

        print(plr.Name .. " has no data")

    end

    plr.CharacterAdded:connect(function(char)

        local humanoid,hrp = char:WaitForChild("Humanoid"),char:WaitForChild("HumanoidRootPart")

        wait()

        if humanoid and hrp then

            if stage.Value == 0 then

                local part = workspace.ObbyStages:FindFirstChild(stage.Value)
                hrp.CFrame = part.CFrame + Vector3.new(0, 1, 0)

            end

        end

    end)

end)

players.PlayerRemoving:connect(function(plr)

    local err = savePlrData(plr)

    if err then print(err) end

end)

game:BindToClose(function()

    for _,plr in pairs(players:GetPlayers()) do

        local err = savePlrData(plr)

        if err then print(err) end

    end

    wait(2)

end)

By the way i am also new to scripting so sorry for the mistakes.

0
In PlrHandler: `local part = workspace.ObbyStages:FindFirstChild(stage.Value)` returns nil, make sure it actually contains the given child or make sure to check your value if it's correct. User#834 0 — 5y
0
In ObbyHandler: `local stage = plr.leaderstats.Stage.Value` is the actual value of your leaderstats, afterwards you attempt to call .Name on a number, which is not allowed. Make sure stage is the actual leaderstats value itself, not the value of the leaderstats value. User#834 0 — 5y

Answer this question