From what I can tell; this is because accessory welds rely on physics simulation to work and the CreateHumanoidModelFromUserId
function doesn’t set the accessory positions itself manually. You can solve this part of the issue by parenting the character to somewhere that runs physics simulation (ideally a WorldModel), for at least one physics heartbeat (RunService.Heartbeat
) so the accessory positions are set correctly
Alternatively, you can use the ApplyDescription
method, fetching first via GetHumanoidDescriptionFromUserId
(as mentioned above). It seems that even while using the ApplyDescription
method, you’ll unfortunately still need to first parent the model to a container which runs physics simulation before running the function since it doesn’t seem to work without it (again, a WorldModel would probably be most ideal here to run the physics simulation). By using this, it seems that you can eliminate the extra one-frame delay hack which is needed in the previous method. The big caveat here though is that iirc the player’s set HumanoidRigType
wouldn’t be respected and you’ll need to manually handle loading R6/R15 rigs as needed, if that matters for your use-case. So in all-reality, this solution mightn’t be worth it depending on whether you want to support just one of the RigTypes, or both.
Theoretically, if none of these options work, you could probably manually calulcate the accessory positions yourself, but that’d almost certainly be over-kill.