It doesn't need to update constantly because the spread doesn't change, I just can't think of another way to make sure it matches besides trying 100 different images until I find the right one.
Here is how I find the spread:
local x = math.random(-spread*100,spread*100)/100 local y = math.random(-spread*100,spread*100)/100 local direction = (CFrame.new(origin.CFrame.p,mouse.Hit.p)*CFrame.Angles(math.rad(x),math.rad(y),0)).lookVector local ray = Ray.new(origin.CFrame.p,(direction).unit*999)