56 lines
1.9 KiB
GDScript
56 lines
1.9 KiB
GDScript
# 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)
|
|
# ----------------------------------------------------------------------
|