So I'm trying to make a script that will find out if the player is visible. I tried using rays but they don't seem to point at the player for some reason?

local plr = game:GetService("Players").LocalPlayer
local char = plr.Character


while wait() do
	game.Workspace.Folder.visual1.Position = game.Workspace.Folder.main.CFrame.Position
	game.Workspace.Folder.visual2.Position = plr.Character.Head.CFrame.Position
	game.Workspace.Folder.main.CFrame = CFrame.new(game.Workspace.Folder.main.CFrame.Position,plr.Character.Head.Position)
	local raycasted = Ray.new(game.Workspace.Folder.main.Position,plr.Character.Head.CFrame.Position)
	local parts = {game.Workspace.Folder.main,game.Workspace.Folder.visual,game.Workspace.Folder.visual1,game.Workspace.Folder.visual2}
for i,v in pairs(plr.Character:GetChildren()) do	if v:IsA("BasePart") and not parts[v] then table.insert(parts,v)	end end
if game.Workspace:FindPartOnRayWithIgnoreList(raycasted,parts) then
local part, position = game.Workspace:FindPartOnRayWithIgnoreList(raycasted,parts)
game.Workspace.Folder.main.BrickColor = BrickColor.new("Bright green")
print(part.Name)
game.Workspace.Folder.visual.Position = position
else
	game.Workspace.Folder.visual.Position = Vector3.new(0,100,0)
	game.Workspace.Folder.main.BrickColor = BrickColor.new("Black")
	end end

any solutions or other methods to fix this?