SessionZero-Client/sessionzero-client/scripts/helpers/datapack_loader.gd

47 lines
1.6 KiB
GDScript

# 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