mirror of
https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
synced 2025-10-22 15:38:14 +00:00
57 lines
2.2 KiB
GDScript
57 lines
2.2 KiB
GDScript
class_name _ModLoaderSceneExtension
|
|
extends RefCounted
|
|
|
|
# This Class provides methods for working with scene extensions.
|
|
# Currently all of the included methods are internal and should only be used by the mod loader itself.
|
|
|
|
const LOG_NAME := "ModLoader:SceneExtension"
|
|
|
|
|
|
# Iterates over the list of scenes to refresh them from storage.
|
|
# Used to apply script extensions to preloaded scenes.
|
|
static func refresh_scenes() -> void:
|
|
for scene_path in ModLoaderStore.scenes_to_refresh:
|
|
# Refresh cached scenes from storage
|
|
var _scene_from_file: PackedScene = ResourceLoader.load(
|
|
scene_path, "", ResourceLoader.CACHE_MODE_REPLACE
|
|
)
|
|
ModLoaderLog.debug("Refreshed scene at path: %s" % scene_path, LOG_NAME)
|
|
|
|
|
|
# Iterates over the list of scenes to modify and applies the specified edits to each scene.
|
|
static func handle_scene_extensions() -> void:
|
|
for scene_path in ModLoaderStore.scenes_to_modify.keys():
|
|
for scene_edit_callable in ModLoaderStore.scenes_to_modify[scene_path]:
|
|
var cached_scene: PackedScene = load(scene_path)
|
|
var cached_scene_instance: Node = cached_scene.instantiate()
|
|
var edited_scene: Node = scene_edit_callable.call(cached_scene_instance)
|
|
if not edited_scene:
|
|
ModLoaderLog.fatal(
|
|
(
|
|
'Scene extension of "%s" failed since the edit callable "%s" does not return the modified scene_instance'
|
|
% [scene_path, scene_edit_callable.get_method()]
|
|
),
|
|
LOG_NAME
|
|
)
|
|
return
|
|
_save_scene(edited_scene, scene_path)
|
|
|
|
|
|
# Saves a modified scene to resource cache.
|
|
# Further attempts to load this scene by path will instead return this resource.
|
|
#
|
|
# Parameters:
|
|
# - modified_scene (Node): The modified scene instance to be saved.
|
|
# - scene_path (String): The path to the scene file that will be replaced.
|
|
#
|
|
# Returns: void
|
|
static func _save_scene(modified_scene: Node, scene_path: String) -> void:
|
|
var packed_scene := PackedScene.new()
|
|
var _pack_error := packed_scene.pack(modified_scene)
|
|
ModLoaderLog.debug("packing scene -> %s" % packed_scene, LOG_NAME)
|
|
packed_scene.take_over_path(scene_path)
|
|
ModLoaderLog.debug(
|
|
"save_scene - taking over path - new path -> %s" % packed_scene.resource_path, LOG_NAME
|
|
)
|
|
ModLoaderStore.saved_objects.append(packed_scene)
|