Files
kicking-high/proto3/godot/ai/set_dst_from_group.gd
2020-04-13 12:45:25 +03:00

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