86 lines
2.5 KiB
GDScript
86 lines
2.5 KiB
GDScript
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
|