@tool extends Node2D class_name Event2D # 当前事件 @export var event: StringName: set(val): if event != val: event = val if is_node_ready() and Engine.is_editor_hint(): _auto_memo() @export var hide_if_on_stage: Array[int] = []: set(val): if hide_if_on_stage != val: hide_if_on_stage = val if is_node_ready() and Engine.is_editor_hint(): _auto_memo() # 前置依赖事件,为空时意味着无前置事件 @export var pre_event: StringName: set(val): if pre_event != val: pre_event = val if is_node_ready() and Engine.is_editor_hint(): _auto_memo() @export var hide_if_pre_on_stage: Array[int] = []: set(val): if hide_if_pre_on_stage != val: hide_if_pre_on_stage = val if is_node_ready() and Engine.is_editor_hint(): _auto_memo() @export_multiline var event_memo := "" @export_tool_button("auto memo") var auto_memo = _auto_memo @export_tool_button("创建脚本") var create_script = _create_script @export_tool_button("复制 greater setter") var copy_greater_setter = _copy_greater_setter @export_tool_button("复制 setter") var copy_setter = _copy_setter @export_tool_button("复制 getter") var copy_getter = _copy_getter var stage := 0 var prev_stage := 0 func _ready() -> void: # if event != &"": # name = "Event_" + event if Engine.is_editor_hint(): return if event != "": stage = EventManager.get_stage(event) if pre_event != "": prev_stage = EventManager.get_stage(pre_event) refresh_visibility() SceneManager.ground_ready.connect(_on_ground_ready) EventManager.stage_updated.connect(_on_global_stage_updated) func refresh_visibility() -> void: var should_show = not stage in hide_if_on_stage and not prev_stage in hide_if_pre_on_stage if visible != should_show: visible = should_show func _on_global_stage_updated(e: StringName, s: int): var updated = false var pre_updated = false if e == pre_event: pre_updated = prev_stage != s prev_stage = s print("[Event2D] Pre-event stage updated: %s, stage: %s" % [pre_event, prev_stage]) if e == event: updated = stage != s stage = s print("[Event2D] Event stage updated: %s, stage: %s" % [event, stage]) refresh_visibility() if pre_updated: _on_pre_stage_updated() if updated: _on_stage_updated() func _on_ground_ready(ground: Ground2D): pass func _on_pre_stage_updated(): pass func _on_stage_updated(): pass ###### TOOL BUTTON var script_template = preload("uid://bmxsei74o3pyw") as Script var script_root_dir = "res://scene/ground/script/" func _create_script(): var script = script_template.duplicate(true) as Script var ground = get_node("..") while ground and not ground is Ground2D: ground = ground.get_node("..") if not ground: printerr("[Event2D] _create_script Ground2D not found.") return var chapter = ground.scene_name.substr(0, 3) var section = ground.scene_name.substr(4, 3) if len(chapter) != 3 or len(section) != 3: printerr("[Event2D] ground scene_name error: %s" % ground.scene_name) return var file_name = section + "_" + name.to_snake_case() + ".gd" var path = script_root_dir + chapter + "/" + file_name if FileAccess.file_exists(path): print("file exists, reattach the script to node: %s" % path) set_script(load(path)) return ResourceSaver.save(script, path) set_script(load(path)) print("[Event2D] Script created: %s" % path) func _copy_greater_setter(): var text = 'EventManager.set_stage_if_greater(&"%s", 1)' % event DisplayServer.clipboard_set(text) print("Copied event greater setter: %s" % text) func _copy_setter(): var text = 'EventManager.set_stage(&"%s", 1)' % event DisplayServer.clipboard_set(text) print("Copied event setter: %s" % text) func _copy_getter(): var text = 'EventManager.get_stage(&"%s")' % event DisplayServer.clipboard_set(text) print("Copied event getter: %s" % text) func _auto_memo() -> void: var memo_str = "HideIfOnStage:\n" if event != "" and hide_if_on_stage: memo_str += event memo_str += "=" memo_str += "|".join(hide_if_on_stage) memo_str += "\n" if pre_event != "" and hide_if_pre_on_stage: memo_str += pre_event memo_str += "=" memo_str += "|".join(hide_if_pre_on_stage) var existing_lines = event_memo.split("\n") # 保留 # 开头的 line var kept_lines = [] for line in existing_lines: if line.begins_with("#"): kept_lines.append(line) event_memo = "\n".join(kept_lines) event_memo += "\n" if kept_lines else "" event_memo += memo_str