extends Node3D class_name LevelActive @export var open_duration: float = 1 @export var target_level_active: LevelActive var is_open_target: bool = false var is_open: bool = false var is_openning: bool = false var open_progress: float = 0 var body_entered_count: int var character_list: Array[Character] = [] func init() -> void: var area3D: Area3D = %Area3D as Area3D if area3D: area3D.connect("body_entered", on_body_entered) area3D.connect("body_exited", on_body_exited) for node in get_children(): if node is LevelActive: node.init() on_init() func _process(delta): if is_openning: var delta_dir = 1 if is_open_target else -1 open_progress += delta * delta_dir open_progress = clamp(open_progress, 0, open_duration) var progress = open_progress / open_duration if progress == 1 or progress == 0: is_open = is_open_target is_openning = false on_open_finished() on_process_open(progress) func on_body_entered(body: Node3D) -> void: if body is Character: character_list.append(body) body_entered_count += 1 on_body_entered_count_changed() func on_body_exited(body: Node3D) -> void: if body is Character and body in character_list: character_list.erase(body) body_entered_count -= 1 on_body_entered_count_changed() func set_open(is_open_set: bool) -> void: is_open_target = is_open_set is_openning = true func on_open_finished() -> void: on_set_open(is_open) if target_level_active: target_level_active.set_open(is_open) func on_init() -> void: pass func on_set_open(_is_open_set: bool) -> void: pass func on_process_open(_rate: float) -> void: pass func on_body_entered_count_changed() -> void: pass