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
62 lines
1.6 KiB
GDScript
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
|