Hey there!
I am trying to cause recoil on a weapon when shot and then return to the point where the spray started (in rotation)
So I tried using springs…
local plr = game.Players.LocalPlayer
local mouse = plr:GetMouse()
local mouseheld = false
local cam = workspace.CurrentCamera
local springs = require(game.ReplicatedStorage.Springs)
local v3 = Vector3.new
local upSpring = springs.new(v3())
upSpring.Speed = 20
upSpring.Damper = 1
game:GetService("RunService").RenderStepped:Connect(function()
cam.CFrame *= CFrame.Angles(upSpring.Position.X,upSpring.Position.Y,upSpring.Position.Z)
end)
local burstCount = 0
local lastShot = 0
mouse.Button1Down:Connect(function()
mouseheld = true
while wait(1/9.25) and mouseheld do --upward
local now = tick()
local duration = now - lastShot
if duration > .5 then
print("starting new")
burstCount = 1
else
burstCount += 1
end
lastShot = now
upSpring.Velocity = v3(1,0,0)
wait(.1)
end
wait(.8) --retreat
if not mouseheld then
upSpring.Velocity = v3(-1*burstCount,0,0)
end
end)
mouse.Button1Up:Connect(function()
mouseheld = false
end)
and it works, but doesn’t always end up exactly where the bullet spray started.
I’ve heard people storing Orientation of the camera, then lerping to it after spray, but the problem is that that method is in the wrong if player moves their mouse below the starting rotation, which would make it reset the recoil by going upwards.
I have posted my recent attempts, and haven’t gotten any help. Hopefully you can solve my problem 
(also feel free to copy paste in a localscript and run the above code)