I have been working on a Path-finding script that is supposed to track a player, and if the player is right in sight, it goes to the player regardless of the waypoint that's next, and s supposed to break the entire loop. However, that isn't happening and eventually, the NPC gets stuck. I linked to a video of what is happening https://youtu.be/KiGHgdtnitY
My code:
script.Parent.HumanoidRootPart:SetNetworkOwner(nil) function findNearestHuman(curPos, ran) local foundNear = false local NearestPlayer = nil for i,v in pairs(game.Players:GetPlayers()) do if v and v.Character and v.Character.Humanoid then local distance = v:DistanceFromCharacter(curPos) if distance < ran then foundNear = true ran = distance NearestPlayer = v.Character.UpperTorso end end end return foundNear, NearestPlayer end function findDoor(curPos, ran) local foundNear = false local NearestPlayer = nil for i,v in pairs(workspace.Map:GetChildren()) do if v and v:FindFirstChild("alienDetector") then local distance = (curPos - v.Door.Position).Magnitude if distance < ran then foundNear = true ran = distance NearestPlayer = v.Door end end end return foundNear, NearestPlayer end pathBlocked = false local pathService = game:GetService("PathfindingService") lastNearPos = nil --[[{AgentRadius=3,AgentHeight=8}]]-- local hum = script.Parent.Humanoid points, oldPath, path, hit, position = nil while true do wait(1/200) local nearDoor, door = findDoor(script.Parent.Torso.Position, 25) local near, plr = findNearestHuman(script.Parent.Torso.Position, script.Parent.Configurations.AggroRange.Value) if near then hit,position = workspace:FindPartOnRayWithIgnoreList(Ray.new(script.Parent.Torso.Position, (plr.Position - script.Parent.Torso.Position).Unit * 200), {script.Parent}) end if nearDoor then door.Parent.Button.ClickDetector.open:Fire() end if near and (hit and hit.Parent:IsDescendantOf(plr.Parent) ~= true) and path == nil then path = pathService:FindPathAsync(script.Parent.Torso.Position, plr.Position) elseif (hit and hit.Parent:IsDescendantOf(plr.Parent) == true) then script.Parent.Humanoid:MoveTo(plr.Position) end if path ~= nil then if path.Status == Enum.PathStatus.Success then path.Blocked:Connect(function() pathBlocked = true end) script.pathObj.Value = path script.pathUpdated.Value = true points = path:GetWaypoints() recomputed = false for i,p in pairs(points) do hit,position = workspace:FindPartOnRayWithIgnoreList(Ray.new(script.Parent.Torso.Position, (plr.Position - script.Parent.Torso.Position).Unit * 200), {script.Parent}) if hit then if hit.Parent:IsDescendantOf(plr.Parent) then script.Parent.Humanoid:MoveTo(plr.Position) path = nil break else hum:MoveTo(p.Position) hum.MoveToFinished:Wait(2) end end if (points[#points].Position - plr.Position).magnitude > 2 and i >= #points - 2 and recomputed == false then path = pathService:FindPathAsync(points[#points].Position, plr.Position) recomputed = true end if pathBlocked == true then path = nil break end if i == #points - 1 then hum:MoveTo(path:GetWaypoints()[1].Position) break end end else path = nil end end end
I am trying to make it, more or less, smoothly track the players, so it can go around corners and such without getting stuck. However, that just isn't happening. Is there something I am missing? Or AM I going about solving my problem the wrong way?