extends Node class_name StateMachine @export var current_state: State var states: Dictionary[StringName,State] = {} func _ready() -> void: for child in get_children(): if child is State: states[child.name] = child child.transition.connect(on_transition_required) else: push_warning("Child of state machine is not state") current_state.enter() func on_transition_required(to: StringName): if is_multiplayer_authority() == false: return if states.has(to) == false: push_warning("Incorrect state request: " + to) return change_state(states[to]) change_state_to_name.rpc(to) func change_state(to_state: State) -> void: if current_state != null: current_state.exit() current_state = to_state current_state.enter() @rpc func change_state_to_name(to_name: StringName): if current_state != null: current_state.exit() current_state = states[to_name] current_state.enter() @rpc("authority","call_local","unreliable") func clear_state(): if current_state == null: return current_state.exit() current_state = null func _process(delta: float) -> void: if current_state == null: return current_state.update(delta) func _input(event: InputEvent) -> void: if current_state != null: current_state.state_input(event) func _physics_process(delta: float) -> void: if current_state == null: return current_state.physics_update(delta)