I’m feeling a bit confused about what exactly is happening after PlayerAdded fires. It seems that when a player is added, player.Character initially has a Head, but then if you wait() just once, the Head has been replaced with a new one. Why?
To see this, make a new baseplate project and just create a (server-side) Script and put this in it:
game.Players.PlayerAdded:Connect(function (player)
local character = player.Character or player.CharacterAdded:Wait()
local head = character.Head
print("Parent of head is", head.Parent)
wait()
print("Parent of head is now", head.Parent)
end)
This prints the following:
00:06:59.726 Parent of head is sudachipapa - Server - Script:4
00:06:59.775 Parent of head is now nil - Server - Script:6
You can see that the Parent is first reported as you’d expect. But then after the wait() it becomes nil. If you compare character.Head before and after, it’s a different object and also a little bit smaller.
How come? Just linking to some relevant doc is a fine answer.
Note that stepping through this code in the debugger alters the result.