# datapack_creator.gd class_name DatapackCreator extends RefCounted const BASE_DATAPACKS_PATH = "user://datapacks/" const METADATA_FILENAME = "config.szpack" const DATAPACK_RESOURCE_FILENAME = "datapack.res" const ASSETS_SUBDIR = "assets" const SINGLE_FILE_SAVE_FLAGS = ResourceSaver.FLAG_COMPRESS | ResourceSaver.FLAG_CHANGE_PATH var _pack_base_path: String = "" func save_datapack(datapack: DatapackModel, pack_name: String) -> bool: var full_pack_name = pack_name.validate_node_name() if full_pack_name.is_empty(): push_error("DatapackCreator: Invalid pack_name provided.") return false _pack_base_path = BASE_DATAPACKS_PATH + full_pack_name + "/" var assets_path = _pack_base_path + ASSETS_SUBDIR var success_dirs = true success_dirs = success_dirs and _make_dir_recursive_safe(_pack_base_path) success_dirs = success_dirs and _make_dir_recursive_safe(assets_path) if not success_dirs: push_error("DatapackCreator: Failed to create necessary directories.") return false var main_resource_path = _pack_base_path + DATAPACK_RESOURCE_FILENAME var error = ResourceSaver.save(datapack, main_resource_path, SINGLE_FILE_SAVE_FLAGS) if error != OK: push_error("DatapackCreator: Failed to save datapack resource at path '%s'. Error: %s" % [main_resource_path, error]) return false if not _write_metadata_file(datapack, _pack_base_path + METADATA_FILENAME): return false print("Datapack saved successfully to: %s" % _pack_base_path) return true func _make_dir_recursive_safe(path: String) -> bool: var error = DirAccess.make_dir_recursive_absolute(path) if error != OK and error != ERR_ALREADY_EXISTS: push_error("DirAccess: Failed to create directory: %s (Error: %s)" % [path, error]) return false return true func _write_metadata_file(datapack: DatapackModel, path: String) -> bool: var config = ConfigFile.new() var section = "Datapack" config.set_value(section, "guid", datapack.guid.to_string()) config.set_value(section, "name", datapack.name) config.set_value(section, "version", datapack.version) config.set_value(section, "entry_point", DATAPACK_RESOURCE_FILENAME) var error = config.save(path) if error != OK: push_error("DatapackCreator: Failed to save metadata file at path '%s'. Error: %s" % [path, error]) return false return true