This only works when used as a local script and in Starter GUI. I'm trying to make it work when you execute the script alone. I'm wondering can you take the script and execute itself and work. I am having trouble. Please help.

player = script.Parent.Parent
crawling = true
local char = player.Character
local origin = char:WaitForChild("HumanoidRootPart")
local ignore = {
	char,
	char.Torso,
	char.HumanoidRootPart
}
local mouse = player:GetMouse()
local wKey = false
local aKey = false
local dKey = false
local sKey = false
local canCrawl = true
local human = char:WaitForChild("Humanoid")
mouse.KeyDown:connect(function(key)
	if key == "w" then
		wKey = true
	elseif key == "d" then
		dKey = true
	elseif key == "s" then
		sKey = true
	elseif key == "a" then
		aKey = true
	end
end)
mouse.KeyUp:connect(function(key)
	if key == "w" then
		wKey = false
	elseif key == "d" then
		dKey = false
	elseif key == "s" then
		sKey = false
	elseif key == "a" then
		aKey = false
	end
end)
function endCrawl()
	if crawling then
		canCrawl = false
		human.PlatformStand = false
		human:ChangeState(Enum.HumanoidStateType.PlatformStanding)
		human.Jump = true
	end
	origin.Anchored = false
	if crawling then
		human.Jump = true
		wait()
		human.Jump = true
		wait()
		human.Jump = true
		crawling = false
	end
	wait(0.3)
	canCrawl = true
end
function startCrawl(normal)
	crawling = true
	origin.CFrame = CFrame.new(origin.CFrame.p, origin.CFrame.p - normal)
	origin.Anchored = true
	human.PlatformStand = true
end
while wait() do
	local checkFront = Ray.new(origin.CFrame.p, origin.CFrame.lookVector.unit * 1.2)
	local hit, position, normal = workspace:FindPartOnRayWithIgnoreList(checkFront, ignore)
	local checkDown = Ray.new(origin.CFrame.p, Vector3.new(0, -2.8, 0))
	local dHit, dPosition = workspace:FindPartOnRayWithIgnoreList(checkDown, ignore)
	if hit and canCrawl then
		if not dHit then
			if hit.Anchored == true and hit.CanCollide == true then
				startCrawl(normal)
			else
				endCrawl()
			end
		elseif dHit.CanCollide == true then
			endCrawl()
		end
	else
		endCrawl()
	end
	if crawling then
		if wKey then
			origin.CFrame = origin.CFrame * CFrame.new(0, 1, 0)
		elseif sKey then
			origin.CFrame = origin.CFrame * CFrame.new(0, -1, 0)
		elseif aKey then
			origin.CFrame = origin.CFrame * CFrame.new(-1, 0, 0)
		elseif dKey then
			origin.CFrame = origin.CFrame * CFrame.new(1, 0, 0)
		end
	end
end