(This is used by an NPC). SpawnPosition1 is the tip of the weapon, and targetPosition1 is the players Torso it is locked on to.

local function MakeRocket(spawnPosition1,targetPosition1)

--------Randomize targetPosition1
	targetPosition1 = Vector3.new(targetPosition1.X + math.random(-3,3),targetPosition1.Y + math.random(-3,3),targetPosition1.Z + math.random(-3,3))

	local ray = Ray.new(spawnPosition1, (targetPosition1 - Tool.Handle.CFrame.p).unit * 300)	
	local hit, position = game.Workspace:FindPartOnRay(ray, MyModel)

   	local distance = (position - Tool.Handle.CFrame.p).magnitude


    local rayPart = Instance.new("Part", MyModel)
    rayPart.Name          = "RayPart"
    rayPart.BrickColor    = BrickColor.new("Bright red")
    rayPart.Transparency  = 0.5
    rayPart.Anchored      = true
    rayPart.CanCollide    = false
    rayPart.TopSurface    = Enum.SurfaceType.Smooth
    rayPart.BottomSurface = Enum.SurfaceType.Smooth
    rayPart.formFactor    = Enum.FormFactor.Custom
    rayPart.Size          = Vector3.new(0.2, 0.2, distance)
    rayPart.CFrame        = CFrame.new(Tool.Handle.CFrame.p, position--[[targetPosition1]]) * CFrame.new(0, 0, -distance/2)
        --add it to debris so it disappears after 0.1 seconds

	rayPart.Touched:connect(function(part)
		local hithumanoid = part and part.Parent and part.Parent:FindFirstChild("Humanoid")
		if hithumanoid and hityet == false and hithumanoid.Parent ~= MyModel then
			hityet = true
			local damagehitting = nil
			for index, value in pairs(points) do
				if distance >= points[index][1] and points[index + 1] and distance <= points[index + 1][1] then
					local slope = (points[index + 1][2] - points[index][2])/(points[index + 1][1] - points[index][1])
					local yint = points[index][2] - (slope*points[index][1]) --points[index][2]
					local damagehitting = slope*distance + yint
					if damagehitting >= 0 then
						--print(damagehitting)
						hithumanoid:TakeDamage(damagehitting)
						break
					end
				end
			end
		end
	end)
        DebrisService:AddItem(rayPart, 0.1)
end

The raycast is accurate (as accurate as I want it to be), but for some reason shoots through blocks and the method FindPartOnRay doesn't seem to detect the part even though the "lazer" clearly goes through it. How could I fix this?