Player Not Receiving Uniform & Stats When Joining The Game

Every time I play test on Roblox Studio, the player occasionally doesn’t receive his uniform and assigned leader stats. From my knowledge, using a loop to detect if the player is fully loaded is bad practice and it is usually preferred to use bindable events but I am not quite sure on how to go about it.

repeat task.wait() until Player.CharacterAppearanceLoaded

The script in question:

local Players = game:GetService("Players")
local TeamService = game:GetService("Teams")
local ServerStorage = game:GetService("ServerStorage")

local RStorage = game:GetService("ReplicatedStorage")
local Teams = {
	"Allies";
	"Axis";
}

for _, v in ipairs(Teams) do
	local Team = Instance.new("StringValue")
	Team.Name = v
	Team.Parent = TeamService
end

Players.PlayerAdded:Connect(function(Player)
	local RandomTeam = Teams[math.random(1, #Teams)]
	local CurrentTeam = TeamService:WaitForChild(RandomTeam)
	local Team = Instance.new("ObjectValue")
	local TeamPlayer = Instance.new("StringValue")
	
	TeamPlayer.Name = "Team"
	TeamPlayer.Value = CurrentTeam.Name
	TeamPlayer.Parent = Player
	
	Team.Name = Player.Name
	Team.Value = Player
	Team.Parent = CurrentTeam
	
	Player.Team = TeamService[RandomTeam]
	
	Player.CharacterAdded:Connect(function(newCharacter)
		
		--repeat task.wait() until Player.CharacterAppearanceLoaded
		
		local Humanoid = newCharacter:FindFirstChildOfClass("Humanoid")
		local TeamName = RStorage:FindFirstChild("Textures").TeamName:Clone()
		
		TeamName.PlayerName.Text = Player.Name
		TeamName.Parent = newCharacter
		TeamName.Adornee = newCharacter.Head
		
		if TeamPlayer.Value == "Allies" then
			local NewShirt = ServerStorage:FindFirstChild("TeamUniforms").Americans.Shirt:Clone()
			NewShirt.Parent = newCharacter
			
			local NewPants = ServerStorage:FindFirstChild("TeamUniforms").Americans.Pants:Clone()
			NewPants.Parent = newCharacter		
			
			local AlliesHelmet = ServerStorage:FindFirstChild("TeamUniforms").Americans.AmericansHelmet:Clone()
			Humanoid:AddAccessory(AlliesHelmet)
		elseif TeamPlayer.Value == "Axis" then
			local NewShirt = ServerStorage:FindFirstChild("TeamUniforms").Germans.Shirt:Clone()
			NewShirt.Parent = newCharacter

			local NewPants = ServerStorage:FindFirstChild("TeamUniforms").Germans.Pants:Clone()
			NewPants.Parent = newCharacter
			
			local AxisHelmet = ServerStorage:FindFirstChild("TeamUniforms").Germans.GermansHelmet:Clone()
			Humanoid:AddAccessory(AxisHelmet)
		end
		
		newCharacter.Humanoid.Died:Connect(function()
			Player.leaderstats:FindFirstChild("Deaths").Value += 1
			Player.leaderstats:FindFirstChild("Killstreak").Value = 0
			if newCharacter.Humanoid:FindFirstChild("creator") then
				local Player = newCharacter.Humanoid.creator.Value
				local Leaderstats = Player.leaderstats
				Leaderstats.Kills.Value += 1
				Leaderstats.Killstreak.Value += 1
			end	
		end)
	end)
	
	local Statistics = Instance.new("Folder",Player)
	Statistics.Name = "leaderstats"
	
	local Kills = Instance.new("IntValue",Statistics)
	Kills.Value = 0
	Kills.Name = "Kills"
	
	local Deaths = Instance.new("IntValue",Statistics)
	Deaths.Value = 0
	Deaths.Name = "Deaths"
	
	local Killstreak = Instance.new("IntValue",Statistics)
	Killstreak.Value = 0
	Killstreak.Name = "Killstreak"
end)

Players.PlayerRemoving:Connect(function(PlayerRemoved)
	local User = TeamService:FindFirstChild(PlayerRemoved.Name, true)
	
	if (User) then
		User:Destroy()
	end
end)

From documentation:

local function onPlayerAdded(player)
	local loaded = player:HasAppearanceLoaded()
	print(loaded)

	while not loaded do
		loaded = player:HasAppearanceLoaded()
		print(loaded)
		task.wait()
	end
end

Found on this page:

Thanks for the help, I found a better solution by looping through every player in the game before listening to the PlayerAdded event, as the slightest delay can cause it not to fire.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.