Unable to figure out on kinematic body following a path in navmesh.

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By sxkod

Hi all

I have been trying to code an npc who follows the player. I have been tearing my hair out - or what is left of it. It probably is a dumb mistake but can’t find it for my life. I can generate a path, draw the path even. However, when I try to use the path to move_and_slide, my npc keeps flitting directions and no actual movements.

I put the screenshot of the navmesh scene and it’s child npc scene below. These scenes are part of a bigger code but I cleaned most of the irrelevant stuff. Any help greatly appreciated

https://imagebin.ca/v/6eFEU1EXBKZs

https://imagebin.ca/v/6eFEdhJgYFdQ

Thanks

extends KinematicBody

onready var dnode=get_parent().get_node("dnode")
onready var nav=get_parent().get_node("nav")

var path = []
const move_speed = 2
var stop_dist=1
var dstat=0
var mtgt=null

func _process(delta):
	#if not get_parent().ply_inzone:
	#	return

	dstat+=1
	if dstat>50 and path.size()<=0 and mtgt:
		path=nav.get_simple_path(global_transform.origin, mtgt.global_transform.origin)
		print("made path ",path)
		_draw_path(dnode,path)
		dstat=0
	_follow_path()

func _input(event):
	if Input.is_key_pressed(KEY_G):
		mtgt=get_parent().get_node("p1")
		path=[]
	elif Input.is_key_pressed(KEY_H):
		mtgt=get_parent().get_node("p2")
		path=[]


func _follow_path():
	if path.size()>0:
		var tgt=path[0]
		if transform.origin.distance_to(tgt)<stop_dist:
			path.remove(0)
			if path.size()>0:
				_move_along(path[0])
		else:
			_move_along(tgt)

func _turn_towards(pos):
	var ldir=pos
	ldir.y=global_transform.origin.y
	look_at(ldir, Vector3(0,1,0))

func _move_along(pos):
	_turn_towards(pos)
	var distto=global_transform.origin.distance_to(pos)
	if distto>stop_dist:
		var dxt=transform.basis.z*-move_speed
		move_and_slide(dxt)

func _draw_path(dnode,dpx): #expects a immediate geometry node and a path array
	var m = SpatialMaterial.new()	
	m.flags_unshaded = true
	m.flags_use_point_size = true
	m.albedo_color = Color(1.0, 0.0, 0.0, 1.0)
	dnode.set_material_override(m)
	dnode.clear()
	dnode.begin(Mesh.PRIMITIVE_LINE_STRIP, null)
	for x in dpx:
		dnode.add_vertex(x)
	dnode.end()