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

How do you set the value of one leaderstat if one has already been changed?

Asked by 4 years ago

Hello I am trying to make a script that everytime the players level is updated it will check to see if that level meets a certain specification and if it does it will change another leaderstat called rank.

Below is my script but I keep getting

 02:45:05.920 - ServerScriptService.Data:101: attempt to index field 'LocalPlayer' (a nil value)

As my error.

-- Save Data

local DataStoreService = game:GetService("DataStoreService")
local myDataStore = DataStoreService:GetDataStore("myDataStore")

game.Players.PlayerAdded:Connect(function(player)

    ------------------- Level
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player

    local level = Instance.new("IntValue")
    level.Name = "Level"
    level.Parent = leaderstats

    local data
    local success, errormessage = pcall(function ()
        data = myDataStore:GetAsync(player.UserId.."- Level")
    end)

    if success then
        player.leaderstats.Level.Value = data
        print("Grabed Data")
    else
        print("Unable to Grab Data")
        warn(errormessage)
    end

    -----------------------


    ----------------------- Ranks
    local rank = Instance.new("StringValue")
    rank.Name = "Rank"
    rank.Value = "Empty"
    rank.Parent = leaderstats

    local RankStat
    local success, errormessage = pcall(function ()
        RankStat = myDataStore:GetAsync(player.UserId.."- Rank")
    end)

    if success then
        player.leaderstats.Rank.Value = tostring(RankStat)
        print("Grabed Rank")
    else
        print("Unable to Grab Rank")
        warn(errormessage)
    end

    if player.leaderstats.Level.Value == 0 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Cadet")
        print("Player: "..player.UserId.." is a Cadet")
    end

    if player.leaderstats.Level.Value > 5 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Midshipman")
    end

    if player.leaderstats.Level.Value > 10 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Master")
    end

    if player.leaderstats.Level.Value > 15 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Master")
    end

    if player.leaderstats.Level.Value > 20 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Lieutenant")
    end

    if player.leaderstats.Level.Value > 25 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Commander")
    end

    if player.leaderstats.Level.Value > 30 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Captain")
    end

    if player.leaderstats.Level.Value > 35 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Commodore")
    end
end)

game.Players.PlayerRemoving:Connect(function(player)

    local success, errormessage = pcall(function()
        myDataStore:SetAsync(player.UserId.."- Level",player.leaderstats.Level.Value)       
    end)    

    if success then
        print("Data Stored")
    else
        print("Error Saving Data")
        warn(errormessage)
    end
end)


