98 lines
2.1 KiB
GDScript
98 lines
2.1 KiB
GDScript
@tool
|
||
extends Node
|
||
class_name ReedSceneID
|
||
|
||
##此Scene的描述ID,无法主动修改,你可以向編輯器申請。
|
||
@export_custom(
|
||
PROPERTY_HINT_NONE,
|
||
"",
|
||
PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY
|
||
)
|
||
var scene_id: int = -1:
|
||
set(value):
|
||
if _scene_id == value:
|
||
return
|
||
_scene_id = value
|
||
if Engine.is_editor_hint():
|
||
_sync_node_name()
|
||
update_configuration_warnings()
|
||
get():
|
||
return _scene_id
|
||
|
||
var _scene_id: int = -1
|
||
var _is_syncing_name := false
|
||
|
||
const DB_PATH := "res://addons/reedscene/demo/data_base/GLOBAL_SCENE_ID.tres"
|
||
|
||
## ==============================
|
||
## Build In
|
||
## ==============================
|
||
|
||
## 進入Tree
|
||
func _enter_tree() -> void:
|
||
if Engine.is_editor_hint():
|
||
_sync_node_name()
|
||
|
||
## 初始化完成后
|
||
func _ready() -> void:
|
||
if Engine.is_editor_hint():
|
||
renamed.connect(func():
|
||
_sync_node_name()
|
||
)
|
||
|
||
func has_id() -> bool:
|
||
return scene_id >= 0
|
||
|
||
func _get_display_name() -> String:
|
||
if not has_id():
|
||
return "[Invalid!]"
|
||
return "[ID: %d]" % scene_id
|
||
|
||
func _sync_node_name() -> void:
|
||
if _is_syncing_name:
|
||
return
|
||
|
||
_is_syncing_name = true
|
||
|
||
var desired := _get_display_name()
|
||
if name != desired:
|
||
name = desired
|
||
|
||
_is_syncing_name = false
|
||
|
||
func _get_configuration_warnings() -> PackedStringArray:
|
||
var warnings := PackedStringArray()
|
||
|
||
# 1️. 结构校验(只跟 Node 结构有关)
|
||
var parent := get_parent()
|
||
if parent == null or not (parent is ReedScene):
|
||
warnings.append("ReedSceneID must be a child of ReedScene.")
|
||
return warnings
|
||
|
||
# 2️. 自身状态
|
||
if not has_id():
|
||
warnings.append("Scene ID is not assigned.")
|
||
return warnings
|
||
|
||
# 3️. DB 一致性校验(委托给 DB)
|
||
var scene_path := parent.scene_file_path
|
||
if scene_path.is_empty():
|
||
warnings.append("Parent scene is not saved; cannot validate Scene ID.")
|
||
return warnings
|
||
|
||
var uid := ResourceUID.path_to_uid(scene_path)
|
||
|
||
var db := load(DB_PATH) as SceneIDDatabase
|
||
if not db:
|
||
warnings.append("SceneIDDatabase not found.")
|
||
return warnings
|
||
|
||
var result := db.validate_scene_id(scene_id, uid, scene_path)
|
||
if result == null:
|
||
return warnings
|
||
|
||
for msg in result.messages:
|
||
warnings.append(msg)
|
||
|
||
return warnings
|