You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
1.6 KiB
GDScript

8 months ago
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