extends BTAction class_name BTSetDestinationGroup export var dst_group: String = "" #func add_loc_marker(tgt): # for k in get_tree().get_nodes_in_group("debug_loc_marker"): # k.queue_free() # var cube = CubeMesh.new() # cube.size = Vector3(0.2, 3.0, 0.2) # var mi = MeshInstance.new() # mi.mesh = cube # get_node("/root").add_child(mi) # mi.global_transform.origin = tgt # mi.add_to_group("debug_loc_marker") func tick(tick: Tick) -> int: var dst = INF var tgt = Vector3() var npc = tick.actor var bb = tick.blackboard var npc_pos = npc.global_transform.origin var player_pos = global.player.global_transform.origin var enemy enemy = bb.get("closest_enemy") if !enemy: enemy = bb.get("last_enemy") var enemy_pos = Vector3() if enemy: enemy_pos = enemy.global_transform.origin if dst_group == "_away": assert(enemy) var dir = (npc_pos - enemy_pos).normalized() * 80.0 tgt = npc_pos + dir npc.set_meta("target_group", dst_group) npc.set_meta("target_loc", tgt) # print("run away ", npc.get_meta("action")) # add_loc_marker(tgt) return OK elif dst_group == "_player": # print("dst group player ", npc.name) tgt = player_pos npc.set_meta("target_group", dst_group) npc.set_meta("target_loc", tgt) # add_loc_marker(tgt) # print("chase player ", npc.get_meta("action")) return OK elif dst_group == "_enemy": # print("dst group enemy ", npc.name) tgt = enemy_pos npc.set_meta("target_group", dst_group) npc.set_meta("target_loc", tgt) # add_loc_marker(tgt) # print("chase player ", npc.get_meta("action")) return OK elif dst_group == "_patrol": var points = get_tree().get_nodes_in_group("patrol") if points.size() > 0: var c = points[randi() % points.size()] var tpos = c.global_transform.origin var ndst = tpos.distance_squared_to(npc_pos) dst = ndst tgt = tpos # print("set target: ", tgt) npc.set_meta("target_group", dst_group) npc.set_meta("target_loc", tgt) # add_loc_marker(tgt) return OK # print("dst ", npc.get_meta("action"), " ", dst_group) for c in get_tree().get_nodes_in_group(dst_group): if c is Spatial: # print(c.name) var tpos = c.global_transform.origin var ndst = tpos.distance_squared_to(npc_pos) if dst > ndst: dst = ndst tgt = tpos # print("dst: ", dst) if dst < 100000.0: # print("set target: ", tgt) npc.set_meta("target_group", dst_group) npc.set_meta("target_loc", tgt) # add_loc_marker(tgt) # print("set to: ", dst_group) # if dst_group == "hide_spot": # print("hiding to ", tgt) return OK return FAILED