53 lines
1.4 KiB
GDScript
53 lines
1.4 KiB
GDScript
@tool
|
|
class_name LevelLoader
|
|
extends Node
|
|
## Loads scenes into a container.
|
|
|
|
signal level_load_started
|
|
signal level_loaded
|
|
signal level_ready
|
|
|
|
## Container where the level instance will be added.
|
|
@export var level_container : Node
|
|
## Loads a level on start.
|
|
@export var auto_load : bool = false
|
|
@export var current_level_path : String
|
|
@export_group("Debugging")
|
|
@export var force_level : String
|
|
@export var current_level : Node
|
|
|
|
var is_loading : bool = false
|
|
|
|
func get_current_level_path() -> String:
|
|
return current_level_path if force_level.is_empty() else force_level
|
|
|
|
func _attach_level(level_resource : Resource):
|
|
assert(level_container != null, "level_container is null")
|
|
var instance = level_resource.instantiate()
|
|
level_container.call_deferred("add_child", instance)
|
|
return instance
|
|
|
|
func load_level(level_path : String = get_current_level_path()):
|
|
if is_loading : return
|
|
if is_instance_valid(current_level):
|
|
current_level.queue_free()
|
|
await current_level.tree_exited
|
|
current_level = null
|
|
is_loading = true
|
|
current_level_path = level_path
|
|
SceneLoader.load_scene(level_path, true)
|
|
level_load_started.emit()
|
|
await SceneLoader.scene_loaded
|
|
is_loading = false
|
|
current_level = _attach_level(SceneLoader.get_resource())
|
|
level_loaded.emit()
|
|
await current_level.ready
|
|
level_ready.emit()
|
|
|
|
func reload_level():
|
|
load_level()
|
|
|
|
func _ready():
|
|
if auto_load:
|
|
load_level()
|