CCCPaste

Raycast Gun Template

local currentCamera: Camera = workspace.CurrentCamera
local Debris = game:GetService("Debris")
local player: Player = game:GetService("Players").LocalPlayer
local UIS: UserInputService = game:GetService("UserInputService")
local DAMAGE = 10
local character = player.Character or player.CharacterAdded:Wait()
local tool: Tool = player.Backpack.Tool

local raycastParams: RaycastParams = RaycastParams.new()
raycastParams.FilterDescendantsInstances = { character } -- fill this in yourself

local aiming = false
UIS.InputEnded:Connect(function(input)
   local inputType = input.UserInputType
   if inputType == Enum.UserInputType.MouseButton2 then
        aiming = false
    end
end)

UIS.InputBegan:Connect(function(input)
   local inputType = input.UserInputType
   if inputType == Enum.UserInputType.MouseButton2 then
        aiming = true
    end
end)
local MIN_BAD_AIM = 100
local MAX_BAD_AIM = 100
tool.Activated:Connect(function(input)
	local muzzle = tool.Handle
	print("button is down")
	local VIEWPORT_SIZE = currentCamera.ViewportSize / 2 -- current size of the screen -- if you're raycasting multiple times, this will have to be redefined!
	local CAST_LENGTH = 1000 -- distance to raycast

	local x_offset = 0
	local y_offset = 0
	if not aiming then
		x_offset += math.random(-MIN_BAD_AIM, MIN_BAD_AIM)
		y_offset += math.random(-MIN_BAD_AIM, MIN_BAD_AIM)
	end
	local unitRay = currentCamera:ViewportPointToRay(VIEWPORT_SIZE.X + x_offset, VIEWPORT_SIZE.Y + y_offset) -- account for the 36px TopBar inset
	local raycastResult = workspace:Raycast(unitRay.Origin, unitRay.Direction * CAST_LENGTH, raycastParams)

	if raycastResult and raycastResult.Position then -- .Position is the Vector3 (the Hit.Position) of the center of the screen
		local partFound: Instance = raycastResult.Instance
		local distance = (muzzle.Position - raycastResult.Position).Magnitude
		local p = Instance.new("Part")
		p.Anchored = true
		p.CanCollide = false
		p.Parent = workspace
		p.Size = Vector3.new(0.1, 0.1, distance)
		p.CFrame = CFrame.lookAt(muzzle.Position, raycastResult.Position)*CFrame.new(0, 0, -distance/2)
		task.defer(function()
			local transparency = 0
			while transparency ~= 1 do
				p.Transparency += 0.1
				task.wait(0.02)
			end
			Debris:AddItem(p, 0.05)
		end)
		local humanoid = partFound.Parent:WaitForChild("Humanoid", 5)
		if humanoid then
			humanoid.Health -= DAMAGE
		end
	end
end)