MagicNStuff/source/src/core/level/level_area.gd

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