Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

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

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)

4 comments

0

You can't use LocalPlayer in a serverscript.

0

How else can I access the player?

0

Erm getting it at the PlayerAdded event?

0

Check my new answer OurAuthority (also sorry if I'm bad at explaining)

1 answer

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)

7 comments

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.

0

It goes through all of the if statements for some reason and doesnt even do the setasync. https://i.gyazo.com/8b3fbb7975d9a146558ac3cba1fd5ee5.png

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

0

Is there a way to fix that?

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

0

replace the function on line 79 with the code above

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)

This discussion is preserved as it was. New answers, comments, and votes are closed.