49 lines
1.2 KiB
GDScript
49 lines
1.2 KiB
GDScript
class_name LevelArea
|
|
extends Area3D
|
|
|
|
@export var level_loader: LevelLoader
|
|
@export var loaded_if_spawnpoint: Array[PlayerSpawnPoint] = []
|
|
@export var keep_loaded_duration: float = 3.0
|
|
|
|
|
|
func _enter_tree() -> void:
|
|
for spawnpoint: PlayerSpawnPoint in loaded_if_spawnpoint:
|
|
if GameGlobals.spawn_id == spawnpoint.spawn_id:
|
|
var was_threaded: bool = level_loader.load_threaded
|
|
level_loader.load_threaded = false
|
|
load_level()
|
|
level_loader.load_threaded = was_threaded
|
|
return
|
|
|
|
|
|
func _ready() -> void:
|
|
await get_tree().process_frame
|
|
await get_tree().process_frame
|
|
|
|
body_entered.connect(load_level.unbind(1))
|
|
body_exited.connect(unload_level.unbind(1))
|
|
|
|
|
|
func load_level() -> void:
|
|
assert(is_instance_valid(level_loader), "Level loader needs to be set.")
|
|
level_loader.load_level()
|
|
|
|
|
|
func unload_level() -> void:
|
|
assert(is_instance_valid(level_loader), "Level loader needs to be set.")
|
|
|
|
if keep_loaded_duration > 0.0:
|
|
var duration: float = keep_loaded_duration
|
|
|
|
while duration > 0.0:
|
|
if has_overlapping_bodies():
|
|
return
|
|
|
|
duration -= get_process_delta_time() * float(not get_tree().paused)
|
|
await get_tree().process_frame
|
|
|
|
if not is_inside_tree() or not is_instance_valid(get_tree()):
|
|
return
|
|
|
|
level_loader.unload_level()
|