I'm pretty new to Roblox developing. I've been trying to make a raycast gun now, but when I click to fire the gun, the laser parts sometimes fire in the wrong direction. Sometimes, the laser part doesn't show up at all, even though a ray was fired. I think that the issue is with how I'm defining the parts' CFrame in the onShoot function, but I don't know what the problem is.

Local script

--Variables
local tool = script.Parent
local replicatedStorage = game:GetService("ReplicatedStorage")
local remotes = replicatedStorage:WaitForChild("Remotes")
local ammoStart = remotes:WaitForChild("AmmoStart")
local shoot = remotes:WaitForChild("Shoot")
local players = game:GetService("Players")
local mouse = players.LocalPlayer:GetMouse()

--When tool is equipped
tool.Equipped:Connect(function()
	ammoStart:FireServer()
	--When player clicks with tool
	mouse.Button1Down:Connect(function()
	local bulletStartPosition = tool.Handle.CFrame.p
	local bulletDestination = mouse.Hit.p
	shoot:FireServer(bulletStartPosition, bulletDestination)
	end)
end)

Server script

--Variables
local replicatedStorage = game:GetService("ReplicatedStorage")
local remotes = replicatedStorage:WaitForChild("Remotes")
local ammoStart = remotes:WaitForChild("AmmoStart")
local shoot = remotes:WaitForChild("Shoot")

--Making functions
local function ammoMaking(player) --Creates the ammo and clip for the player
	print(game.Workspace:FindFirstChild(player.Name))
	--Creates ammo
	local playerAmmo = Instance.new("NumberValue")
	playerAmmo.Name = player.Name.."'s Ammo Count"
	playerAmmo.Value = 10
	playerAmmo.Parent = game:GetService("ServerStorage")
	print(playerAmmo.Value)
	--Creates clip
	local playerClip = Instance.new("NumberValue")
	playerClip.Name = player.Name.."'s Clip"
	playerClip.Value = 4
	playerClip.Parent = game:GetService("ServerStorage")
	print(playerClip.Value)
end

--Executes when player attempts to shoot the gun
local function onShoot(player, bulletStartPosition, bulletDestination)
	local laser = Ray.new(bulletStartPosition, bulletDestination.unit * 500)
	local part, position = workspace:FindPartOnRay(laser, player.Character, false, true)
	local distance = (bulletStartPosition - position).magnitude
	local laserPart = Instance.new("Part")
	laserPart.BrickColor = BrickColor.new("Bright blue")
	laserPart.Material = "Neon"
	laserPart.Transparency = 0.25
	laserPart.Anchored = true
	laserPart.Locked = true
	laserPart.CanCollide = false
	laserPart.Size = Vector3.new(0.3, 0.3, distance)
	laserPart.CFrame = CFrame.new(bulletStartPosition, position) * CFrame.new(0, 0, -distance / 2)
	laserPart.Parent = game.Workspace
end

--When a player equips a gun
ammoStart.OnServerEvent:Connect(ammoMaking)
--When the player clicks with a gun in hand
shoot.OnServerEvent:Connect(onShoot)