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

How to fix "Invalid argument #2 (string expected, got nil) error?

The error happens on the teamPlayer function: "local newTeam = playerFrame[team]" On line 94

local playersService = game:GetService('Players');
local localPlayer = playersService.LocalPlayer;
local localName = localPlayer.Name;

local leaderboardGUI = script.Parent;
local mainFrame = leaderboardGUI.mainFrame;
local playersFrame = mainFrame.playersFrame;
local listLayout = playersFrame.UIListLayout;
local nameLabel = mainFrame.nameLabel;
local rankStatusLabel = mainFrame.rankStatusLabel;
local prisonTimeStatusLabel = mainFrame.prisonTimeStatusLabel;
local playerFrame = script.playerFrame:Clone();
script.playerFrame:Destroy();
local teamFrame = script.teamFrame:Clone();
script.teamFrame:Destroy();

local players = {};

local replicatedStorage = game:GetService('ReplicatedStorage');
local networkEvent = replicatedStorage.networkEvent;
local networkFunction = replicatedStorage.networkFunction;

local newUDim2 = UDim2.new;
local tabKeyCode = Enum.KeyCode.Tab;
local coroutineWrap = coroutine.wrap;

game:GetService('StarterGui'):SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, false);

local function resizePlayersFrame()
	local totalY = 0;
	for i, v in next, playersFrame:GetChildren() do
		if v:IsA('ImageLabel') and v.Visible then
			totalY = totalY + v.Size.Y.Offset + 3;
		end;
	end;
    playersFrame.CanvasSize = newUDim2(0, 0, 0, totalY);
end;

listLayout:GetPropertyChangedSignal('AbsoluteContentSize'):Connect(function()
	resizePlayersFrame();
end);

for i, v in next, game:GetService('Teams'):GetChildren() do
	local teamName = v.Name;
	local teamFrame = teamFrame:Clone();
	teamFrame.Name = teamName;
	teamFrame.nameLabel.Text = teamName;
	teamFrame.ImageColor3 = v.TeamColor.Color;
	teamFrame.Visible = false;
	teamFrame.LayoutOrder = i - 1;
	teamFrame:GetPropertyChangedSignal('Visible'):Connect(function()
		resizePlayersFrame();
	end);
	teamFrame.Parent = playersFrame;
end;

local function addPlayer(name, premium, rank, prisonTime)
	local playerFrame = playerFrame:Clone();
	playerFrame.nameLabel.Text = name;
	playerFrame.premiumImage.Visible = premium;
	playerFrame.rankStatusLabel.Text = rank;
	--playerFrame.prisonTimeStatusLabel.Text = prisonTime;
	playerFrame.Parent = playersFrame;
	return playerFrame;
end;

local function updatePlayer(name, status, data)
	if not players[name] then return; end;
	players[name][1][status .. 'Label'].Text = data;
end;

local function removePlayer(name)
	if not players[name] then return; end;
	local oldTeam = players[name][2];
	players[name][1]:Destroy();
	players[name] = nil;
	if oldTeam then
		local found = false;
		for i, v in next, players do
			if v[2] == oldTeam then
				found = true;
				break;
			end;
		end;
		if not found then
			playersFrame[oldTeam].Visible = true;
		end;
	end;
end;

local function teamPlayer(name, team)
	if not players[name] then return; end;
	local oldTeam = players[name][2];
	local newTeam = playersFrame[team];
	if not newTeam.Visible then
		newTeam.Visible = true;
	end;
	players[name][1].LayoutOrder = newTeam.LayoutOrder;
	players[name][2] = team;
	if oldTeam then
		local found = false;
		for i, v in next, players do
			if v[2] == oldTeam then
				found = true;
				break;
			end;
		end;
		if not found then
			playersFrame[oldTeam].Visible = false;
		end;
	end;
end;

for i, v in next, playersService:GetPlayers() do
	coroutineWrap(function()
		local name, premium, rank, prisonTime, team = networkFunction:InvokeServer('GetPlayerData', v);
		if name then
			if not players[name] then
				players[name] = {addPlayer(name, premium, rank, prisonTime, team)};
				teamPlayer(name, team);
			end;
		end;
	end)();
end;

networkEvent.OnClientEvent:Connect(function(event, ...)
	if event == 'NewPlayer' then
		local name, premium, rank, prisonTime, team = ...;
		if players[name] then return; end;
		players[name] = {addPlayer(...)};
		teamPlayer(name, team);
	elseif event == 'UpdatePlayer' then
		if ({...})[1] == localName then 
			local name, status, data = ...;
			if status == 'prisonTimeStatus' then
				prisonTimeStatusLabel.Text = data;
			elseif status == 'rankStatus' then
				rankStatusLabel.Text = data;
			end;
		end;
		updatePlayer(...);
	elseif event == 'TeamPlayer' then
		teamPlayer(...);
	elseif event == 'RemovePlayer' then
		removePlayer(...);
	end;
end);

if not localPlayer:IsDescendantOf(game) then
	localPlayer:GetPropertyChangedSignal('Parent'):Wait();
end;

nameLabel.Text = localPlayer.Name;
rankStatusLabel.Text = localPlayer:GetRoleInGroup(3151317);
prisonTimeStatusLabel.Text = localPlayer:WaitForChild('leaderstats'):WaitForChild('Prison Time').Value;

game:GetService('UserInputService').InputBegan:Connect(function(input, onGUI)
	if onGUI then return; end;
	if input.KeyCode == tabKeyCode then
		leaderboardGUI.Enabled = not leaderboardGUI.Enabled;
	end;
end);

1 answer

In your teamPlayer function, it is expecting two arguments, a "name" and a "team" based on it's definition:

local function teamPlayer(name, team)
	-- . . .
end

The error is indicating that no value or a nil value is being passed to the team parameter.

I've investigated your code, and it appears that you are ultimately getting this team, which is a string, from the server. You have remote events and remote functions that pass varieties of information which in some cases is being funneled directly into the teamPlayer func.

This means, it's time for you to start debugging. Check on the server-side scripts, locate the portion where you acquire/create the data you are sending to the client for the purpose of the function I named above. Double check variables, print out values, and make sure that the "team" actually exists in the variable you think before sending it to the client.

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