--local script
local gunModel = script.Parent.Parent
local remoteEvent = gunModel.Gun:WaitForChild("RemoteEvent")

local currentPlayer, mouse, connection
local canFire = true

local cooldownTime = 0.25
local lastFireTime = 0

local function canFireCheck()
	return (tick() - lastFireTime >= cooldownTime)
end

local function fireRemoteEvent()
	if not canFire or not canFireCheck() then return end
	lastFireTime = tick()

	local camera = workspace.CurrentCamera
	local mousePos = mouse.Hit.Position
	local origin = camera.CFrame.Position
	local direction = (mousePos - origin).Unit * 1000

	local raycastParams = RaycastParams.new()
	raycastParams.FilterDescendantsInstances = {currentPlayer.Character}
	raycastParams.FilterType = Enum.RaycastFilterType.Exclude

	local rayResult = workspace:Raycast(origin, direction, raycastParams)

	local hitPosition = rayResult and rayResult.Position or (origin + direction)

	if rayResult then
		remoteEvent:FireServer(rayResult.Instance, rayResult.Position)
	else
		remoteEvent:FireServer(nil, hitPosition)
	end

	local attachment0 = Instance.new("Attachment")
	local attachment1 = Instance.new("Attachment")

	local trailPart0 = Instance.new("Part")
	trailPart0.Size = Vector3.new(0.1, 0.1, 0.1)
	trailPart0.Anchored = true
	trailPart0.CanCollide = false
	trailPart0.Transparency = 1
	trailPart0.CFrame = CFrame.new(origin)
	trailPart0.Parent = workspace
	attachment0.Parent = trailPart0

	local trailPart1 = Instance.new("Part")
	trailPart1.Size = Vector3.new(0.1, 0.1, 0.1)
	trailPart1.Anchored = true
	trailPart1.CanCollide = false
	trailPart1.Transparency = 1
	trailPart1.CFrame = CFrame.new(hitPosition)
	trailPart1.Parent = workspace
	attachment1.Parent = trailPart1

	local beam = Instance.new("Beam")
	beam.Attachment0 = attachment0
	beam.Attachment1 = attachment1
	beam.Color = ColorSequence.new(Color3.new(1, 1, 0)) 
	beam.LightEmission = 1
	beam.Width0 = 0.1
	beam.Width1 = 0.1
	beam.FaceCamera = true
	beam.Segments = 2
	beam.Parent = trailPart0

	-- Clean up
	game:GetService("Debris"):AddItem(trailPart0, 0.2)
	game:GetService("Debris"):AddItem(trailPart1, 0.2)

	canFire = false
	task.wait(cooldownTime)
	canFire = true
end

gunModel.Equipped:Connect(function()
	currentPlayer = game.Players.LocalPlayer
	mouse = currentPlayer:GetMouse()

	connection = gunModel.Activated:Connect(fireRemoteEvent)
end)

gunModel.Unequipped:Connect(function()
	if connection then
		connection:Disconnect()
	end

	currentPlayer, mouse, connection = nil
end)

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: