63 lines
1.7 KiB
GDScript
63 lines
1.7 KiB
GDScript
extends BTAction
|
|
class_name BTUnstuck
|
|
|
|
func npc_stuck(npc, cond):
|
|
if cond:
|
|
if npc.has_meta("stuck"):
|
|
var stuck = npc.get_meta("stuck")
|
|
stuck += 2.0 * get_process_delta_time()
|
|
npc.set_meta("stuck", stuck)
|
|
else:
|
|
npc.set_meta("stuck", 2.0 * get_process_delta_time())
|
|
print(npc.name, " stuck ", npc.get_meta("stuck"))
|
|
else:
|
|
if npc.has_meta("stuck"):
|
|
var stuck = npc.get_meta("stuck")
|
|
stuck -= 3.0 * get_process_delta_time()
|
|
print(npc.name, " unstucking: ", stuck)
|
|
if stuck > 0.01:
|
|
npc.set_meta("stuck", stuck)
|
|
else:
|
|
npc.set_meta("stuck", null)
|
|
|
|
func tick(tick: Tick) -> int:
|
|
var npc = tick.actor
|
|
var bb = tick.blackboard
|
|
var p = []
|
|
return FAILED
|
|
if randf() > 0.5:
|
|
p = [
|
|
["set", "parameters/main/Motion/walk/walking/blend_position", 1.0],
|
|
["set", "parameters/unstuck1/active", true]
|
|
]
|
|
else:
|
|
p = [
|
|
["set", "parameters/main/Motion/walk/walking/blend_position", 1.0],
|
|
["set", "parameters/unstuck2/active", true]
|
|
]
|
|
npc.smart_obj(p)
|
|
var front_result = bb.get("front_result")
|
|
var front_left_result = bb.get("front_left_result")
|
|
var front_right_result = bb.get("front_right_result")
|
|
var front_col = false
|
|
var left_col = false
|
|
var right_col = false
|
|
if front_result.has("collider"):
|
|
var col = front_result.collider
|
|
if !col.is_in_group("entry"):
|
|
front_col = true
|
|
if front_left_result.has("collider"):
|
|
var col = front_left_result.collider
|
|
if !col.is_in_group("entry"):
|
|
left_col = true
|
|
if front_right_result.has("collider"):
|
|
var col = front_right_result.collider
|
|
if !col.is_in_group("entry"):
|
|
right_col = true
|
|
if right_col && left_col || front_col:
|
|
npc_stuck(npc, true)
|
|
else:
|
|
npc_stuck(npc, false)
|
|
|
|
return OK
|