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