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

71 lines
2.3 KiB
GDScript

# 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