Hello! I'm tried to make a patrol waypoints, but Idk why do function doesn't wanna do paths, writting: Argument 2 missing or nil, but if I will do "InkPortals.Position" Then I will get another error messange: Workspace.InkRobloxian.AI:10: attempt to index nil with 'Position', how do I fix this?
local myHuman = script.Parent:WaitForChild("Humanoid") local myRoot = script.Parent:WaitForChild("HumanoidRootPart") local head = script.Parent:WaitForChild("Neck") local lowerTorso = script.Parent:WaitForChild("Torso") local clone = script.Parent:Clone() function walkRandomly(InkPortals) local path = game:GetService("PathfindingService"):CreatePath() path:ComputeAsync(myRoot.Position, InkPortals) -- InkPortals.position isn't working as well local waypoints = path:GetWaypoints() if path.Status == Enum.PathStatus.Success then for _, waypoint in ipairs(waypoints) do myHuman:MoveTo(waypoint.Position) local timeOut = myHuman.MoveToFinished:Wait(1) if not timeOut then print("Got stuck") myHuman.Jump = true walkRandomly() end end else print("Path failed") wait(1) walkRandomly() end end function findPath(target) local path = game:GetService("PathfindingService"):CreatePath() path:ComputeAsync(myRoot.Position,target.Position) local waypoints = path:GetWaypoints() if path.Status == Enum.PathStatus.Success then for _, waypoint in ipairs(waypoints) do myHuman:MoveTo(waypoint.Position) local timeOut = myHuman.MoveToFinished:wait(1) if not timeOut then print("Path too long!") findPath(target) break end if checkSight(target) then repeat print("Moving directly to the target") myHuman:MoveTo(target.Position) attack(target) wait(0.1) if target == nil then break elseif target.Parent == nil then break end until checkSight(target) == false or myHuman.Health < 1 or target.Parent.Humanoid.Health < 1 break end if (myRoot.Position - waypoints[1].Position).magnitude > 20 then print("Target has moved, generating new path") findPath(target) break end end end end local function getPath(destination) local PathfindingService = game:GetService("PathfindingService") local pathParams = { ["AgentHeight"] = 6.625, ["AgentRadius"] = 2, ["AgentCanJump"] = false } local path = PathfindingService:CreatePath(pathParams) path:ComputeAsync(myRoot.Position, destination.Position) return path end function checkSight(target) local ray = Ray.new(myRoot.Position, (target.Position - myRoot.Position).Unit * 40) local hit,position = workspace:FindPartOnRayWithIgnoreList(ray, {script.Parent}) if hit then if hit:IsDescendantOf(target.Parent) and math.abs(hit.Position.Y - myRoot.Position.Y) < 3 then print("I can see the target") return true end end return false end function findTarget() local dist = 50 local target = nil local potentialTargets = {} local seeTargets = {} for i,v in ipairs(workspace:GetChildren()) do local human = v:FindFirstChild("Humanoid") local torso = v:FindFirstChild("Torso") or v:FindFirstChild("HumanoidRootPart") if human and torso and v.Name ~= script.Parent.Name then if (myRoot.Position - torso.Position).magnitude < dist and human.Health > 0 then table.insert(potentialTargets,torso) end end end if #potentialTargets > 0 then for i,v in ipairs(potentialTargets) do if checkSight(v) then table.insert(seeTargets, v) elseif #seeTargets == 0 and (myRoot.Position - v.Position).magnitude < dist then target = v dist = (myRoot.Position - v.Position).magnitude end end end if #seeTargets > 0 then dist = 99999 for i,v in ipairs(seeTargets) do if (myRoot.Position - v.Position).magnitude < dist then target = v dist = (myRoot.Position - v.Position).magnitude end end end return target end function attack(target) if (myRoot.Position - target.Position).magnitude < 5 then if target.Parent ~= nil then target.Parent.Humanoid:TakeDamage(100) end wait(0.4) end end function died() wait(5) clone.Parent = workspace game:GetService("Debris"):AddItem(script.Parent,0.1) end myHuman.Died:Connect(died) lowerTorso.Touched:Connect(function(obj) if not obj.Parent:FindFirstChild("Humanoid") then myHuman.Jump = true end end) function main() local target = findTarget() local Animation = script:WaitForChild("Animation") local Spotting = script:WaitForChild("Spotting") local humanoid = script.Parent:WaitForChild("Humanoid") local spot = humanoid:LoadAnimation(Spotting) local Running = humanoid:LoadAnimation(Animation) local chasing = 0 if target then chasing = 1 myHuman.WalkSpeed = 12 findPath(target) else chasing = 0 myHuman.WalkSpeed = 3 walkRandomly() end end while wait(0.1) do if myHuman.Health < 1 then break end main() end
Nevermind, I just forgot put the part's position in 169th line :/ I am such an idiot