game.Players.LocalPlayer.leaderstats.Level.Changed:Connect(function(player)
    if player.leaderstats.Level.Value == 0 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Cadet")
        print("Player: "..player.UserId.." is a Cadet")
    end

    if player.leaderstats.Level.Value > 5 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Midshipman")
    end

    if player.leaderstats.Level.Value > 10 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Master")
    end

    if player.leaderstats.Level.Value > 15 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Master")
    end

    if player.leaderstats.Level.Value > 20 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Lieutenant")
    end

    if player.leaderstats.Level.Value > 25 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Commander")
    end

    if player.leaderstats.Level.Value > 30 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Captain")
    end

    if player.leaderstats.Level.Value > 35 then
        myDataStore:SetAsync(player.UserId.."- Rank", "Commodore")
    end
end)
0
You can't use LocalPlayer in a serverscript. pawtrails 5 — 4y
0
How else can I access the player? OurAuthority 5 — 4y
0
Erm getting it at the PlayerAdded event? Sonnenroboter 336 — 4y
0
Check my new answer OurAuthority (also sorry if I'm bad at explaining) ManlikeAzan 90 — 4y

1 answer

Log in to vote
0
Answered by 4 years ago
Edited 4 years ago

Your issue is that server scripts cannot use "game.Players.LocalPlayer"...

On line 101 move the entire function into the "PlayerAdded" function.

another issue is that you're trying to use the value in the Changed() function. Changed() returns the property not the player

this should work: (EDIT: I forgot to change some of the variables, now it should work)

-- Save Data

local DataStoreService = game:GetService("DataStoreService")
local myDataStore = DataStoreService:GetDataStore("myDataStore")

game.Players.PlayerAdded:Connect(function(playa)

    ------------------- Level
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = playa

    local level = Instance.new("IntValue")
    level.Name = "Level"
    level.Parent = leaderstats

    local data
    local success, errormessage = pcall(function ()
        data = myDataStore:GetAsync(playa.UserId.."- Level")
    end)

    if success then
        playa.leaderstats.Level.Value = data
        print("Grabed Data")
    else
        print("Unable to Grab Data")
        warn(errormessage)
    end



    -----------------------

game.Players[playa.Name].leaderstats.Level.Changed:Connect(function(val)
    if playa.leaderstats.Level.Value == 0 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Cadet")
        print("Player: "..playa.UserId.." is a Cadet")
    end

    if playa.leaderstats.Level.Value > 5 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Midshipman")
    end

    if playa.leaderstats.Level.Value > 10 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Master")
    end

    if playa.leaderstats.Level.Value > 15 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Master")
    end

    if playa.leaderstats.Level.Value > 20 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Lieutenant")
    end

    if playa.leaderstats.Level.Value > 25 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Commander")
    end

    if playa.leaderstats.Level.Value > 30 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Captain")
    end

    if playa.leaderstats.Level.Value > 35 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Commodore")
    end
end)
    ----------------------- Ranks
    local rank = Instance.new("StringValue")
    rank.Name = "Rank"
    rank.Value = "Empty"
    rank.Parent = leaderstats

    local RankStat
    local success, errormessage = pcall(function ()
        RankStat = myDataStore:GetAsync(playa.UserId.."- Rank")
    end)

    if success then
        playa.leaderstats.Rank.Value = tostring(RankStat)
        print("Grabed Rank")
    else
        print("Unable to Grab Rank")
        warn(errormessage)
    end

    if playa.leaderstats.Level.Value == 0 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Cadet")
        print("Player: "..playa.UserId.." is a Cadet")
    end

    if playa.leaderstats.Level.Value > 5 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Midshipman")
    end

    if playa.leaderstats.Level.Value > 10 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Master")
    end

    if playa.leaderstats.Level.Value > 15 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Master")
    end

    if playa.leaderstats.Level.Value > 20 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Lieutenant")
    end

    if playa.leaderstats.Level.Value > 25 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Commander")
    end

    if playa.leaderstats.Level.Value > 30 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Captain")
    end

    if playa.leaderstats.Level.Value > 35 then
        myDataStore:SetAsync(playa.UserId.."- Rank", "Commodore")
    end
end)

game.Players.PlayerRemoving:Connect(function(player)

    local success, errormessage = pcall(function()
        myDataStore:SetAsync(player.UserId.."- Level",player.leaderstats.Level.Value)       
    end)    

    if success then
        print("Data Stored")
    else
        print("Error Saving Data")
        warn(errormessage)
    end
end)
0
Okay so I think I figured it out. You stated the changed function returns the value of what was changed. So I changed the playa.leaderstats.level.value to just the Val variable in the function and all of the prints are working. but now the async doesnt seem to be updating and I believe that's because of the scripts hierarchy. OurAuthority 5 — 4y
0
It goes through all of the if statements for some reason and doesnt even do the setasync. https://i.gyazo.com/8b3fbb7975d9a146558ac3cba1fd5ee5.png OurAuthority 5 — 4y
0
the async IS updating correctly, just that the script most likely tried to grab the data faster than it was able to set the data ManlikeAzan 90 — 4y
0
Is there a way to fix that? OurAuthority 5 — 4y
View all comments (3 more)
0
if success then if RankStat == nil then playa.leaderstats.Rank.Value = "Empty" else playa.leaderstats.Rank.Value = tostring(RankStat) print("Grabed Rank") end else print("Unable to Grab Rank") warn(errormessage) end ManlikeAzan 90 — 4y
0
replace the function on line 79 with the code above ManlikeAzan 90 — 4y
0
It shows up empty when I first join then after I attempt to change their level I get this error. 12:19:52.687 - ServerScriptService.Data:85: attempt to index local 'val' (a number value) OurAuthority 5 — 4y
Ad

Answer this question