Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

A better method to path find to a moving player?

Asked by 4 years ago

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.

1 answer

Log in to vote
0
Answered by
Lakodex 711 Moderation Voter
4 years ago

You can use humanoid.Running Very well with this

CHARACTERPARENTHERE.Humanoid.Running:Connect(function()
    --This will detect if someone is using wasd at all.
end)
Ad

Answer this question