# datapack_loader.gd class_name DatapackLoader extends RefCounted const BASE_DATAPACKS_PATH = "user://datapacks/" const METADATA_FILENAME = "config.szpack" # CHANGE HERE const DATAPACK_RESOURCE_FILENAME = "datapack.res" ## Loads a DatapackModel resource and all its referenced content from the user://datapacks/ folder. ## Returns the loaded DatapackModel object or null on failure. func load_datapack(pack_name: String) -> DatapackModel: var full_pack_name = pack_name.validate_node_name() if full_pack_name.is_empty(): push_error("DatapackLoader: Invalid pack_name provided.") return null var pack_dir = BASE_DATAPACKS_PATH + full_pack_name + "/" var metadata_path = pack_dir + METADATA_FILENAME var config = ConfigFile.new() var error = config.load(metadata_path) if error != OK: push_error("DatapackLoader: Could not load external manifest at: %s (Error: %s)" % [metadata_path, error]) return null var entry_point = config.get_value("Datapack", "entry_point", DATAPACK_RESOURCE_FILENAME) var resource_path = pack_dir + entry_point if not ResourceLoader.exists(resource_path): push_error("DatapackLoader: Main Resource file not found at path: %s" % resource_path) return null # Godot automatically detects the binary format and loads the resource. var datapack: DatapackModel = ResourceLoader.load(resource_path) if not datapack: push_error("DatapackLoader: Failed to load resource object from path: %s" % resource_path) return null datapack._build_content_map() print("Successfully loaded Datapack: %s (GUID: %s)" % [datapack.name, datapack.guid.to_string()]) return datapack