Here's the function for the staff I did in this old video. Offsets were trial and error and need changing for each model. It's called in UpdateWorld() That was my only attempt so there's probably a better way.
function Script:AttachWeapon()
if self.fingerBone == nil then
self.fingerBone = self.entity:FindChild("Bone R Finger11")
if self.fingerBone == nil then
Debug:Error("Finger bone to attach weapon to not found.")
end
end
local fingerPos = self.fingerBone:GetPosition(true)
local fingerRot = self.entity:GetRotation(true)
local tscale = self.entity:GetScale()
local fPos = Transform:Point(0.01 / tscale.x, .02 / tscale.y, .03 / tscale.z, self.fingerBone, nil) --offset
playerInfo[ourID].weaponEntity:SetPosition(fPos.x, fPos.y, fPos.z, true)
playerInfo[ourID].weaponEntity:SetRotation(fingerRot.x-23, fingerRot.y, fingerRot.z, true)
end