# datapack_loader.gd class_name DatapackLoader extends RefCounted const BASE_DATAPACKS_PATH = "user://datapacks/" const METADATA_FILENAME = "config.szpack" const DATAPACK_RESOURCE_FILENAME = "datapack.tres" ## 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 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 # ---------------------------------------------------------------------- # Example Usage: # var loader = DatapackLoader.new() # var core_pack = loader.load_datapack("core_rules") # # if core_pack: #\t var item = core_pack.get_object_by_id("sword-long") #\t if item: #\t\t print("Found item: " + item.name) # ----------------------------------------------------------------------