Implement idle animation into pathfinding

Hello, I was wondering how I could Implent a way so the rig idles when it finishes its way to a waypoint wait a second and continue the patrol however im not too sure how. If anyone could help that would be greatly appreaciated!

local PathfindingService = game:GetService("PathfindingService")

local npc = script.Parent
local humanoid = npc:WaitForChild("Humanoid")
local hrp = npc:WaitForChild("HumanoidRootPart")
hrp:SetNetworkOwner(nil)

local walkAnim = humanoid.Animator:LoadAnimation(script.Walk)
local IdleAnim = humanoid.Animator:LoadAnimation(script.Idle)
local attackAnim = humanoid.Animator:LoadAnimation(script.Attack)

local pathParams = {
	AgentHeight = 5,
	AgentRadius = 3,
	AgentCanJump = true,
}

local rayParams = RaycastParams.new()
rayParams.FilterType = Enum.RaycastFilterType.Blacklist
rayParams.FilterDescendantsInstances = {npc}

local lastPos
local animPlaying = false

local RANGE = 40
local DAMAGE = 100

local function canSeeTarget(target)
	local orgin = hrp.Position
	local direction = (target.HumanoidRootPart.Position - hrp.Position).Unit * RANGE
	local ray = workspace:Raycast(orgin, direction, rayParams)

	if ray and ray.Instance then
		if ray.Instance:IsDescendantOf(target) then
			return true
		else
			return false
		end
	else
		return false
	end
end

local function findTarget()
	local players = game.Players:GetPlayers()
	local maxDistance = RANGE
	local nearestTarget

	for i, player in pairs(players) do
		if player.Character then
			local target = player.Character
			local distance = (hrp.Position - target.HumanoidRootPart.Position).Magnitude

			if distance < maxDistance and canSeeTarget(target) then
				local plr = game.Players:GetPlayerFromCharacter(target)
				game.ReplicatedStorage.Seen:FireClient(plr, true)
				nearestTarget = target
				maxDistance = distance
				if canSeeTarget(target) == false then
					game.ReplicatedStorage.Seen:FireClient(plr, false)
				end
			end
		end
	end

	return nearestTarget
end

local function getPath(destination)
	local path = PathfindingService:CreatePath(pathParams)

	path:ComputeAsync(hrp.Position, destination.Position)

	return path	
end

local function attack(target)
	local distance = (hrp.Position - target.HumanoidRootPart.Position).Magnitude
	local debounce = false

	if distance > 5 then
		humanoid:MoveTo(target.HumanoidRootPart.Position)
	else
		if debounce == false then
			debounce = true

			npc.Head.AttackSound:Play()
			attackAnim:Play()
			target.Humanoid.Health -= DAMAGE
			task.wait(0.5)
			debounce = false
		end
	end
end

local function walkTo(destination)
	local path = getPath(destination)

	if path.Status == Enum.PathStatus.Success then
		for i, waypoint in pairs(path:GetWaypoints()) do
			path.Blocked:Connect(function()
				path:Destroy()
			end)

			if animPlaying == false then
				walkAnim:Play()
				animPlaying = true
			end

			attackAnim:Stop()

			local target = findTarget()

			if target and target.Humanoid.Health > 0 then
				lastPos = target.HumanoidRootPart.Position
				attack(target)
				break
			else
				if waypoint.Action == Enum.PathWaypointAction.Jump then
					humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
				end

				if lastPos then
					humanoid:MoveTo(lastPos)
					humanoid.MoveToFinished:Wait()

					lastPos = nil
					break
				else
					humanoid:MoveTo(waypoint.Position)
					
					humanoid.MoveToFinished:Wait()
					
				end
			end
		end
	else
		return
	end
end

local function patrol()
	local waypoints = workspace.Waypoints:GetChildren()
	local randomNum = math.random(1, #waypoints)
	walkTo(waypoints[randomNum])
end

while task.wait(0.2) do
	patrol()
end
2 Likes

Just play the idle animation from the start.
Once the walking animation is told to play it will override the idle animation because it has a higher priority.
Once the walking animation is stopped the idle will continue to play.

Presuming that idle animation Priority is set to Idle and walk animation Priority is set to Movement.

2 Likes

just use .statechanged and play the idle animation when it gets to it

So I tried this and im not sure if it works as the Rig is constantly moving after reaching the waypoint. Ive tried to use a wait on Movetofinished but that doesnt seem to work…

If you want the rig to wait after it’s reached it’s destination then just add a wait to the patrol function:

while task.wait(0.2) do
	patrol()
	task.wait(5) -- Waits 5 Seconds before next patrol
end
2 Likes

Thanks! It works flawlessly! :slight_smile:

2 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.