Help with NPC Behavior

so I found this post on reddit

but its written for a prop monster but it got me thinking can i use this for player behaviour?

this is what i have so far

npc_state_machine

using { /Fortnite.com/AI }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Playspaces }
using { /Verse.org/Simulation }
using { /Verse.org/Colors }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }


# Credit to u/Natural_Lemon_1459 from reddit for posting his state machine

# A Verse-authored NPC Behavior that can be used within an NPC Character Definition or an NPC Spawner device's NPC Behavior Script Override.
npc_state_machine<public> := class(npc_behavior):
    
    var CurrentState:[]char = "Patrol"
    
    
    # reference to utility scripts we're gonna need 
    var NPCUtilities : npc_utilities = npc_utilities{}
    
    # this is the base example when you generate a behavior we need it for AI debug modules
    var ExampleNPCBehavior : new_npc_behavior = new_npc_behavior{}

     
    var IsMoving : logic = false
    var LostTarget : logic = false
    
    @editable ActivationRange : float = 3500.0
    @editable AttackRange : float = 150.0
    @editable ChaseRange : float = 1000.0
    @editable SearchTimer : float = 10.0
    

    # This function runs when the NPC is spawned in the world and ready to follow a behavior.
    OnBegin<override>()<suspends>:void=
        # TODO: Replace this with your code
        Print("Hello, NPC!")
        
        NPCBehaviorLoop()

    NPCBehaviorLoop()<suspends>:void = 
        
        if:
            # Get the Agent (the NPC).
            Agent := GetAgent[]

            # Gets the Fortnite Character interface, which gets you access to its gameplay data 
            # including its AI module for navigation and focus.
            Character := Agent.GetFortCharacter[]

            # Get the Navigatable Interface, this allows you to tell it to move.
            Navigatable := Character.GetNavigatable[]

            # Get the Focus Interface, this allows you to tell it to look at something or somewhere.
            Focus := Character.GetFocusInterface[]
        then:
            loop:
                UpdateState()
                #GetAllPlayers()
                if (CurrentState = "Dead"):
                    Print("I'm Dead")
                    Sleep(30.0)
                
                # Handle NPC Behavior 
                if(CurrentState = "Patrol"):
                    Print("Patrolling")
                    Sleep(1.0)
                else:
                    if(CurrentState = "Chase"):
                        Print("Chasing")
                        if(IsMoving = false):
                            ChaseClosestPlayer()
                            set IsMoving = true
                        Sleep(1.0)
                    else:
                        if(CurrentState = "Attack"):
                            Print("Attacking")
                            #todo add attack stuff
                            Sleep(1.0)
                       
                        Sleep(1.0)    
                        UpdateState()              
 
   
    
    UpdateState():void=
        var Searching : logic = false
        Ref := GetClosestPlayer()
        AllPlayers := NPCUtilities.GetAllPlayers()
        if(ClosestPlayer := AllPlayers[Ref]):
            PlayerDistance := CheckPlayerDistance(ClosestPlayer)
            #Print("Closest Player Distance = {PlayerDistance}")
            if(PlayerDistance < AttackRange):
                set CurrentState = "Attack"
            else:
                if(PlayerDistance < ChaseRange ):
                    set CurrentState = "Chase"
                else:
                    set CurrentState = "Patrol"    

    GetNPCLocation():vector3=
        var NPCLocation :vector3 = vector3{}
        if:
            # Get the Agent (the NPC).
            Agent := GetAgent[]
            Character := Agent.GetFortCharacter[]
            set NPCLocation = Character.GetTransform().Translation
        return NPCLocation
    
    WalkToTarget(TargetPlayer:player)<suspends>:void=
    
        if:
            
            # Get the Agent (the NPC).
            Agent := GetAgent[]

            # Gets the Fortnite Character interface, which gets you access to its gameplay data 
            # including its AI module for navigation and focus.
            Character := Agent.GetFortCharacter[]

            # Get the Navigatable Interface, this allows you to tell it to move.
            Navigatable := Character.GetNavigatable[]

            # Get the Focus Interface, this allows you to tell it to look at something or somewhere.
            Focus := Character.GetFocusInterface[]
            
        then:

            if(ExampleNPCBehavior.ShowAIDebug?):
                Print(new_npc_behavior_message_module.OnBeginMessage(Agent), ?Duration := ExampleNPCBehavior.AIDebugDrawTime)

                loop:

                    # Create a navigation target from these two positions that the navigation interface can use.
                    NavTargetStart := MakeNavigationTarget(GetNPCLocation())
                    NavTargetEnd := MakeNavigationTarget(GetClosestPlayerLocation())
                    
                    # If the debug flag is enabled draw a box around the location the NPC is moving toward for visual
                    # validation that it is where you expect.
                    if(ExampleNPCBehavior.ShowAIDebug?):
                        ExampleNPCBehavior.DrawDebugLocation(GetNPCLocation())

                    # Tell the navigation interface to walk to the location and store a navigation result for error checking.
                    NavResultGoTo := Navigatable.NavigateTo(NavTargetStart, ?MovementType:=movement_types.Walking)

                    NavTarget := MakeNavigationTarget(TargetPlayer)
                    NavResultGoToNext := Navigatable.NavigateTo(NavTarget, ?MovementType:=movement_types.Walking)

                    # Check to see if something has interfered with the NPC reaching the intended location and print a
                    # message to the output log.
                    if (NavResultGoTo = navigation_result.Unreachable):
                        if(ExampleNPCBehavior.ShowAIDebug?):
                            Print(new_npc_behavior_message_module.OnNavigateErrorMessage(Agent,GetNPCLocation().X,GetNPCLocation().Y,GetNPCLocation().Z), ?Duration := ExampleNPCBehavior.AIDebugDrawTime)
                    else:
                        # Once it arrives at its location, wait for this duration in seconds
                        Navigatable.Wait(?Duration := ExampleNPCBehavior.MoveToWaitDuration)
                    
                        
                    
                    # End of loop, continue the patrol back to the point.
                    
        else:
            # If code falls here something failed when gathering the agent or its interfaces
            if(ExampleNPCBehavior.ShowAIDebug?):
                ExampleNPCBehavior.PrintNPCB("Error in NPC Behavior Script on NPC Setup",
                        ?Duration := ExampleNPCBehavior.AIDebugDrawTime, 
                        ?TextColor := NamedColors.Red )    
    
    MoveToTarget(TargetPlayer:player)<suspends>:void=
        
        if:
            
            # Get the Agent (the NPC).
            Agent := GetAgent[]

            # Gets the Fortnite Character interface, which gets you access to its gameplay data 
            # including its AI module for navigation and focus.
            Character := Agent.GetFortCharacter[]

            # Get the Navigatable Interface, this allows you to tell it to move.
            Navigatable := Character.GetNavigatable[]

            # Get the Focus Interface, this allows you to tell it to look at something or somewhere.
            Focus := Character.GetFocusInterface[]
            
        then:

            if(ExampleNPCBehavior.ShowAIDebug?):
                Print(new_npc_behavior_message_module.OnBeginMessage(Agent), ?Duration := ExampleNPCBehavior.AIDebugDrawTime)

                loop:

                    # Create a navigation target from these two positions that the navigation interface can use.
                    NavTargetStart := MakeNavigationTarget(GetNPCLocation())
                    NavTargetEnd := MakeNavigationTarget(GetClosestPlayerLocation())
                    
                    # If the debug flag is enabled draw a box around the location the NPC is moving toward for visual
                    # validation that it is where you expect.
                    if(ExampleNPCBehavior.ShowAIDebug?):
                        ExampleNPCBehavior.DrawDebugLocation(GetNPCLocation())

                    # Tell the navigation interface to walk to the location and store a navigation result for error checking.
                    NavResultGoTo := Navigatable.NavigateTo(NavTargetStart, ?MovementType:=movement_types.Walking)

                    NavTarget := MakeNavigationTarget(TargetPlayer)
                    NavResultGoToNext := Navigatable.NavigateTo(NavTarget)
                    set IsMoving = false

                    # Check to see if something has interfered with the NPC reaching the intended location and print a
                    # message to the output log.
                    if (NavResultGoTo = navigation_result.Unreachable):
                        if(ExampleNPCBehavior.ShowAIDebug?):
                            Print(new_npc_behavior_message_module.OnNavigateErrorMessage(Agent,GetNPCLocation().X,GetNPCLocation().Y,GetNPCLocation().Z), ?Duration := ExampleNPCBehavior.AIDebugDrawTime)
                    else:
                        # Once it arrives at its location, wait for this duration in seconds
                        Navigatable.Wait(?Duration := ExampleNPCBehavior.MoveToWaitDuration)
                        if(IsMoving = false):
                      
                  
                    # End of loop, continue the patrol back to the point.
        else:
            # If code falls here something failed when gathering the agent or its interfaces
            if(ExampleNPCBehavior.ShowAIDebug?):
                ExampleNPCBehavior.PrintNPCB("Error in NPC Behavior Script on NPC Setup",
                        ?Duration := ExampleNPCBehavior.AIDebugDrawTime, 
                        ?TextColor := NamedColors.Red )         
    
    SetSearchTimer()<suspends>:void=
        loop:
            Sleep(SearchTimer)
        set LostTarget = true     

    walkToclosestPlayer():void=

        Ref := GetClosestPlayer()
        AllPlayers := NPCUtilities.GetAllPlayers()
        if(ClosestPlayer := AllPlayers[Ref]):
            spawn:
                WalkToTarget(ClosestPlayer)
            spawn:
                SetSearchTimer()


    ChaseClosestPlayer():void= 
        
        Ref := GetClosestPlayer()
        AllPlayers := NPCUtilities.GetAllPlayers()
        if(ClosestPlayer := AllPlayers[Ref]):
            set IsMoving = false
            spawn:
                MoveToTarget(ClosestPlayer)
                
    CheckPlayerDistance(Player : player):float = 

        if (FortCharacter := Player.GetFortCharacter[]):
            PlayerLocation := FortCharacter.GetTransform().Translation
            NPCLocation := GetNPCLocation()

            DeltaX := NPCLocation.X - PlayerLocation.X
            DeltaY := NPCLocation.Y - PlayerLocation.Y
            DeltaZ := NPCLocation.Z - PlayerLocation.Z

            distance := Sqrt(DeltaX * DeltaX + DeltaY * DeltaY + DeltaZ)
            Print("Distance = {distance}")
            
            return distance
        else:    
            return -1.0    
           
    GetClosestPlayer():int= 

        # var to hold distance 
        var LastDistance : float = ActivationRange
        # Get Allplayers
        AllPlayers:=NPCUtilities.GetAllPlayers()
        ClosestPlayer := player
        # interger to record the iteration the closest player is found
        var PlayerRef : int = 0

        # iterate through each player grabbing the fortcharacter
        for(CurrentPlayer := 0..AllPlayers.Length):
            if (ThisPlayer : player = AllPlayers[CurrentPlayer]):
                if (FortCharacter := ThisPlayer.GetFortCharacter[]):
                    
                    # locations of player & npc
                    PlayerLocation := FortCharacter.GetTransform().Translation
                    NPCLocation := GetNPCLocation()

                    # some fancy ■■■■ to workout distance of 2 vectors
                    DeltaX := NPCLocation.X - PlayerLocation.X
                    DeltaY := NPCLocation.Y - PlayerLocation.Y
                    DeltaZ := NPCLocation.Z - PlayerLocation.Z

                    distance := Sqrt(DeltaX * DeltaX + DeltaY * DeltaY + DeltaZ)
                    
                    # check see if distance is less than last distance
                    if(distance < LastDistance):
                        # store new shortest distance and playerRef    
                        set LastDistance = distance  
                        set PlayerRef = CurrentPlayer        
        
        # I wanted to retun the player but dont know how so i retun the refence to the player position in th players array
        return PlayerRef # fill this file with your verse-script

    GetClosestPlayerLocation():vector3= 

        # var to hold distance 
        var LastDistance : float = ActivationRange
        # Get Allplayers
        AllPlayers:=NPCUtilities.GetAllPlayers()
        ClosestPlayer := player
        # interger to record the iteration the closest player is found
        var PlayerRef : vector3 = vector3 {X:=0.0,Y:=0.0,Z:=0.0}

        # iterate through each player grabbing the fortcharacter
        for(CurrentPlayer := 0..AllPlayers.Length):
            if (ThisPlayer : player = AllPlayers[CurrentPlayer]):
                if (FortCharacter := ThisPlayer.GetFortCharacter[]):
                    
                    # locations of player & npc
                    PlayerLocation := FortCharacter.GetTransform().Translation
                    NPCLocation := GetNPCLocation()

                    # some fancy ■■■■ to workout distance of 2 vectors
                    DeltaX := NPCLocation.X - PlayerLocation.X
                    DeltaY := NPCLocation.Y - PlayerLocation.Y
                    DeltaZ := NPCLocation.Z - PlayerLocation.Z

                    distance := Sqrt(DeltaX * DeltaX + DeltaY * DeltaY + DeltaZ)
                    
                    # check see if distance is less than last distance
                    if(distance < LastDistance):
                        # store new shortest distance and playerRef    
                        set LastDistance = distance  
                        set PlayerRef = PlayerLocation        
        
        # return location as vector3
        return PlayerRef 
    
    Idle()<suspends>:void=

        
        if:
            
            # Get the Agent (the NPC).
            Agent := GetAgent[]

            # Gets the Fortnite Character interface, which gets you access to its gameplay data 
            # including its AI module for navigation and focus.
            Character := Agent.GetFortCharacter[]

            # Get the Navigatable Interface, this allows you to tell it to move.
            Navigatable := Character.GetNavigatable[]

            # Get the Focus Interface, this allows you to tell it to look at something or somewhere.
            Focus := Character.GetFocusInterface[]
            
        then:
            set LostTarget = false
            NavTarget := MakeNavigationTarget(GetNPCLocation())
            NavResultGoToNext := Navigatable.NavigateTo(NavTarget)

            # Check to see if something has interfered with the NPC reaching the intended location and print a
            # message to the output log.
            if (NavResultGoToNext = navigation_result.Unreachable):
                if(ExampleNPCBehavior.ShowAIDebug?):
                    Print(new_npc_behavior_message_module.OnNavigateErrorMessage(Agent,GetNPCLocation().X,GetNPCLocation().Y,GetNPCLocation().Z), ?Duration := ExampleNPCBehavior.AIDebugDrawTime)
            else:
                # Once it arrives at its location, wait for this duration in seconds
                Navigatable.Wait(?Duration := 3.0)

