71 lines
2.3 KiB
GDScript
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
|