Roblox is notorious for making changing collisions on body parts really difficult.
The way I fixed this is by going through each limb in the character and creating a smaller replica and welding it to its corresponding body part and using that as the collider instead of the actual limb. It’s a little jank but so far is the only way I’ve seen to do limb physics properly.
for _,v in pairs(char:GetChildren()) do --For i,v loop to go through all the objects in the char
if v:IsA("MeshPart") then --Find all parts which are limbs since all limbs are meshes
print(v) --Debugging
--Create the part
local CollisionPart = Instance.new("Part")
CollisionPart.Parent = v
CollisionPart.CFrame = v.CFrame
CollisionPart.Size = v.Size/2 --Setting the size smaller because if they're too big it acts buggy
CollisionPart.Massless = true --Making sure we arent adding any extra weight to the character
CollisionPart.Transparency = 0
CollisionPart.Name = "COLLISION_PART"
CollisionPart.CanCollide = false --Set to false when create, find all parts named Collision part and set collision to true when ragdoll happens
--weld part to the corresponding body part
local Weld = Instance.new("WeldConstraint",CollisionPart)
Weld.Part0 = CollisionPart
Weld.Part1 = v
end
end