diff --git a/hsm/limbo_hsm.cpp b/hsm/limbo_hsm.cpp index d6c7ecdf..52730d28 100644 --- a/hsm/limbo_hsm.cpp +++ b/hsm/limbo_hsm.cpp @@ -263,6 +263,21 @@ void LimboHSM::_validate_property(PropertyInfo &p_property) const { void LimboHSM::_notification(int p_what) { switch (p_what) { case NOTIFICATION_POST_ENTER_TREE: { + if (was_active && is_root()) { + // Re-activate the root HSM if it was previously active. + // Typically, this happens when the node is re-entered scene repeatedly (e.g., re-parenting, pooling). + set_active(true); + } + } break; + case NOTIFICATION_EXIT_TREE: { + if (is_root()) { + // Remember active status for re-parenting and exit state machine + // to release resources and signal connections if active. + was_active = active; + if (is_active()) { + _exit(); + } + } } break; case NOTIFICATION_PROCESS: { _update(get_process_delta_time()); diff --git a/hsm/limbo_hsm.h b/hsm/limbo_hsm.h index f0e14a15..f7890c14 100644 --- a/hsm/limbo_hsm.h +++ b/hsm/limbo_hsm.h @@ -55,6 +55,7 @@ class LimboHSM : public LimboState { LimboState *previous_active; LimboState *next_active; bool updating = false; + bool was_active = false; HashMap transitions; diff --git a/hsm/limbo_state.cpp b/hsm/limbo_state.cpp index 69b24262..99791dde 100644 --- a/hsm/limbo_state.cpp +++ b/hsm/limbo_state.cpp @@ -190,11 +190,6 @@ void LimboState::_notification(int p_what) { _update_blackboard_plan(); } } break; - case NOTIFICATION_PREDELETE: { - if (is_active()) { - _exit(); - } - } break; } }