Compare commits
8 Commits
1b9a81ad0c
...
bae9ff8a30
Author | SHA1 | Date |
---|---|---|
Legendsmith | bae9ff8a30 | |
Serhii Snitsaruk | f90c48eb81 | |
Serhii Snitsaruk | 162de0f868 | |
Serhii Snitsaruk | 423c4ce7a4 | |
Serhii Snitsaruk | a5d59a0a51 | |
Serhii Snitsaruk | 85eda3c804 | |
Serhii Snitsaruk | bbe71bb378 | |
Legendsmith | bbdafa9033 |
|
@ -45,27 +45,27 @@ Methods
|
||||||
.. table::
|
.. table::
|
||||||
:widths: auto
|
:widths: auto
|
||||||
|
|
||||||
+-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| |void| | :ref:`add_transition<class_LimboHSM_method_add_transition>`\ (\ from_state\: :ref:`LimboState<class_LimboState>`, to_state\: :ref:`LimboState<class_LimboState>`, event\: ``StringName``\ ) |
|
| |void| | :ref:`add_transition<class_LimboHSM_method_add_transition>`\ (\ from_state\: :ref:`LimboState<class_LimboState>`, to_state\: :ref:`LimboState<class_LimboState>`, event\: ``StringName``, guard\: ``Callable`` = Callable()\ ) |
|
||||||
+-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| |void| | :ref:`change_active_state<class_LimboHSM_method_change_active_state>`\ (\ state\: :ref:`LimboState<class_LimboState>`\ ) |
|
| |void| | :ref:`change_active_state<class_LimboHSM_method_change_active_state>`\ (\ state\: :ref:`LimboState<class_LimboState>`\ ) |
|
||||||
+-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| :ref:`LimboState<class_LimboState>` | :ref:`get_active_state<class_LimboHSM_method_get_active_state>`\ (\ ) |const| |
|
| :ref:`LimboState<class_LimboState>` | :ref:`get_active_state<class_LimboHSM_method_get_active_state>`\ (\ ) |const| |
|
||||||
+-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| :ref:`LimboState<class_LimboState>` | :ref:`get_leaf_state<class_LimboHSM_method_get_leaf_state>`\ (\ ) |const| |
|
| :ref:`LimboState<class_LimboState>` | :ref:`get_leaf_state<class_LimboHSM_method_get_leaf_state>`\ (\ ) |const| |
|
||||||
+-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| :ref:`LimboState<class_LimboState>` | :ref:`get_previous_active_state<class_LimboHSM_method_get_previous_active_state>`\ (\ ) |const| |
|
| :ref:`LimboState<class_LimboState>` | :ref:`get_previous_active_state<class_LimboHSM_method_get_previous_active_state>`\ (\ ) |const| |
|
||||||
+-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| ``bool`` | :ref:`has_transition<class_LimboHSM_method_has_transition>`\ (\ from_state\: :ref:`LimboState<class_LimboState>`, event\: ``StringName``\ ) |const| |
|
| ``bool`` | :ref:`has_transition<class_LimboHSM_method_has_transition>`\ (\ from_state\: :ref:`LimboState<class_LimboState>`, event\: ``StringName``\ ) |const| |
|
||||||
+-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| |void| | :ref:`initialize<class_LimboHSM_method_initialize>`\ (\ agent\: ``Node``, parent_scope\: :ref:`Blackboard<class_Blackboard>` = null\ ) |
|
| |void| | :ref:`initialize<class_LimboHSM_method_initialize>`\ (\ agent\: ``Node``, parent_scope\: :ref:`Blackboard<class_Blackboard>` = null\ ) |
|
||||||
+-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| |void| | :ref:`remove_transition<class_LimboHSM_method_remove_transition>`\ (\ from_state\: :ref:`LimboState<class_LimboState>`, event\: ``StringName``\ ) |
|
| |void| | :ref:`remove_transition<class_LimboHSM_method_remove_transition>`\ (\ from_state\: :ref:`LimboState<class_LimboState>`, event\: ``StringName``\ ) |
|
||||||
+-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| |void| | :ref:`set_active<class_LimboHSM_method_set_active>`\ (\ active\: ``bool``\ ) |
|
| |void| | :ref:`set_active<class_LimboHSM_method_set_active>`\ (\ active\: ``bool``\ ) |
|
||||||
+-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| |void| | :ref:`update<class_LimboHSM_method_update>`\ (\ delta\: ``float``\ ) |
|
| |void| | :ref:`update<class_LimboHSM_method_update>`\ (\ delta\: ``float``\ ) |
|
||||||
+-------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
|
|
||||||
.. rst-class:: classref-section-separator
|
.. rst-class:: classref-section-separator
|
||||||
|
|
||||||
|
@ -191,9 +191,16 @@ Method Descriptions
|
||||||
|
|
||||||
.. rst-class:: classref-method
|
.. rst-class:: classref-method
|
||||||
|
|
||||||
|void| **add_transition**\ (\ from_state\: :ref:`LimboState<class_LimboState>`, to_state\: :ref:`LimboState<class_LimboState>`, event\: ``StringName``\ ) :ref:`🔗<class_LimboHSM_method_add_transition>`
|
|void| **add_transition**\ (\ from_state\: :ref:`LimboState<class_LimboState>`, to_state\: :ref:`LimboState<class_LimboState>`, event\: ``StringName``, guard\: ``Callable`` = Callable()\ ) :ref:`🔗<class_LimboHSM_method_add_transition>`
|
||||||
|
|
||||||
Establishes a transition from one state to another when ``event`` is dispatched. Both ``from_state`` and ``to_state`` must be immediate children of this state.
|
Establishes a transition from one state to another when ``event`` is dispatched. Both ``from_state`` and ``to_state`` must be immediate children of this **LimboHSM**.
|
||||||
|
|
||||||
|
Optionally, a ``guard`` function can be specified, which must return a boolean value. If the guard function returns ``false``, the transition will not occur. The guard function is called immediately before the transition is considered. For a state-wide guard function, check out :ref:`LimboState.set_guard<class_LimboState_method_set_guard>`.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
func my_guard() -> bool:
|
||||||
|
return is_some_condition_met()
|
||||||
|
|
||||||
.. rst-class:: classref-item-separator
|
.. rst-class:: classref-item-separator
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,14 @@
|
||||||
<param index="0" name="from_state" type="LimboState" />
|
<param index="0" name="from_state" type="LimboState" />
|
||||||
<param index="1" name="to_state" type="LimboState" />
|
<param index="1" name="to_state" type="LimboState" />
|
||||||
<param index="2" name="event" type="StringName" />
|
<param index="2" name="event" type="StringName" />
|
||||||
|
<param index="3" name="guard" type="Callable" default="Callable()" />
|
||||||
<description>
|
<description>
|
||||||
Establishes a transition from one state to another when [param event] is dispatched. Both [param from_state] and [param to_state] must be immediate children of this state.
|
Establishes a transition from one state to another when [param event] is dispatched. Both [param from_state] and [param to_state] must be immediate children of this [LimboHSM].
|
||||||
|
Optionally, a [param guard] function can be specified, which must return a boolean value. If the guard function returns [code]false[/code], the transition will not occur. The guard function is called immediately before the transition is considered. For a state-wide guard function, check out [method LimboState.set_guard].
|
||||||
|
[codeblock]
|
||||||
|
func my_guard() -> bool:
|
||||||
|
return is_some_condition_met()
|
||||||
|
[/codeblock]
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="change_active_state">
|
<method name="change_active_state">
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "editor/editor_file_system.h"
|
#include "editor/editor_file_system.h"
|
||||||
#include "editor/editor_help.h"
|
#include "editor/editor_help.h"
|
||||||
#include "editor/editor_interface.h"
|
#include "editor/editor_interface.h"
|
||||||
|
#include "editor/editor_main_screen.h"
|
||||||
#include "editor/editor_paths.h"
|
#include "editor/editor_paths.h"
|
||||||
#include "editor/editor_settings.h"
|
#include "editor/editor_settings.h"
|
||||||
#include "editor/filesystem_dock.h"
|
#include "editor/filesystem_dock.h"
|
||||||
|
|
|
@ -100,7 +100,7 @@ void LimboHSM::update(double p_delta) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LimboHSM::add_transition(LimboState *p_from_state, LimboState *p_to_state, const StringName &p_event) {
|
void LimboHSM::add_transition(LimboState *p_from_state, LimboState *p_to_state, const StringName &p_event, const Callable &p_guard) {
|
||||||
ERR_FAIL_COND_MSG(p_from_state != nullptr && p_from_state->get_parent() != this, "LimboHSM: Unable to add a transition from a state that is not an immediate child of mine.");
|
ERR_FAIL_COND_MSG(p_from_state != nullptr && p_from_state->get_parent() != this, "LimboHSM: Unable to add a transition from a state that is not an immediate child of mine.");
|
||||||
ERR_FAIL_COND_MSG(p_to_state == nullptr, "LimboHSM: Unable to add a transition to a null state.");
|
ERR_FAIL_COND_MSG(p_to_state == nullptr, "LimboHSM: Unable to add a transition to a null state.");
|
||||||
ERR_FAIL_COND_MSG(p_to_state->get_parent() != this, "LimboHSM: Unable to add a transition to a state that is not an immediate child of mine.");
|
ERR_FAIL_COND_MSG(p_to_state->get_parent() != this, "LimboHSM: Unable to add a transition to a state that is not an immediate child of mine.");
|
||||||
|
@ -108,8 +108,13 @@ void LimboHSM::add_transition(LimboState *p_from_state, LimboState *p_to_state,
|
||||||
|
|
||||||
TransitionKey key = Transition::make_key(p_from_state, p_event);
|
TransitionKey key = Transition::make_key(p_from_state, p_event);
|
||||||
ERR_FAIL_COND_MSG(transitions.has(key), "LimboHSM: Unable to add another transition with the same event and origin.");
|
ERR_FAIL_COND_MSG(transitions.has(key), "LimboHSM: Unable to add another transition with the same event and origin.");
|
||||||
// Note: Explicit casting needed for GDExtension.
|
// Note: Explicit ObjectID casting needed for GDExtension.
|
||||||
transitions[key] = { p_from_state != nullptr ? ObjectID(p_from_state->get_instance_id()) : ObjectID(), ObjectID(p_to_state->get_instance_id()), p_event };
|
transitions[key] = {
|
||||||
|
p_from_state != nullptr ? ObjectID(p_from_state->get_instance_id()) : ObjectID(),
|
||||||
|
ObjectID(p_to_state->get_instance_id()),
|
||||||
|
p_event,
|
||||||
|
p_guard
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void LimboHSM::remove_transition(LimboState *p_from_state, const StringName &p_event) {
|
void LimboHSM::remove_transition(LimboState *p_from_state, const StringName &p_event) {
|
||||||
|
@ -166,13 +171,13 @@ bool LimboHSM::_dispatch(const StringName &p_event, const Variant &p_cargo) {
|
||||||
|
|
||||||
Transition transition;
|
Transition transition;
|
||||||
_get_transition(active_state, p_event, transition);
|
_get_transition(active_state, p_event, transition);
|
||||||
if (transition.is_valid()) {
|
if (transition.is_valid() && transition.is_allowed()) {
|
||||||
to_state = Object::cast_to<LimboState>(ObjectDB::get_instance(transition.to_state));
|
to_state = Object::cast_to<LimboState>(ObjectDB::get_instance(transition.to_state));
|
||||||
}
|
}
|
||||||
if (to_state == nullptr) {
|
if (to_state == nullptr) {
|
||||||
// Get ANYSTATE transition.
|
// Get ANYSTATE transition.
|
||||||
_get_transition(nullptr, p_event, transition);
|
_get_transition(nullptr, p_event, transition);
|
||||||
if (transition.is_valid()) {
|
if (transition.is_valid() && transition.is_allowed()) {
|
||||||
to_state = Object::cast_to<LimboState>(ObjectDB::get_instance(transition.to_state));
|
to_state = Object::cast_to<LimboState>(ObjectDB::get_instance(transition.to_state));
|
||||||
if (to_state == active_state) {
|
if (to_state == active_state) {
|
||||||
// Transitions to self are not allowed with ANYSTATE.
|
// Transitions to self are not allowed with ANYSTATE.
|
||||||
|
@ -260,22 +265,46 @@ void LimboHSM::_validate_property(PropertyInfo &p_property) const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LimboHSM::_exit_if_not_inside_tree() {
|
||||||
|
if (is_active() && !is_inside_tree()) {
|
||||||
|
_exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void LimboHSM::_notification(int p_what) {
|
void LimboHSM::_notification(int p_what) {
|
||||||
switch (p_what) {
|
switch (p_what) {
|
||||||
case NOTIFICATION_POST_ENTER_TREE: {
|
case NOTIFICATION_POST_ENTER_TREE: {
|
||||||
if (was_active && is_root()) {
|
if (was_active && is_root()) {
|
||||||
// Re-activate the root HSM if it was previously active.
|
// 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).
|
// Typically, this happens when the node is re-entered scene repeatedly (such as with object pooling).
|
||||||
set_active(true);
|
set_active(true);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case NOTIFICATION_EXIT_TREE: {
|
case NOTIFICATION_EXIT_TREE: {
|
||||||
if (is_root()) {
|
if (is_root()) {
|
||||||
// Remember active status for re-parenting and exit state machine
|
// Exit the state machine if the root HSM is no longer in the scene tree (except when being reparented).
|
||||||
// to release resources and signal connections if active.
|
// This ensures that resources and signal connections are released if active.
|
||||||
was_active = active;
|
was_active = is_active();
|
||||||
if (is_active()) {
|
if (is_active()) {
|
||||||
|
// Check if the HSM node is being deleted.
|
||||||
|
bool is_being_deleted = false;
|
||||||
|
Node *node = this;
|
||||||
|
while (node) {
|
||||||
|
if (node->is_queued_for_deletion()) {
|
||||||
|
is_being_deleted = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
node = node->get_parent();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_being_deleted) {
|
||||||
|
// Exit the state machine immediately if the HSM is being deleted.
|
||||||
_exit();
|
_exit();
|
||||||
|
} else {
|
||||||
|
// Use deferred mode to prevent exiting during Node re-parenting.
|
||||||
|
// This allows the HSM to remain active when it (or one of its parents) is reparented.
|
||||||
|
callable_mp(this, &LimboHSM::_exit_if_not_inside_tree).call_deferred();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
@ -300,7 +329,7 @@ void LimboHSM::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("get_leaf_state"), &LimboHSM::get_leaf_state);
|
ClassDB::bind_method(D_METHOD("get_leaf_state"), &LimboHSM::get_leaf_state);
|
||||||
ClassDB::bind_method(D_METHOD("set_active", "active"), &LimboHSM::set_active);
|
ClassDB::bind_method(D_METHOD("set_active", "active"), &LimboHSM::set_active);
|
||||||
ClassDB::bind_method(D_METHOD("update", "delta"), &LimboHSM::update);
|
ClassDB::bind_method(D_METHOD("update", "delta"), &LimboHSM::update);
|
||||||
ClassDB::bind_method(D_METHOD("add_transition", "from_state", "to_state", "event"), &LimboHSM::add_transition);
|
ClassDB::bind_method(D_METHOD("add_transition", "from_state", "to_state", "event", "guard"), &LimboHSM::add_transition, DEFVAL(Callable()));
|
||||||
ClassDB::bind_method(D_METHOD("remove_transition", "from_state", "event"), &LimboHSM::remove_transition);
|
ClassDB::bind_method(D_METHOD("remove_transition", "from_state", "event"), &LimboHSM::remove_transition);
|
||||||
ClassDB::bind_method(D_METHOD("has_transition", "from_state", "event"), &LimboHSM::has_transition);
|
ClassDB::bind_method(D_METHOD("has_transition", "from_state", "event"), &LimboHSM::has_transition);
|
||||||
ClassDB::bind_method(D_METHOD("anystate"), &LimboHSM::anystate);
|
ClassDB::bind_method(D_METHOD("anystate"), &LimboHSM::anystate);
|
||||||
|
|
|
@ -39,9 +39,12 @@ private:
|
||||||
ObjectID from_state;
|
ObjectID from_state;
|
||||||
ObjectID to_state;
|
ObjectID to_state;
|
||||||
StringName event;
|
StringName event;
|
||||||
|
Callable guard;
|
||||||
|
|
||||||
inline bool is_valid() const { return to_state != ObjectID(); }
|
inline bool is_valid() const { return to_state != ObjectID(); }
|
||||||
|
|
||||||
|
inline bool is_allowed() const { return guard.is_null() || guard.call(); }
|
||||||
|
|
||||||
static _FORCE_INLINE_ TransitionKey make_key(LimboState *p_from_state, const StringName &p_event) {
|
static _FORCE_INLINE_ TransitionKey make_key(LimboState *p_from_state, const StringName &p_event) {
|
||||||
return TransitionKey(
|
return TransitionKey(
|
||||||
p_from_state != nullptr ? uint64_t(p_from_state->get_instance_id()) : 0,
|
p_from_state != nullptr ? uint64_t(p_from_state->get_instance_id()) : 0,
|
||||||
|
@ -60,6 +63,7 @@ private:
|
||||||
HashMap<TransitionKey, Transition, TransitionKeyHasher> transitions;
|
HashMap<TransitionKey, Transition, TransitionKeyHasher> transitions;
|
||||||
|
|
||||||
void _get_transition(LimboState *p_from_state, const StringName &p_event, Transition &r_transition) const;
|
void _get_transition(LimboState *p_from_state, const StringName &p_event, Transition &r_transition) const;
|
||||||
|
void _exit_if_not_inside_tree();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
@ -93,7 +97,7 @@ public:
|
||||||
|
|
||||||
void update(double p_delta);
|
void update(double p_delta);
|
||||||
|
|
||||||
void add_transition(LimboState *p_from_state, LimboState *p_to_state, const StringName &p_event);
|
void add_transition(LimboState *p_from_state, LimboState *p_to_state, const StringName &p_event, const Callable &p_guard = Callable());
|
||||||
void remove_transition(LimboState *p_from_state, const StringName &p_event);
|
void remove_transition(LimboState *p_from_state, const StringName &p_event);
|
||||||
bool has_transition(LimboState *p_from_state, const StringName &p_event) const { return transitions.has(Transition::make_key(p_from_state, p_event)); }
|
bool has_transition(LimboState *p_from_state, const StringName &p_event) const { return transitions.has(Transition::make_key(p_from_state, p_event)); }
|
||||||
|
|
||||||
|
|
|
@ -215,7 +215,7 @@ TEST_CASE("[Modules][LimboAI] HSM") {
|
||||||
CHECK(beta_updates->num_callbacks == 0);
|
CHECK(beta_updates->num_callbacks == 0);
|
||||||
CHECK(beta_exits->num_callbacks == 1); // * exited
|
CHECK(beta_exits->num_callbacks == 1); // * exited
|
||||||
}
|
}
|
||||||
SUBCASE("Test transition with guard") {
|
SUBCASE("Test transition with state-wide guard") {
|
||||||
Ref<TestGuard> guard = memnew(TestGuard);
|
Ref<TestGuard> guard = memnew(TestGuard);
|
||||||
state_beta->set_guard(callable_mp(guard.ptr(), &TestGuard::can_enter));
|
state_beta->set_guard(callable_mp(guard.ptr(), &TestGuard::can_enter));
|
||||||
|
|
||||||
|
@ -234,6 +234,25 @@ TEST_CASE("[Modules][LimboAI] HSM") {
|
||||||
CHECK(beta_entries->num_callbacks == 0);
|
CHECK(beta_entries->num_callbacks == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SUBCASE("Test transition with transition-scoped guard") {
|
||||||
|
Ref<TestGuard> guard = memnew(TestGuard);
|
||||||
|
hsm->add_transition(state_alpha, state_beta, "guarded_transition", callable_mp(guard.ptr(), &TestGuard::can_enter));
|
||||||
|
|
||||||
|
SUBCASE("When entry is permitted") {
|
||||||
|
guard->permitted_to_enter = true;
|
||||||
|
hsm->dispatch("guarded_transition");
|
||||||
|
CHECK(hsm->get_active_state() == state_beta);
|
||||||
|
CHECK(alpha_exits->num_callbacks == 1);
|
||||||
|
CHECK(beta_entries->num_callbacks == 1);
|
||||||
|
}
|
||||||
|
SUBCASE("When entry is not permitted") {
|
||||||
|
guard->permitted_to_enter = false;
|
||||||
|
hsm->dispatch("guarded_transition");
|
||||||
|
CHECK(hsm->get_active_state() == state_alpha);
|
||||||
|
CHECK(alpha_exits->num_callbacks == 0);
|
||||||
|
CHECK(beta_entries->num_callbacks == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
SUBCASE("When there is no transition for given event") {
|
SUBCASE("When there is no transition for given event") {
|
||||||
hsm->dispatch("not_found");
|
hsm->dispatch("not_found");
|
||||||
CHECK(alpha_exits->num_callbacks == 0);
|
CHECK(alpha_exits->num_callbacks == 0);
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "core/io/resource.h"
|
#include "core/io/resource.h"
|
||||||
#include "core/variant/variant.h"
|
#include "core/variant/variant.h"
|
||||||
#include "editor/editor_node.h"
|
#include "editor/editor_node.h"
|
||||||
|
#include "editor/editor_main_screen.h"
|
||||||
#include "editor/plugins/script_editor_plugin.h"
|
#include "editor/plugins/script_editor_plugin.h"
|
||||||
#endif // TOOLS_ENABLED
|
#endif // TOOLS_ENABLED
|
||||||
|
|
||||||
|
@ -213,7 +214,7 @@ Variant VARIANT_DEFAULT(Variant::Type p_type) {
|
||||||
void SHOW_BUILTIN_DOC(const String &p_topic) {
|
void SHOW_BUILTIN_DOC(const String &p_topic) {
|
||||||
#ifdef LIMBOAI_MODULE
|
#ifdef LIMBOAI_MODULE
|
||||||
ScriptEditor::get_singleton()->goto_help(p_topic);
|
ScriptEditor::get_singleton()->goto_help(p_topic);
|
||||||
EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
|
EditorNode::get_singleton()->get_editor_main_screen()->select(EditorMainScreen::EDITOR_SCRIPT);
|
||||||
#elif LIMBOAI_GDEXTENSION
|
#elif LIMBOAI_GDEXTENSION
|
||||||
TypedArray<ScriptEditorBase> open_editors = EditorInterface::get_singleton()->get_script_editor()->get_open_script_editors();
|
TypedArray<ScriptEditorBase> open_editors = EditorInterface::get_singleton()->get_script_editor()->get_open_script_editors();
|
||||||
ERR_FAIL_COND_MSG(open_editors.size() == 0, "Can't open help page. Need at least one script open in the script editor.");
|
ERR_FAIL_COND_MSG(open_editors.size() == 0, "Can't open help page. Need at least one script open in the script editor.");
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
#define EDITOR_FILE_SYSTEM() (EditorFileSystem::get_singleton())
|
#define EDITOR_FILE_SYSTEM() (EditorFileSystem::get_singleton())
|
||||||
#define EDITOR_SETTINGS() (EditorSettings::get_singleton())
|
#define EDITOR_SETTINGS() (EditorSettings::get_singleton())
|
||||||
#define BASE_CONTROL() (EditorNode::get_singleton()->get_gui_base())
|
#define BASE_CONTROL() (EditorNode::get_singleton()->get_gui_base())
|
||||||
#define MAIN_SCREEN_CONTROL() (EditorNode::get_singleton()->get_main_screen_control())
|
#define MAIN_SCREEN_CONTROL() (EditorNode::get_singleton()->get_editor_main_screen()->get_control())
|
||||||
#define SCENE_TREE() (SceneTree::get_singleton())
|
#define SCENE_TREE() (SceneTree::get_singleton())
|
||||||
#define IS_DEBUGGER_ACTIVE() (EngineDebugger::is_active())
|
#define IS_DEBUGGER_ACTIVE() (EngineDebugger::is_active())
|
||||||
#define FS_DOCK_SELECT_FILE(m_path) FileSystemDock::get_singleton()->select_file(m_path)
|
#define FS_DOCK_SELECT_FILE(m_path) FileSystemDock::get_singleton()->select_file(m_path)
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
#define GET_PROJECT_SETTINGS_DIR() EditorPaths::get_singleton()->get_project_settings_dir()
|
#define GET_PROJECT_SETTINGS_DIR() EditorPaths::get_singleton()->get_project_settings_dir()
|
||||||
#define EDIT_RESOURCE(m_res) EditorNode::get_singleton()->edit_resource(m_res)
|
#define EDIT_RESOURCE(m_res) EditorNode::get_singleton()->edit_resource(m_res)
|
||||||
#define INSPECTOR_GET_EDITED_OBJECT() (InspectorDock::get_inspector_singleton()->get_edited_object())
|
#define INSPECTOR_GET_EDITED_OBJECT() (InspectorDock::get_inspector_singleton()->get_edited_object())
|
||||||
#define SET_MAIN_SCREEN_EDITOR(m_name) (EditorNode::get_singleton()->select_editor_by_name(m_name))
|
#define SET_MAIN_SCREEN_EDITOR(m_name) (EditorNode::get_singleton()->get_editor_main_screen()->select_by_name(m_name))
|
||||||
#define FILE_EXISTS(m_path) FileAccess::exists(m_path)
|
#define FILE_EXISTS(m_path) FileAccess::exists(m_path)
|
||||||
#define DIR_ACCESS_CREATE() DirAccess::create(DirAccess::ACCESS_RESOURCES)
|
#define DIR_ACCESS_CREATE() DirAccess::create(DirAccess::ACCESS_RESOURCES)
|
||||||
#define PERFORMANCE_ADD_CUSTOM_MONITOR(m_id, m_callable) (Performance::get_singleton()->add_custom_monitor(m_id, m_callable, Variant()))
|
#define PERFORMANCE_ADD_CUSTOM_MONITOR(m_id, m_callable) (Performance::get_singleton()->add_custom_monitor(m_id, m_callable, Variant()))
|
||||||
|
@ -85,7 +85,7 @@ using namespace godot;
|
||||||
#define EDITOR_FILE_SYSTEM() (EditorInterface::get_singleton()->get_resource_filesystem())
|
#define EDITOR_FILE_SYSTEM() (EditorInterface::get_singleton()->get_resource_filesystem())
|
||||||
#define EDITOR_SETTINGS() (EditorInterface::get_singleton()->get_editor_settings())
|
#define EDITOR_SETTINGS() (EditorInterface::get_singleton()->get_editor_settings())
|
||||||
#define BASE_CONTROL() (EditorInterface::get_singleton()->get_base_control())
|
#define BASE_CONTROL() (EditorInterface::get_singleton()->get_base_control())
|
||||||
#define MAIN_SCREEN_CONTROL() (EditorInterface::get_singleton()->get_editor_main_screen())
|
#define MAIN_SCREEN_CONTROL() (EditorInterface::get_singleton()->get_editor_main_screen()->get_control())
|
||||||
#define SCENE_TREE() ((SceneTree *)(Engine::get_singleton()->get_main_loop()))
|
#define SCENE_TREE() ((SceneTree *)(Engine::get_singleton()->get_main_loop()))
|
||||||
#define IS_DEBUGGER_ACTIVE() (EngineDebugger::get_singleton()->is_active())
|
#define IS_DEBUGGER_ACTIVE() (EngineDebugger::get_singleton()->is_active())
|
||||||
#define FS_DOCK_SELECT_FILE(m_path) EditorInterface::get_singleton()->get_file_system_dock()->navigate_to_path(m_path)
|
#define FS_DOCK_SELECT_FILE(m_path) EditorInterface::get_singleton()->get_file_system_dock()->navigate_to_path(m_path)
|
||||||
|
|
|
@ -416,6 +416,12 @@ String LimboUtility::get_property_hint_text(PropertyHint p_hint) const {
|
||||||
case PROPERTY_HINT_MAX: {
|
case PROPERTY_HINT_MAX: {
|
||||||
return "MAX";
|
return "MAX";
|
||||||
}
|
}
|
||||||
|
case PROPERTY_HINT_DICTIONARY_TYPE: {
|
||||||
|
return "DICTIONARY_TYPE";
|
||||||
|
}
|
||||||
|
case PROPERTY_HINT_TOOL_BUTTON: {
|
||||||
|
return "TOOL_BUTTON";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue