So I’m making a system which allows staff at a school to award detentions, however I have come to the issue when referencing the player. I have a UI for the staff member to type the name of the student; and here’s the following code for when the user has chosen to click “send”:
local v = game.Players.LocalPlayer
for i,v in pairs(game.Players:GetPlayers()) do
local name = script.Parent.Parent.TextBox.Text
name.leaderstats.Detentions.Value = name.leaderstats.Detentions.Value + 1
I get the following error:
Players.E_Link.PlayerGui.StaffMenu.LogAnIncident.TextButton.LocalScript:5: attempt to index field ‘leaderstats’ (a nil value)
And I’m pretty sure this is because the code cannot find the player using the string provided.
You’re trying to index a string’s “leaderstats” field, yet a string doesn’t have such a field.
You first need to find the player object who that name belongs to, let’s write a separate function for that:
local function getPlayerFromName(name)
-- loop over all players:
for _, player in pairs(game:GetService("Players"):GetPlayers()) do
-- if their name matches (case insensitive), return with that player:
if player.Name:lower() == name:lower() then
-- if we reach the end of the for-loop, no player with that name was found
Then your code becomes:
-- find player from textbox text:
local player = getPlayerFromName(script.Parent.Parent.TextBox.Text)
-- if the player exists, increase their Detentions value in leaderstats:
if player then
player.leaderstats.Detentions.Value = player.leaderstats.Detentions.Value + 1
game.Players[name].leaderstats.Blah.Value = 0
I’m attempting to access the “Detentions” intvalue which is a child of leaderstats
Thank you, I tainted your code a little and now it works!
BuildThomas’s code is more robust, but mine works fine assuming the names are all correct. But yeah,
Both do the same thing, only the second one can use any string which means you can make it dynamic based on a variable. You also might want to include beforehand
if Game.Players:FindFirstChild(name) then
Just to make sure the player didn’t leave the game.
Among the currently supplied solutions, mind that:
game:GetService("Players")[playerName] will priorize properties over instances - if a player named “Name” enters your game,
game:GetService("Players")["Name"] will give you the name of the Players service, and not that player instance. It also errors if there’s no property with the supplied name, nor any child instance with the supplied name. If your staff members type in the username incorrectly, the code errors.
game:GetService("Players"):FindFirstChild(playerName) only checks if a child instance can be found with that name - it’s less prone to errors than the previous listed solution, but if you for some odd reason have non-Player instances directly inside of the Players service, this can give you those instances by mistake if a staff member types its name in. Weird case, but worth mentioning.
If your problem was solved, press the check mark (aka. “Solution” button) next to the reply that solved your problem instead of renaming the topic’s name to “[SOLVED]”.