Humanoid:AddAccessory does not work with FE from a LocalScript

From the server, the hat will equip.
From the client, the hat will just be flung.

Repro.rbxl

8 Likes

Is this supposed to work? FE basically makes the server mostly authoritative so I can see why this wouldn’t work. I don’t know much about this method though.

1 Like

This is the wrong behavior - It should act exactly like the server does, just locally. This is a problem in my game because despite the fact both local scripts and server scripts are calling the same method, local scripts have to use an additional weld method to make sure the server and client act the same.

4 Likes

This is because Accessory welds are currently created on the server only, never the client. This is intended right now but we might change it to make this easier to work with when using FilteringEnabled.

Here is some code you can use to add an Accessory to a humanoid locally:

function weldAttachments(attach1, attach2)
    local weld = Instance.new("Weld")
    weld.Part0 = attach1.Parent
    weld.Part1 = attach2.Parent
    weld.C0 = attach1.CFrame
    weld.C1 = attach2.CFrame
    weld.Parent = attach1.Parent
    return weld
end
 
local function buildWeld(weldName, parent, part0, part1, c0, c1)
    local weld = Instance.new("Weld")
    weld.Name = weldName
    weld.Part0 = part0
    weld.Part1 = part1
    weld.C0 = c0
    weld.C1 = c1
    weld.Parent = parent
    return weld
end
 
local function findFirstMatchingAttachment(model, name)
    for _, child in pairs(model:GetChildren()) do
        if child:IsA("Attachment") and child.Name == name then
            return child
        elseif not child:IsA("Accoutrement") and not child:IsA("Tool") then -- Don't look in hats or tools in the character
            local foundAttachment = findFirstMatchingAttachment(child, name)
            if foundAttachment then
                return foundAttachment
            end
        end
    end
end
 
function addAccoutrement(character, accoutrement)  
    accoutrement.Parent = character
    local handle = accoutrement:FindFirstChild("Handle")
    if handle then
        local accoutrementAttachment = handle:FindFirstChildOfClass("Attachment")
        if accoutrementAttachment then
            local characterAttachment = findFirstMatchingAttachment(character, accoutrementAttachment.Name)
            if characterAttachment then
                weldAttachments(characterAttachment, accoutrementAttachment)
            end
        else
            local head = character:FindFirstChild("Head")
            if head then
                local attachmentCFrame = CFrame.new(0, 0.5, 0)
                local hatCFrame = accoutrement.AttachmentPoint
                buildWeld("HeadWeld", head, head, handle, attachmentCFrame, hatCFrame)
            end
        end
    end
end
119 Likes

Is this supposed to work in a viewport? It doesn’t seem to.

cough WorldModel | Roblox Creator Documentation cough Google before necrobumping! cough

6 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.