The script works just fine both on the client and the server, and I know the part rotates because it’s selected. The script isn’t the issue, the problem is the welds won’t work on the client.
I managed to make a fix where I simply removed the welds and manually adjusted the cframes of all the parts to the hingepart in a renderstepped call.
for i,part in pairs(door.Weld:GetChildren()) do
part.CFrame = hingepart.CFrame:ToWorldSpace(original[tonumber(part.Name)])
end