So I was attempting to create a path finding script for my NPC using ROBLOX's path finding service. The script is supposed to follow the player and not get stuck on walls and make sure it can follow them where ever they go.
The current script does function, its just after the player a NPC is following dies the NPC begins to track the next player but then will start going between the spot the first player died and the path in which the new player is on.
My current script
local pathService = game:GetService("PathfindingService")
local teams = game:GetService("Teams")
local debris =game:GetService("Debris")
local maxDistance = 512
local undeadTeam = teams:FindFirstChild("Undead")
local survivorsTeam = teams:FindFirstChild("Survivors")
local upper = script.Parent.UpperTorso
local target
local humanoid = script.Parent.Humanoid
function pathFind()
local OldSpot = target.Character.UpperTorso.Position
local newSpot
local path = pathService:CreatePath()
path:ComputeAsync(upper.Position,OldSpot)
local waypoints = path:GetWaypoints()
for _, waypoint in pairs(waypoints) do
newSpot = target.Character.UpperTorso.Position
local part = Instance.new("Part")
part.Size = Vector3.new(0.6, 0.6, 0.6)
part.Position = waypoint.Position
part.Anchored = true
part.CanCollide = false
part.Parent = game.Workspace
part.Transparency = 1
debris:AddItem(part,0.75)
humanoid:MoveTo(waypoint.Position)
humanoid.MoveToFinished:Wait()
if (newSpot-OldSpot).magnitude>5 then--if satment that checks if the target has moved
break
end
end
end
while wait()do
for i,v in pairs(game:GetService("Players"):GetChildren())do
local shortestDistance = 512--players have to be closer than 512 studs by default
if v.Team == survivorsTeam and workspace:FindFirstChild(v.Name)then
local chr = v.Character
if chr then
if chr:FindFirstChild("Humanoid").Health >0 then
if (chr:FindFirstChild("UpperTorso").Position-upper.Position).magnitude < shortestDistance then--checks if the target is the closest
shortestDistance = (chr:FindFirstChild("UpperTorso").Position-upper.Position).magnitude
target = v
end
end
end
end
end
if target then
repeat
wait()
pathFind()
until
target.Team == undeadTeam
end
end
if you have any questions ask away I will try and reply to them as soon as possible.
