|
2 | 2 | class_name SetSingletonTool |
3 | 3 | extends AgentToolBase |
4 | 4 |
|
| 5 | +## 获取脚本的 class_name。先查 ProjectSettings 已注册全局类,未注册则解析文件。 |
| 6 | +func _get_script_class_name(path: String) -> String: |
| 7 | + if not path.ends_with(".gd"): |
| 8 | + return "" |
| 9 | + |
| 10 | + # 优先查 ProjectSettings:Godot 已解析过的脚本这里最准最快 |
| 11 | + var class_list: Array = ProjectSettings.get_global_class_list() |
| 12 | + for entry in class_list: |
| 13 | + if entry.path == path: |
| 14 | + return entry.get("class", "") |
| 15 | + |
| 16 | + # 未注册则读文件解析 class_name 行 |
| 17 | + var file = FileAccess.open(path, FileAccess.READ) |
| 18 | + if file == null: |
| 19 | + return "" |
| 20 | + var text = file.get_as_string() |
| 21 | + for line in text.split("\n"): |
| 22 | + var s = line.strip_edges() |
| 23 | + if s.is_empty() or s.begins_with("#"): |
| 24 | + continue |
| 25 | + if s.begins_with("class_name "): |
| 26 | + return s.substr(11).strip_edges().split(" ")[0] # 取 extends 前的部分 |
| 27 | + return "" |
| 28 | + |
| 29 | +## 检查脚本是否继承自 Node(autoload 必要条件) |
| 30 | +func _script_extends_node(path: String) -> bool: |
| 31 | + if not path.ends_with(".gd"): |
| 32 | + return true # .tscn 场景必然是 Node |
| 33 | + |
| 34 | + var script = load(path) |
| 35 | + if not script is GDScript: |
| 36 | + return false |
| 37 | + |
| 38 | + var base: StringName = script.get_instance_base_type() |
| 39 | + if base.is_empty() or not ClassDB.class_exists(base): |
| 40 | + return false |
| 41 | + |
| 42 | + return ClassDB.is_parent_class(base, "Node") |
| 43 | + |
5 | 44 | func _get_tool_name() -> String: |
6 | 45 | return "set_singleton" |
7 | 46 |
|
@@ -39,6 +78,11 @@ func do_action(tool_call: AgentModelUtils.ToolCallsInfo) -> Dictionary: |
39 | 78 | var singleton_name = json.name |
40 | 79 | var singleton_path = json.get("path", "") |
41 | 80 | if singleton_path: |
| 81 | + var script_class := _get_script_class_name(singleton_path) |
| 82 | + if script_class != "" and script_class == singleton_name: |
| 83 | + return {"error": "自动加载名 '%s' 与脚本 class_name '%s' 冲突,不可挂载。请使用不同的自动加载名称。" % [singleton_name, script_class]} |
| 84 | + if not _script_extends_node(singleton_path): |
| 85 | + return {"error": "脚本 '%s' 不继承自 Node,无法设为自动加载。" % singleton_path} |
42 | 86 | var singleton = AlphaAgentSingleton.get_instance() |
43 | 87 | singleton.add_autoload_singleton(singleton_name, singleton_path) |
44 | 88 | return { |
|
0 commit comments