2026-01-01 16:33:32 +08:00
|
|
|
|
@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
|
|
|
|
|
|
|
2026-01-02 18:37:09 +08:00
|
|
|
|
var db : SceneIDDatabase = _clone_db_to_new(db_ro)
|
2026-01-01 16:33:32 +08:00
|
|
|
|
|
|
|
|
|
|
if db.scene_map.has(scene_path):
|
|
|
|
|
|
return int(db.scene_map[scene_path])
|
|
|
|
|
|
|
2026-01-02 18:37:09 +08:00
|
|
|
|
var new_id :int = db.next_id
|
2026-01-01 16:33:32 +08:00
|
|
|
|
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
|