@tool class_name AnimationPlayerEditorCalls extends AnimationPlayer @export var excluded_function_calls: Array[StringName] = [ &"queue_free", &"free", ] var EDITOR_PATH: String: get: return str(get_parent().get_path()) + "/" var function_calls: Array[Dictionary] = [] func _ready() -> void: animation_started.connect(animation_started_func) func _process(_delta: float) -> void: if not Engine.is_editor_hint(): return if not is_playing(): function_calls.clear() return var remove_these_function_calls: Array = [] for index: int in function_calls.size(): var function_call: Dictionary = function_calls[index] if function_call.time > current_animation_position: continue if excluded_function_calls.has(function_call.name): remove_these_function_calls.append(index) continue var node: Node = get_node(function_call.path) node.call(function_call.name) remove_these_function_calls.append(index) for index: int in remove_these_function_calls: function_calls.remove_at(index) func animation_started_func(_dismiss: Variant) -> void: if not Engine.is_editor_hint(): return var animation: Animation = get_animation(current_animation) for track_index: int in animation.get_track_count(): if not animation.track_is_enabled(track_index): continue if animation.track_get_type(track_index) != Animation.TYPE_METHOD: continue var path: String = EDITOR_PATH + str(animation.track_get_path(track_index)) var track_key_count: int = animation.track_get_key_count(track_index) for key_index: int in track_key_count: var time: float = animation.track_get_key_time(track_index, key_index) if time < current_animation_position: continue var _name: StringName = animation.method_track_get_name(track_index, key_index) function_calls.append({ "path": path, "name": _name, "time": time, })