To get it to path find consistently to a changing position you must spam it, but when it is at higher walkspeeds it messes up, I don't know why or how to fix it, please help:
modtable = {} pathfindingcache = {} function modtable.Humanoid:StartPathFind(hum, despoint) if pathfindingcache[hum:GetFullName()] then pathfindingcache[hum:GetFullName()].isdone = 1 repeat game:GetService("RunService").Heartbeat:wait() until pathfindingcache[hum:GetFullName()] == nil pathfindingcache[hum:GetFullName()] = {} pathfindingcache[hum:GetFullName()].isdone = 0 else pathfindingcache[hum:GetFullName()] = {} pathfindingcache[hum:GetFullName()].isdone = 0 end if pathfinddebounce == 1 then return end if pcall(function() return despoint.IsA end) then despoint = despoint.Position end local PathfindingService = game:GetService("PathfindingService") local connect = {} local path = PathfindingService:CreatePath() local waypoints local currentWaypointIndex local function followPath() path = PathfindingService:CreatePath() path:ComputeAsync(hum.RootPart.Position, despoint) waypoints = {} if path.Status == Enum.PathStatus.Success then waypoints = path:GetWaypoints() currentWaypointIndex = 1 hum:MoveTo(waypoints[currentWaypointIndex].Position) if waypoints[currentWaypointIndex].Action == Enum.PathWaypointAction.Jump then hum.Jump = true end else hum:MoveTo(hum.RootPart.Position) end end local function onWaypointReached(reached) if pathfindingcache[hum:GetFullName()].isdone == 1 then return end if not waypoints or not currentWaypointIndex then return end if reached and #waypoints > currentWaypointIndex then if waypoints[currentWaypointIndex] then currentWaypointIndex = currentWaypointIndex + 1 end local nocollide = {} for i,obj in ipairs(workspace:GetDescendants()) do if pcall(function() return obj:IsA("BasePart") end) then if obj:IsA("BasePart") and obj.CanCollide == false then table.insert(nocollide,obj) end end end local function raycast(num,num2,tab2) if waypoints[num + 1] == nil then return end local ray = Ray.new(waypoints[num].Position, waypoints[num2].Position) table.insert(tab2,waypoints[num]) local a if pcall(function() return workspace:FindPartOnRayWithIgnoreList(ray,tab2) end) then a = workspace:FindPartOnRayWithIgnoreList(ray,tab2) else end if a then return true else return nil end end if raycast(currentWaypointIndex,currentWaypointIndex + 1,nocollide) ~= nil then hum:MoveTo(waypoints[currentWaypointIndex].Position) if waypoints[currentWaypointIndex].Action == Enum.PathWaypointAction.Jump then hum.Jump = true end elseif waypoints[currentWaypointIndex + 1] then local origin = currentWaypointIndex repeat currentWaypointIndex = currentWaypointIndex + 1 until raycast(origin,currentWaypointIndex,nocollide) ~= true if waypoints[currentWaypointIndex].Action == Enum.PathWaypointAction.Jump then hum.Jump = true end hum:MoveTo(waypoints[currentWaypointIndex].Position) elseif not waypoints[currentWaypointIndex] then currentWaypointIndex = currentWaypointIndex - 1 end else end end local function onPathBlocked(blockedWaypointIndex) if pathfindingcache[hum:GetFullName()].isdone == 1 then return end if blockedWaypointIndex > currentWaypointIndex then followPath() end end connect["onPathBlocked"] = path.Blocked:Connect(onPathBlocked) connect["onWaypointReached"] = hum.MoveToFinished:Connect(onWaypointReached) local function check() if pathfindingcache[hum:GetFullName()].isdone == 1 then pathfinddebounce = 0 connect["onPathBlocked"]:disconnect() connect["onWaypointReached"]:disconnect() pathfindingcache[hum:GetFullName()] = nil connect["check"]:disconnect() end end connect["check"] = game:GetService("RunService").Heartbeat:Connect(check) followPath() end