Character Part Textures will always Render Incorrectly Unless Constructed using Humanoid:ApplyDescription()

Issue Type: Display
Impact: Moderate
Frequency: Constantly
Date First Experienced: 2021-04-26 00:04:00 (-06:00)
Date Last Experienced: 2021-04-26 00:04:00 (-06:00)

Reproduction Steps:
This one is a really annoying issue because I currently have to do a very messy workaround that frankly should be avoidable. My game does NOT use Humanoid:ApplyDescription() for its avatar system because ApplyDescription relies on using assets for character parts, and I need these parts to load on your character instantly rather than waiting to validate/load an asset every time body parts are switched out.

CharacterRenderBugRepro.rbxl (31.6 KB)
In this simple repro, a script on the server creates two characters based on the ROBLOX account, then applies the “Pirate Swashbuckler” package LeftHand through two different methods

The first method calls Humanoid:ApplyDescription() after editing the asset ID for the character’s LeftArm

CHAR1.Humanoid.DisplayName = 'Renders LeftHand Correctly'
local desc = CHAR1.Humanoid:GetAppliedDescription()
desc.LeftArm = 27847412

The second method manually creates the LeftHand instance and swaps it out on the character using Humanoid:ReplaceBodyPartR15()

local newLeftHand = script.LeftHand:Clone()
CHAR2.Humanoid.DisplayName = 'Renders LeftHand Incorrectly'
CHAR2.Humanoid:ReplaceBodyPartR15(Enum.BodyPartR15.LeftHand, newLeftHand)

In the “Actual Behavior” screenshot, the first method appears on the left, and the second method appears on the right. When Humanoid:ApplyDescription() is called, the hook texture on the LeftHand appears correctly, whereas when Humanoid:ReplaceBodyPartR15() is called, the hook texture doesn’t show up at all.

Expected Behavior:
I would expect both characters to look the same, no matter how I put the character together (be it manually deleting/re-inserting/adding character parts, or calling Humanoid:ReplaceBodyPartR15())

Actual Behavior:

In order to work around this, I have to create multiple meshes for each limb, split by which parts of the mesh can show clothing textures, and which parts of the mesh cannot. Sometimes I have to create an invisible limb part and then weld the “fake” limb over it; I also have to manually apply limb scaling on these fake parts. This increases overall asset load times and client memory usage.

This process would be made a million times easier if these textures would just render correctly.

When I call Humanoid:GetBodyPartR15() on the replaced LeftHand part, it will return ‘Enum.BodyPartR15.LeftHand’ regardless of whether the LeftHand was replaced via Humanoid:ApplyDescription() or Humanoid:ReplaceBodyPartR15(), or even by manually deleting the existing R15 part, inserting a new one, and creating custom joints.

These textures are on the “TextureID” property of the limb’s MeshPart instance. I would expect this texture to show up even in the latter case where I am manually deleting, re-adding, and creating a joint for the given limb.


Thanks for the report! We’ve filed a ticket to our internal database and we’ll follow up when we have an update for you.