npc_utilities

using { /Fortnite.com/Devices }
using { /Fortnite.com/Playspaces }
using { /Verse.org/Simulation }



npc_utilities := class(creative_device):

   
    # Runs when the device is started in a running game
    OnBegin<override>()<suspends>:void=
        
        Print("npc_utilities loaded")
       
    GetAllPlayers() : []player =

        #Get AllPlayers
        Playspace: fort_playspace = GetPlayspace()
        AllPlayers: []player = Playspace.GetPlayers()
        
        return AllPlayers

new_npc_behavior (this is just the example file so i have access to debug module)

using { /Fortnite.com/AI }
using { /Fortnite.com/Characters }
using { /Verse.org/Colors }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }

# Getting started: 
# https://www.epicgames.com/fortnite/en-US/creative/docs/uefn/Verse/onboarding-guide-to-programming-with-verse-in-unreal-editor-for-fortnite
  
# Create a dedicated debug channel to draw to for this behavior
new_npc_behavior_debug_draw := class(debug_draw_channel) {}

# This module contains functions which return messages used for helpful debugging information that are
# localized and paired with the NPC ID.
new_npc_behavior_message_module:= module:

    OnBeginMessage<public><localizes>(Agent:agent):message =
        "NPC Agent = {Agent}: OnBegin triggered let's get started."
    OnEndMessage<public><localizes>(Agent:agent):message =
        "NPC Agent = {Agent}: OnEnd triggered let's cleanup."
    OnNavigateBeginMessage<public><localizes>(Agent:agent, X:float, Y:float, Z:float):message =
        "NPC Agent = {Agent}: Is moving to [{X},{Y},{Z}]"
    OnNavigateErrorMessage<public><localizes>(Agent:agent, X:float, Y:float, Z:float):message =
        "NPC Agent = {Agent}: Hit error moving to [{X},{Y},{Z}], please refer to Island Setting's Navigation debug"

