you can see the torso and right upper leg accessories are attached to the neck and waist.
accessory attachment bug repro.rbxl (30.3 KB)
In this test place you can see two accessories that are attached to LeftHipRigAttachment and RightHipRigAttachment act differently. One moves with the leg and one moves with the lower torso.
Also a third accessory attached to NeckRigAttachment which USED to move with the torso but now moves with the head.
Expected Behavior
I haven’t changed the code in my game for a while so I would expect the accessories to move with the body parts they are attached to.
Actual Behavior
It chooses the hip instead of the right leg, and it will choose the head instead of the upper torso.
Issue Area: Engine Issue Type: Other Impact: Moderate Frequency: Constantly Date First Experienced: 2021-08-01 00:08:00 (-04:00) Date Last Experienced: 2021-10-05 00:10:00 (-04:00)
The issue here is that your Accessories are using RightHipRigAttachment , LeftHipRigAttachment , and NeckRigAttachment which are all rig attachments. You can’t use any Attachments that have rig in the name. Can you update your Accessorys to use any of the Attachments in the character that do not have rig in the name?
could you try adding a new attachment to characters when they spawn? or adding attachments to a StarterCharacter? maybe it can be a clone of one of those rig attachments, but with a unique name. Then you can match the name to the Attachment in your Accessory
I suppose I could do that. Just out of curiosity though, may I ask why this behavior changed recently? It has been working fine for the past few years.
those attachments were never meant to be used with accessories, but it was just by chance that your accessories managed to get attached to the attachments you wanted. Recently the default character changed, and now it’s kind of just by chance that they don’t get attached to the attachment you want. It was never specifically implemented to work
This is currently affecting all of our games, and I’m not sure this would be an ideal solution. Adding clones of the attachments under different names just for the sake of morphs working again seems unecessary, and would easily scale up on memory usage and instance count when this used to work previously.
Is there no way the old behavior can be implemented to work or have a way to define what part an Accessory gets welded to? This is a crucial component of our games and it’d be kind of a bummer if we had to redo a lot of it just because it now becomes unreliable to use what has worked for years.
if you are creating your own accessories, you don’t need to attach them to attachments in the character. You can just weld them directly to body parts. Then you don’t need to create new attachments
During all these years where me and my team have been using accessories with attachments on the Handle to wrap around body parts properly this has always worked and welded correctly. When no attachment is specified, a weld isn’t created but the accessory gets placed in the avatar’s head.
Using the attachment has always worked to adjust position offset, rotation etc.
Resorting to welding this by ourselves would require us to redo all our morphs’ positioning. Why can’t this change just be reverted or at least give us the option to change where the AccessoryWeld welds to?
They’re special only because unlike attachments that are meant to be used for accessories, there are two RigAttachments per rig. It makes it unpredictable which attachment will be used with AddAccessory.
While it’s not as ideal as if we could specify which part to attach to with AddAccessory, making a custom function isn’t too difficult. The function below should work.
local function AddAccessoryToHumanoid(accessory, humanoid, priorityPart)
local accessoryAttachment = accessory.Handle:FindFirstChildOfClass("Attachment")
if accessoryAttachment.Name:sub(-13) ~= "RigAttachment" then
--Not a RigAttachment, safe to apply normally
humanoid:AddAccessory(accessory)
return
end
local character = humanoid.Parent
local characterAttachment = character:FindFirstChild(accessoryAttachment.Name, true)
local weld = Instance.new("Weld")
if priorityPart then
local priorityAttachment = priorityPart:FindFirstChild(accessoryAttachment.Name)
if priorityAttachment then
characterAttachment = priorityAttachment
end
end
accessory.Parent = character
weld.Name = "AccessoryWeld"
weld.C0 = characterAttachment.CFrame
weld.C1 = accessoryAttachment.CFrame
weld.Part0 = characterAttachment.Parent
weld.Part1 = accessoryAttachment.Parent
accessory.Handle:WaitForChild("AccessoryWeld"):Destroy() --Seems to exist immediately, but wait if necessary
weld.Parent = accessory.Handle
end