40 lines
1.1 KiB
GDScript
40 lines
1.1 KiB
GDScript
@tool
|
||
extends RefCounted
|
||
class_name ReedSceneIDEditorSystem
|
||
|
||
const DB_PATH := "res://addons/reedscene/demo/data_base/GLOBAL_SCENE_ID.tres"
|
||
|
||
static func _load_db_readonly() -> SceneIDDatabase:
|
||
# 忽略缓存,避免拿到同一个共享实例(更稳)
|
||
return ResourceLoader.load(DB_PATH, "", ResourceLoader.CACHE_MODE_IGNORE)
|
||
|
||
static func _clone_db_to_new(db_ro: SceneIDDatabase) -> SceneIDDatabase:
|
||
var db := SceneIDDatabase.new()
|
||
if db_ro:
|
||
db.next_id = db_ro.next_id
|
||
# 深拷贝 Dictionary,彻底断开只读引用链
|
||
db.scene_map = db_ro.scene_map.duplicate(true)
|
||
return db
|
||
|
||
static func request_id_for_scene(scene_path: String) -> int:
|
||
var db_ro := _load_db_readonly()
|
||
if db_ro == null:
|
||
push_error("[ReedSceneIDEditorSystem] Database not found: " + DB_PATH)
|
||
return -1
|
||
|
||
var db := _clone_db_to_new(db_ro)
|
||
|
||
if db.scene_map.has(scene_path):
|
||
return int(db.scene_map[scene_path])
|
||
|
||
var new_id := db.next_id
|
||
db.next_id += 1
|
||
db.scene_map[scene_path] = new_id
|
||
|
||
var err := ResourceSaver.save(db, DB_PATH)
|
||
if err != OK:
|
||
push_error("[ReedSceneIDEditorSystem] Failed to save DB (%s), err=%d" % [DB_PATH, err])
|
||
return -1
|
||
|
||
return new_id
|