# A Verse-authored NPC Behavior that can be used within an NPC Character Definition or a NPC Spawner device's NPC Behavior Script Override.
new_npc_behavior<public> := class(npc_behavior):

    # How long to wait in seconds after the NPC navigates to a point before moving on.
    @editable
    MoveToWaitDuration:float = 5.0

    # The negative min and absolute max x & y coordinate offset in centimeters to tell the NPC to move to
    @editable
    DistanceFromSpawnPtToMove:float = 1500.0

    # Whether to draw debug to the NPC channel when Verse Debug Draw is enabled in Island Settings.
    @editable
    ShowAIDebug:logic = true

    # How long in seconds to render the debug draw location and print text. 
    # It is recommended to keep this in sync with MoveToWaitDuration otherwise the print will not be shown if a previous message is displayed.
    @editable
    AIDebugDrawTime:float = 5.0

    # How long in seconds to render the look at arrow's debug draw.
    LookAtDebugDrawDuration:float = 0.5

    # Debug Draw instance.
    DebugDrawNPC:debug_draw = debug_draw{Channel := new_npc_behavior_debug_draw}

    # Used for specifying a point offset from the NPC pelvis to the head to draw the look at arrow from.
    VerticalOffsetToNPCHead<private>:float = 55.0

    # This function runs when the NPC is spawned in the world and ready to follow a behavior.
    OnBegin<override>()<suspends>:void =

        if:
            # Get the Agent (the NPC).
            Agent := GetAgent[]

            # Gets the Fortnite Character interface, which gets you access to its gameplay data 
            # including its AI module for navigation and focus.
            Character := Agent.GetFortCharacter[]

            # Get the Navigatable Interface, this allows you to tell it to move.
            Navigatable := Character.GetNavigatable[]

            # Get the Focus Interface, this allows you to tell it to look at something or somewhere.
            Focus := Character.GetFocusInterface[]

        then:
            # TODO: Now that you have the Fortnite Character and the AI interfaces, replace this with your code 
            # for your desired movement, look at, and other behavior allowed by the AI module.
            if(ShowAIDebug?):
                Print(new_npc_behavior_message_module.OnBeginMessage(Agent), ?Duration := AIDebugDrawTime)

            # Save the position of your character which we'll use to generate more points to move to from.
            NPCSpawnPoint := Character.GetTransform().Translation

            loop:
                # Create a random offset from the spawn point to walk toward.
                GoToPoint := NPCSpawnPoint + vector3{X := GetRandomFloat(-DistanceFromSpawnPtToMove,DistanceFromSpawnPtToMove),
                                                     Y := GetRandomFloat(-DistanceFromSpawnPtToMove,DistanceFromSpawnPtToMove),
                                                     Z := 0.0 }
                
                if(ShowAIDebug?):
                    Print(new_npc_behavior_message_module.OnNavigateBeginMessage(Agent,GoToPoint.X,GoToPoint.Y,GoToPoint.Z), ?Duration := AIDebugDrawTime)

                # Create a navigation target from these two positions that the navigation interface can use.
                NavTargetStart := MakeNavigationTarget(GoToPoint)
                NavTargetEnd := MakeNavigationTarget(NPCSpawnPoint)
                
                # If the debug flag is enabled draw a box around the location the NPC is moving toward for visual
                # validation that it is where you expect.
                if(ShowAIDebug?):
                    DrawDebugLocation(GoToPoint)
            
                # Tell the navigation interface to walk to the location and store a navigation result for error checking.
                NavResultGoTo := Navigatable.NavigateTo(NavTargetStart, ?MovementType:=movement_types.Walking)
                
                # Check to see if something has interfered with the NPC reaching the intended location and print a
                # message to the output log.
                if (NavResultGoTo = navigation_result.Unreachable):
                    if(ShowAIDebug?):
                        Print(new_npc_behavior_message_module.OnNavigateErrorMessage(Agent,GoToPoint.X,GoToPoint.Y,GoToPoint.Z), ?Duration := AIDebugDrawTime)
                else:
                    # Once it arrives at its location, wait for this duration in seconds
                    Navigatable.Wait(?Duration := MoveToWaitDuration)
                 
                # Draw more debug visuals to show the point the NPC will look at and move to.
                if(ShowAIDebug?):
                    DrawDebugLocation(NPCSpawnPoint)
                
                # Leveraging concurrency to wait until the NPC reaches its destination, while the calls to look back at its origin point 
                # and drawing a debug arrow never completes, continuing, ensures only the NavigateTo can win the race.
                race:
                    # Move back to its starting position.
                    NavResultGoToNext := Navigatable.NavigateTo(NavTargetEnd)

                    # Sets NPC to look at its previous position which will make it walk backwards. 
                    # This is meant to show the utility of the focus interface.
                    Focus.MaintainFocus(GoToPoint)

                    if(ShowAIDebug?):
                        DrawDebugLookAt(Character, GoToPoint) 
                    else:
                        Sleep(Inf)
                
                # Check again to see if something has interfered with the NPC reaching the intended location and
                # print a message to the output log.
                if (NavResultGoToNext = navigation_result.Unreachable):
                    if(ShowAIDebug?):
                        Print(new_npc_behavior_message_module.OnNavigateErrorMessage(Agent,GoToPoint.X,GoToPoint.Y,GoToPoint.Z), ?Duration := AIDebugDrawTime)
                else:
                    # This tells the NPC to wait for this amount of time in seconds.
                    Navigatable.Wait(?Duration := MoveToWaitDuration)

                # End of loop, continue the patrol back to the point.
        else:
            # If code falls here something failed when gathering the agent or its interfaces
            if(ShowAIDebug?):
                PrintNPCB("Error in NPC Behavior Script on NPC Setup",
                        ?Duration := AIDebugDrawTime, 
                        ?TextColor := NamedColors.Red )

    # This function draws a box around a specified position for a finite amount of time.
    # NOTE: To see this in game, Verse Debug Draw must be enabled in Island Settings.
    DrawDebugLocation(Location:vector3):void = 
        DebugDrawNPC.DrawPoint( Location, 
                                ?Color := NamedColors.SteelBlue, 
                                ?Thickness := 100.0, 
                                ?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration, 
                                ?Duration := AIDebugDrawTime )

    # This function draws an arrow from the Agent's head to its look at point every half a second. 
    # NOTE: To see this in game, Verse Debug Draw must be enabled in Island Settings.
    DrawDebugLookAt(Character:fort_character, LookAtPoint:vector3)<suspends>:void=
        loop:
            DebugDrawNPC.DrawArrow( Character.GetTransform().Translation + vector3{ Z := VerticalOffsetToNPCHead}, 
                                    LookAtPoint, 
                                    ?ArrowSize := 50.0, 
                                    ?Color := NamedColors.Yellow, 
                                    ?Thickness := 5.0, 
                                    ?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration, 
                                    ?Duration := LookAtDebugDrawDuration )
                                    
            #This sleep matches the length of time the arrow is drawn to avoid duplicate draws.
            Sleep(LookAtDebugDrawDuration)

    # Custom wrapper that provides a default duration and color.
    PrintNPCB(Msg:string,?Duration:float = AIDebugDrawTime, ?TextColor:color = NamedColors.Green):void =
        Print("[new_npc_behavior] {Msg}", ?Color := TextColor, ?Duration := Duration)

    # This function runs when the NPC is despawned or eliminated from the world.
    OnEnd<override>():void =
        # TODO: Replace this with your code for any cleanup that you want to happen.
        if(Agent := GetAgent[]):
            Print(new_npc_behavior_message_module.OnEndMessage(Agent), ?Duration := AIDebugDrawTime)
        else:
            PrintNPCB("OnEnd")

so u you need to setup a Npc Definition as a guard with an inventory and patrol modifiers

he should start by patrolling once you get within 100 of him he will chase you
once you outrun him i want him to return to patrolling but he seems to keep the last navtarget and i dont know how to clear it or return him to patrolling

1 Like

I would check out leash under the ai utilities.

You can get to the correct area within the digest by control clicking on the .GetNavigatable part of Character.GetNavigatable

So there is 2 ways to set the navigatin target either a vector3 or an agent

# Generate a navigation_target from any position
    MakeNavigationTarget<constructor><native><public>(Position:vector3):navigation_target

    # Generate a navigation_target from an agent
    MakeNavigationTarget<constructor><native><public>(Target:agent):navigation_target

if i use the vector3 method my code works as expected because the npc always reaches his destination

if i set him to target a player he will not change his target until he reaches the player he is chasing
i’ve tried setting his target to himself but it has no effect it seems like he must complete his navigation even is i set him another destination he will return to chasing the target player

Hey, did you make it? I want to make a horror game and I already have the character chase and stop chasing the player in X range, but I’m missing the free movement when it has not detected the player. Seeing the code I guess it does that or it goes to certain marked points (also works for me), I don’t know if you managed to do it or still nothing. It would help me a lot