Ill only include beam code here, since the projectile script is pretty similar.
Hierarchy: StarterPack --> Tool --> LocalScript(Main) --> RemoteEvent(Function) --> Script(Handle) --> Bunch of particles
Here in the LocalScript(Main), I'm getting a userinput and on E press, I pass the mouse.hit.p to the remoteevent
game:GetService("UserInputService").InputBegan:Connect(function(input)
if input.KeyCode == Enum.KeyCode.E and equipped == true and eCoolDown == false and isTyping == false and mainCoolDown == false then
local BG = Instance.new("BodyGyro", humanoidRootPart)
BG.maxTorque = Vector3.new(250000, 250000, 250000)
BG.P = 6000
BG.D = 150
local BP = Instance.new("BodyPosition", humanoidRootPart)
BP.MaxForce = Vector3.new(math.huge, math.huge, math.huge)
local pos = humanoidRootPart.Position
BP.P = 6000
BP.D = 150
script.Function:FireServer("KeyDown", "E")
keydown = true
local timer = 45
while keydown and timer > 0 do
BP.Position = pos
BG.CFrame = CFrame.new(humanoidRootPart.Position, mouse.hit.p)
timer = timer - 1
wait()
end
local firePosition = mouse.hit.p
wait(0.3)
spawn(function()
wait(1.2)
BP:Destroy()
BG:Destroy()
end)
script.Function:FireServer("KeyReleased", "E", firePosition)
mainCoolDown = true
spawn(function() wait(1.3) mainCoolDown = false end)
eCoolDown = true
wait(2)
eCoolDown = false
end
end)
Script(Handle) receives and creates the laser beam
keydown = false
mousePosition = nil
RegMod = require(game.ReplicatedStorage.RegionModule)
onCooldown = false
script.Parent.OnServerEvent:Connect(function(player, command, ability, LastMousePosition)
local c = player.Character or player.CharacterAdded:wait()
if command == "KeyReleased" then
keydown = false
mousePosition = LastMousePosition
end
if command == "KeyDown" then
keydown = true
while keydown do
wait(0.03)
end
if ability == "E" then
local Beam = Instance.new("Part", game.Workspace.Beams)
Beam.Shape = "Cylinder"
Beam.BrickColor = BrickColor.new("Bright orange")
Beam.Material = "Neon"
Beam.Transparency = 0.1
Beam.CanCollide = false
Beam.Anchored = true
Beam.CFrame = c.HumanoidRootPart.CFrame
Beam.CFrame = CFrame.new(c.HumanoidRootPart.Position, mousePosition) * CFrame.Angles(math.rad(0),math.rad(-90),math.rad(0))
Beam.CFrame = Beam.CFrame * CFrame.new(-2.5,1.5,0)
Beam.Size = Vector3.new(0.1,0.1,0.1)
local ignore = {c, workspace.Beams, workspace.FX, workspace.Junk, workspace.Projectiles}
local RayStart = c.HumanoidRootPart.Position
local RayEnd = mousePosition
local Length = 200
local FireRay = Ray.new(RayStart, (RayEnd-RayStart).unit*Length)
local HitPart,BeamPosition = game.Workspace:FindPartOnRayWithIgnoreList(FireRay, ignore)
print(CFrame.new(c.HumanoidRootPart.Position, BeamPosition))
print(CFrame.new(c.HumanoidRootPart.Position, mousePosition))
print(CFrame.new(c.HumanoidRootPart.Position, Beam.CFrame.Position))
--These all print the same thing, so I think the error has to do with where mouse.hit.p actually is
local BeamLength = Instance.new("NumberValue", Beam)
BeamLength.Name = "BeamLength"
BeamLength.Value = (BeamPosition - c.HumanoidRootPart.Position).magnitude
--Rest of the script just registers damage and effects
end
end)
https://gyazo.com/3e11885d71c3dedde63aadaf73b4fa5f
Especially in the second cast, you can see the error. Any help would be appreciated :^)

2 comments
It looks fine to me. If your mouse isn't over a base part, it's going to return some very distant point, which is exactly what I see (and expect to see) in the second cast.
In that second casts case, shouldn't the distant point be a bit higher then? The angle between the character and part of the wall that was it isn't very close to the angle between the character and the actual mouse position