rather than using a fake camera part, just calculate the cframe yourself, just get the center of the model and add an offset that you can adjust for every gun
get the offset from the fake camera part to a set part on the tool (only once)
and then multiply that offset by the part’s position every time you update the vm’s position
So do what i told you and get the offset only once and calculate the new offset before updating the vm’s position
-- when first equipped
local offset = tool.Handle.CFrame:Inverse() * fakeCamera.CFrame
[...]
-- when updating the aim offset
aimOffset = aiming and currentViewmodel.AimPart.CFrame:Inverse() * (tool.Handle.CFrame * offset) or CFrame.new()