Player.CharacterAppearanceLoaded not firing Clientside

Title basically said it all.

This event fires for Scripts but not LocalScripts.

The documentation makes no mention of this behavior, so I’m filing it as a bug. If this is intended and should be a documentation request, I’ll make a feature request instead to ask for it on clients because there’s no reason for it not to be.

The event is important because I need my code to add all the character objects into a raycasting ignorelist and alter transparency, but CharacterAdded is fired while the character Model still has no children so I need to use the loaded event.

Currently, I use CharacterAdded with a wait(2) in it.

Repro:

Reset your character a few times while checking the Output.

Script in ServerScriptService:

local Player = game.Players.PlayerAdded:Wait()

Player.CharacterAdded:Connect(function(Char)
	print("CharacterAdded:",#Char:GetChildren())
	wait(2)
	print("CharacterAdded after 2 seconds:",#Char:GetChildren())
end)

Player.CharacterAppearanceLoaded:Connect(function(Char)
	print("CharacterAppearanceLoaded:",#Char:GetChildren())
end)

LocalScript in StarterPlayerScripts:

local Player = game.Players.LocalPlayer

Player.CharacterAdded:Connect(function(Char)
	print("CharacterAdded:",#Char:GetChildren())
	wait(2)
	print("CharacterAdded after 2 seconds:",#Char:GetChildren())
end)

Player.CharacterAppearanceLoaded:Connect(function(Char)
	print("CharacterAppearanceLoaded:",#Char:GetChildren())
end)
31 Likes

Yes, this is a major problem for me, but I found a way to sorta work around it by taking code from RbxCharacterSounds.

3 Likes

Yes–I don’t think it ever did–It’s been discussed before:

Just looked at my own code, and I never attempt to use it client-side.

2 Likes

Bumping, this is a serious issue. As someone trying to take advantage of Viewport Frames to create a dynamic character editor, I should be able to know when a character’s appearance has loaded on the client.

12 Likes

Just ran into this today.

HOW is this still broken? It’s been nearly 3 years? Combined with how messy the avatar loading is to begin with - it’s likely people have just given up trying to navigate these APIs.

3 Likes

Bump, please fix this issue roblox.

4 Likes

Bump, this is very annoying. Idk how this is not fixed yet…?

4 Likes

Thanks for the report. We filed a ticket to our internal database.

5 Likes

I ended up writing a custom character loader because these events are too broken and there’s been no initiative to fix them for developers. It seems like many other devs have come to similar conclusions and are sharing solutions.

CharacterAdded also behaves differently on the server vs client. I would just avoid all of these events if you want your game to run stable, use a custom API!

3 Likes

More than 3 years after this post was made and this feature is still broken, I’m honestly very disappointed that this hasn’t been fixed yet.

1 Like

it is ridiculous to think i can’t check that the character is loaded because neither .CharacterApperanceLoaded() or :HasAppearanceLoaded() work properly. please fix this.

3 Likes

Same here. Been having players spawn as noobs in our game.

1 Like

that seems like a different issue, and should be sporadic.

bro it’s still broken :sob: i wanna make player titles

2 Likes

Bump, checking on the client whether a player’s appearance has been loaded is critical. The task.wait/wait workaround has a lot of potential to fail, especially considering the loading of character appearances is rather unpredictable.

1 Like

Please fix the issues with character loading events! Thanks <3

1 Like

I think we might be cooked. Over a year and a half since the ticket filing and still no fix or even an update. :sob:

Bump. Atleast tell us if ur even seeing this.

Hi, it’s intended behavior that this signal is only fired on the server side. It marks the end of when all DataModel parts have been added to the Character model from the server POV. It doesn’t work on the client because the client would need to keep track of which of its parts has replicated. We will update the docs to reflect this statement.

Like you said, this event is about the parts being available in the context the event is fired in.

The event should fire on the client when all the parts have been added from the client PoV, then once they’re all replicated to the server then it fires on the server. There is no reason for the client to need to track/wait for the parts to replicate to the server, as that is not relevant to the client.

Currently, clients have no way to know when it is safe to get the character parts for things like raycast ignorelists or collision groups, since there’s no event that says all parts are now available on the client. This event should definitely fire in either context when the character is ready in that context.

1 Like