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
		
	
| 
											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 |