local tool = script.Parent local player = game:GetService("Players").LocalPlayer tool.Equipped:connect(function(mouse) print("Tool equipped!") mouse.Button1Down:connect(function() print("Mouse pressed!") local ray = Ray.new(tool.Hole.CFrame.p, (mouse.Hit.p - tool.Hole.CFrame.p).unit * 300) local part, position = workspace:FindPartOnRay(ray, player.Character, false, true) local beam = Instance.new("Part", workspace) beam.BrickColor = BrickColor.new("Bright yellow") beam.FormFactor = "Custom" beam.Material = "Neon" beam.Transparency = 0.1 beam.Anchored = true beam.Locked = true beam.CanCollide = false local distance = (tool.Hole.CFrame.p - position).magnitude beam.Size = Vector3.new(0.3, 0.3, distance) beam.CFrame = CFrame.new(tool.Hole.CFrame.p, position) * CFrame.new(0, 0, -distance / 2) game:GetService("Debris"):AddItem(beam, 0.1) end) end)
Here is my setup for the gun (picture): https://drive.google.com/file/d/1gJ1-DSUd-QKUfqNEh4LgBzLQ11cym3PK/view?usp=sharing
You will need to pass the part hit from the client to the server, and have the server then do damage to the Character's humanoid. You use Remote Events/Functions to accomplish this.
If security is not a concern of yours (you're just experimenting or learning), this is a solution that works perfectly fine.
If you want security, the raycasting is also going to have to be handled by the server.
Any questions? Feel free to ask here or on discord.