-
So, I was recently coding and I wanted to know how this code works? Why does the “nextWaypointIndex = 2” need to be put outside the reached Connection loop but not inside it.
- I found that reachedConnection is nil, so not nil should be true. and when it reaches the “reached and nextWaypointIndex < #waypoints”, I’m sure that it loops adds 1 to the waypointindex and ask the humanoid to move there. But, after that, I’m more confused, why put the “humanoid:MoveTo(waypoints[nextWaypointIndex].Position)” 2 times, inside and outside, because it doesn’t make sense.
local PathfindingService = game:GetService("PathfindingService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local path = PathfindingService:CreatePath()
local character = script.Parent --dummy model
local humanoid = character:WaitForChild("Humanoid")
local player = Players:FindFirstChild("towelmaster12")
local character = player.Character
local TEST_DESTINATION = character.Position
local waypoints
local nextWaypointIndex
local reachedConnection
local blockedConnection
print(reachedConnection) --nil
local function followPath(destination)
-- Compute the path
local success, errorMessage = pcall(function()
path:ComputeAsync(character.PrimaryPart.Position, destination)
end)
if success and path.Status == Enum.PathStatus.Success then
-- Get the path waypoints
waypoints = path:GetWaypoints()
-- Detect if path becomes blocked
blockedConnection = path.Blocked:Connect(function(blockedWaypointIndex)
-- Check if the obstacle is further down the path
if blockedWaypointIndex >= nextWaypointIndex then
-- Stop detecting path blockage until path is re-computed
blockedConnection:Disconnect()
-- Call function to re-compute new path
followPath(destination)
end
end)
-- Detect when movement to next waypoint is complete
if not reachedConnection then --true
reachedConnection = humanoid.MoveToFinished:Connect(function(reached)
if reached and nextWaypointIndex < #waypoints then
-- Increase waypoint index and move to next waypoint
nextWaypointIndex += 1
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
reachedConnection:Disconnect()
blockedConnection:Disconnect()
end
end)
end
-- Initially move to second waypoint (first waypoint is path start; skip it)
nextWaypointIndex = 2
humanoid:MoveTo(waypoints[nextWaypointIndex].Position)
else
warn("Path not computed!", errorMessage)
end
end
followPath(TEST_DESTINATION)