From 5992137eb42b2ae00ad2ca0b0c349659412da34f Mon Sep 17 00:00:00 2001
From: "Wilson E. Alvarez" <wilson.e.alvarez@rubonnek.com>
Date: Wed, 11 Sep 2024 10:13:42 -0400
Subject: [PATCH 1/9] Update EditorMainScreen calls after its extraction

Due to upstream change:

	https://github.com/godotengine/godot/commit/5e1c9d68aad00ad025a14f4a1907b92a6f7f6310
---
 editor/limbo_ai_editor_plugin.h | 2 ++
 util/limbo_compat.cpp           | 3 ++-
 util/limbo_compat.h             | 4 ++--
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/editor/limbo_ai_editor_plugin.h b/editor/limbo_ai_editor_plugin.h
index 92942cb..93bf49e 100644
--- a/editor/limbo_ai_editor_plugin.h
+++ b/editor/limbo_ai_editor_plugin.h
@@ -26,6 +26,7 @@
 #include "core/object/class_db.h"
 #include "core/object/object.h"
 #include "core/templates/hash_set.h"
+#include "editor/editor_main_screen.h"
 #include "editor/editor_node.h"
 #include "editor/editor_undo_redo_manager.h"
 #include "editor/gui/editor_spin_slider.h"
@@ -42,6 +43,7 @@
 #include "scene/gui/popup.h"
 #include "scene/gui/popup_menu.h"
 #include "scene/gui/split_container.h"
+#include "scene/gui/tab_bar.h"
 #include "scene/gui/tree.h"
 #include "scene/resources/texture.h"
 #endif // LIMBOAI_MODULE
diff --git a/util/limbo_compat.cpp b/util/limbo_compat.cpp
index 3be7317..6aab45c 100644
--- a/util/limbo_compat.cpp
+++ b/util/limbo_compat.cpp
@@ -16,6 +16,7 @@
 #ifdef TOOLS_ENABLED
 #include "core/io/resource.h"
 #include "core/variant/variant.h"
+#include "editor/editor_main_screen.h"
 #include "editor/editor_node.h"
 #include "editor/plugins/script_editor_plugin.h"
 #endif // TOOLS_ENABLED
@@ -213,7 +214,7 @@ Variant VARIANT_DEFAULT(Variant::Type p_type) {
 void SHOW_BUILTIN_DOC(const String &p_topic) {
 #ifdef LIMBOAI_MODULE
 	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
 	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.");
diff --git a/util/limbo_compat.h b/util/limbo_compat.h
index ef9da4a..61201af 100644
--- a/util/limbo_compat.h
+++ b/util/limbo_compat.h
@@ -28,7 +28,7 @@
 #define EDITOR_FILE_SYSTEM() (EditorFileSystem::get_singleton())
 #define EDITOR_SETTINGS() (EditorSettings::get_singleton())
 #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())
 #define SCENE_TREE() (SceneTree::get_singleton())
 #define IS_DEBUGGER_ACTIVE() (EngineDebugger::is_active())
 #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 EDIT_RESOURCE(m_res) EditorNode::get_singleton()->edit_resource(m_res)
 #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 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()))

From 99603df2303ca405eef85fb7cc8a56e1651865c4 Mon Sep 17 00:00:00 2001
From: "Wilson E. Alvarez" <wilson.e.alvarez@rubonnek.com>
Date: Tue, 17 Sep 2024 13:14:01 -0400
Subject: [PATCH 2/9] Fix unhandled PROPERTY_HINT_DICTIONARY_TYPE warning

Due to upstream change:

	https://github.com/godotengine/godot/commit/9853a691447cd4e279f48820067174d3833b0065
---
 util/limbo_utility.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/util/limbo_utility.cpp b/util/limbo_utility.cpp
index e5f16f6..845f63a 100644
--- a/util/limbo_utility.cpp
+++ b/util/limbo_utility.cpp
@@ -395,6 +395,9 @@ String LimboUtility::get_property_hint_text(PropertyHint p_hint) const {
 		case PROPERTY_HINT_ARRAY_TYPE: {
 			return "ARRAY_TYPE";
 		}
+		case PROPERTY_HINT_DICTIONARY_TYPE: {
+			return "DICTIONARY_TYPE";
+		}
 		case PROPERTY_HINT_LOCALE_ID: {
 			return "LOCALE_ID";
 		}

From f6f231bb35e9e0a40c5d11612bc626230e60fcf6 Mon Sep 17 00:00:00 2001
From: "Wilson E. Alvarez" <wilson.e.alvarez@rubonnek.com>
Date: Mon, 30 Sep 2024 08:00:48 -0400
Subject: [PATCH 3/9] Fix unhandled PROPERTY_HINT_TOOL_BUTTON warning

Due to upstream change:

	https://github.com/godotengine/godot/commit/85dfd896536ff04dba4afd7d461a28e0ac4b9aee
---
 util/limbo_utility.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/util/limbo_utility.cpp b/util/limbo_utility.cpp
index 845f63a..381cfee 100644
--- a/util/limbo_utility.cpp
+++ b/util/limbo_utility.cpp
@@ -398,6 +398,9 @@ String LimboUtility::get_property_hint_text(PropertyHint p_hint) const {
 		case PROPERTY_HINT_DICTIONARY_TYPE: {
 			return "DICTIONARY_TYPE";
 		}
+		case PROPERTY_HINT_TOOL_BUTTON: {
+			return "TOOL_BUTTON";
+		}
 		case PROPERTY_HINT_LOCALE_ID: {
 			return "LOCALE_ID";
 		}

From bc2fad79dfcfcf7fc661e55ce5c1c82c9e9294b4 Mon Sep 17 00:00:00 2001
From: "Wilson E. Alvarez" <wilson.e.alvarez@rubonnek.com>
Date: Sat, 2 Nov 2024 20:55:48 -0400
Subject: [PATCH 4/9] Fix internal Button set_icon calls to set_button_icon

Due to upstream change:

    https://github.com/godotengine/godot/commit/562c666e3dfc9f0fe72a33974c23373dff77c825
---
 editor/blackboard_plan_editor.cpp         | 12 ++++++------
 editor/debugger/limbo_debugger_plugin.cpp |  2 +-
 editor/editor_property_bb_param.cpp       |  6 +++---
 editor/editor_property_property_path.cpp  |  2 +-
 editor/editor_property_variable_name.cpp  | 14 +++++++-------
 editor/limbo_ai_editor_plugin.cpp         | 12 ++++++------
 editor/mode_switch_button.h               |  2 +-
 editor/task_palette.cpp                   | 14 +++++++-------
 editor/tree_search.cpp                    |  6 +++---
 util/limbo_compat.h                       |  2 --
 10 files changed, 35 insertions(+), 37 deletions(-)

diff --git a/editor/blackboard_plan_editor.cpp b/editor/blackboard_plan_editor.cpp
index 5e509c0..b9dd910 100644
--- a/editor/blackboard_plan_editor.cpp
+++ b/editor/blackboard_plan_editor.cpp
@@ -278,7 +278,7 @@ void BlackboardPlanEditor::_refresh() {
 		Button *drag_button = memnew(Button);
 		props_hbox->add_child(drag_button);
 		drag_button->set_custom_minimum_size(Size2(28.0, 28.0) * EDSCALE);
-		BUTTON_SET_ICON(drag_button, theme_cache.grab_icon);
+		drag_button->set_button_icon(theme_cache.grab_icon);
 		drag_button->connect(LW_NAME(gui_input), callable_mp(this, &BlackboardPlanEditor::_drag_button_gui_input));
 		drag_button->connect(LW_NAME(button_down), callable_mp(this, &BlackboardPlanEditor::_drag_button_down).bind(row_panel));
 		drag_button->connect(LW_NAME(button_up), callable_mp(this, &BlackboardPlanEditor::_drag_button_up));
@@ -297,7 +297,7 @@ void BlackboardPlanEditor::_refresh() {
 		type_choice->set_custom_minimum_size(Size2(170, 0.0) * EDSCALE);
 		type_choice->set_text(Variant::get_type_name(var.get_type()));
 		type_choice->set_tooltip_text(Variant::get_type_name(var.get_type()));
-		BUTTON_SET_ICON(type_choice, get_theme_icon(Variant::get_type_name(var.get_type()), LW_NAME(EditorIcons)));
+		type_choice->set_button_icon(get_theme_icon(Variant::get_type_name(var.get_type()), LW_NAME(EditorIcons)));
 		type_choice->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
 		type_choice->set_flat(true);
 		type_choice->set_text_alignment(HORIZONTAL_ALIGNMENT_LEFT);
@@ -326,7 +326,7 @@ void BlackboardPlanEditor::_refresh() {
 		Button *trash_button = memnew(Button);
 		props_hbox->add_child(trash_button);
 		trash_button->set_custom_minimum_size(Size2(24.0, 0.0) * EDSCALE);
-		BUTTON_SET_ICON(trash_button, theme_cache.trash_icon);
+		trash_button->set_button_icon(theme_cache.trash_icon);
 		trash_button->connect(LW_NAME(pressed), callable_mp(this, &BlackboardPlanEditor::_trash_var).bind(i));
 	}
 }
@@ -337,7 +337,7 @@ void BlackboardPlanEditor::_notification(int p_what) {
 			theme_cache.trash_icon = get_theme_icon(LW_NAME(Remove), LW_NAME(EditorIcons));
 			theme_cache.grab_icon = get_theme_icon(LW_NAME(TripleBar), LW_NAME(EditorIcons));
 
-			BUTTON_SET_ICON(add_var_tool, get_theme_icon(LW_NAME(Add), LW_NAME(EditorIcons)));
+			add_var_tool->set_button_icon(get_theme_icon(LW_NAME(Add), LW_NAME(EditorIcons)));
 
 			type_menu->clear();
 			for (int i = 0; i < Variant::VARIANT_MAX; i++) {
@@ -522,7 +522,7 @@ void EditorInspectorPluginBBPlan::_parse_begin(Object *p_object) {
 		goto_btn->set_text(TTR("Edit Base"));
 		goto_btn->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
 		goto_btn->set_custom_minimum_size(Size2(150.0, 0.0) * EDSCALE);
-		BUTTON_SET_ICON(goto_btn, EditorInterface::get_singleton()->get_editor_theme()->get_icon(LW_NAME(Edit), LW_NAME(EditorIcons)));
+		goto_btn->set_button_icon(EditorInterface::get_singleton()->get_editor_theme()->get_icon(LW_NAME(Edit), LW_NAME(EditorIcons)));
 		goto_btn->connect(LW_NAME(pressed), callable_mp(this, &EditorInspectorPluginBBPlan::_open_base_plan).bind(plan));
 	} else {
 		Button *edit_btn = memnew(Button);
@@ -530,7 +530,7 @@ void EditorInspectorPluginBBPlan::_parse_begin(Object *p_object) {
 		edit_btn->set_text(TTR("Manage..."));
 		edit_btn->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
 		edit_btn->set_custom_minimum_size(Size2(150.0, 0.0) * EDSCALE);
-		BUTTON_SET_ICON(edit_btn, EditorInterface::get_singleton()->get_editor_theme()->get_icon(LW_NAME(EditAddRemove), LW_NAME(EditorIcons)));
+		edit_btn->set_button_icon(EditorInterface::get_singleton()->get_editor_theme()->get_icon(LW_NAME(EditAddRemove), LW_NAME(EditorIcons)));
 		edit_btn->connect(LW_NAME(pressed), callable_mp(this, &EditorInspectorPluginBBPlan::_edit_plan).bind(plan));
 	}
 
diff --git a/editor/debugger/limbo_debugger_plugin.cpp b/editor/debugger/limbo_debugger_plugin.cpp
index db6bcb5..e8f0f7d 100644
--- a/editor/debugger/limbo_debugger_plugin.cpp
+++ b/editor/debugger/limbo_debugger_plugin.cpp
@@ -209,7 +209,7 @@ void LimboDebuggerTab::_notification(int p_what) {
 		} break;
 		case NOTIFICATION_THEME_CHANGED: {
 			alert_icon->set_texture(get_theme_icon(LW_NAME(StatusWarning), LW_NAME(EditorIcons)));
-			BUTTON_SET_ICON(resource_header, LimboUtility::get_singleton()->get_task_icon("BehaviorTree"));
+			resource_header->set_button_icon(LimboUtility::get_singleton()->get_task_icon("BehaviorTree"));
 		} break;
 	}
 }
diff --git a/editor/editor_property_bb_param.cpp b/editor/editor_property_bb_param.cpp
index 5969baa..4ab8e89 100644
--- a/editor/editor_property_bb_param.cpp
+++ b/editor/editor_property_bb_param.cpp
@@ -287,14 +287,14 @@ void EditorPropertyBBParam::update_property() {
 		variable_editor->update_property();
 		variable_editor->show();
 		bottom_container->hide();
-		type_choice->set_icon(get_editor_theme_icon(SNAME("LimboExtraVariable")));
+		type_choice->set_button_icon(get_editor_theme_icon(SNAME("LimboExtraVariable")));
 	} else {
 		_create_value_editor(param->get_type());
 		variable_editor->hide();
 		value_editor->show();
 		value_editor->set_object_and_property(param.ptr(), SNAME("saved_value"));
 		value_editor->update_property();
-		type_choice->set_icon(get_editor_theme_icon(Variant::get_type_name(param->get_type())));
+		type_choice->set_button_icon(get_editor_theme_icon(Variant::get_type_name(param->get_type())));
 	}
 }
 
@@ -316,7 +316,7 @@ void EditorPropertyBBParam::_notification(int p_what) {
 
 			{
 				String type = Variant::get_type_name(_get_edited_param()->get_type());
-				type_choice->set_icon(get_editor_theme_icon(type));
+				type_choice->set_button_icon(get_editor_theme_icon(type));
 			}
 
 			// Initialize type choice.
diff --git a/editor/editor_property_property_path.cpp b/editor/editor_property_property_path.cpp
index 6d6de88..78dfc2c 100644
--- a/editor/editor_property_property_path.cpp
+++ b/editor/editor_property_property_path.cpp
@@ -156,7 +156,7 @@ void EditorPropertyPropertyPath::_notification(int p_what) {
 	switch (p_what) {
 		case NOTIFICATION_ENTER_TREE:
 		case NOTIFICATION_THEME_CHANGED: {
-			BUTTON_SET_ICON(action_menu, get_theme_icon(LW_NAME(GuiTabMenuHl), LW_NAME(EditorIcons)));
+			action_menu->set_button_icon(get_theme_icon(LW_NAME(GuiTabMenuHl), LW_NAME(EditorIcons)));
 			action_menu->get_popup()->set_item_icon(ACTION_CLEAR, get_theme_icon(LW_NAME(Clear), LW_NAME(EditorIcons)));
 			action_menu->get_popup()->set_item_icon(ACTION_COPY, get_theme_icon(LW_NAME(ActionCopy), LW_NAME(EditorIcons)));
 			action_menu->get_popup()->set_item_icon(ACTION_EDIT, get_theme_icon(LW_NAME(Edit), LW_NAME(EditorIcons)));
diff --git a/editor/editor_property_variable_name.cpp b/editor/editor_property_variable_name.cpp
index 4232591..75cdcbe 100644
--- a/editor/editor_property_variable_name.cpp
+++ b/editor/editor_property_variable_name.cpp
@@ -86,24 +86,24 @@ void EditorPropertyVariableName::_update_status() {
 	}
 	String var_name = name_edit->get_text();
 	if (var_name.is_empty() && allow_empty) {
-		BUTTON_SET_ICON(status_btn, theme_cache.var_empty_icon);
+		status_btn->set_button_icon(theme_cache.var_empty_icon);
 		status_btn->set_tooltip_text(TTR("Variable name not specified.\nClick to open the blackboard plan."));
 	} else if (plan->has_var(var_name)) {
 		if (expected_type == Variant::NIL || plan->get_var(var_name).get_type() == expected_type) {
-			BUTTON_SET_ICON(status_btn, theme_cache.var_exists_icon);
+			status_btn->set_button_icon(theme_cache.var_exists_icon);
 			status_btn->set_tooltip_text(TTR("This variable is present in the blackboard plan.\nClick to open the blackboard plan."));
 		} else {
-			BUTTON_SET_ICON(status_btn, theme_cache.var_error_icon);
+			status_btn->set_button_icon(theme_cache.var_error_icon);
 			status_btn->set_tooltip_text(TTR(vformat(
 					"The %s variable in the blackboard plan should be of type %s.\nClick to open the blackboard plan.",
 					LimboUtility::get_singleton()->decorate_var(var_name),
 					Variant::get_type_name(expected_type))));
 		}
 	} else if (name_edit->get_text().begins_with("_")) {
-		BUTTON_SET_ICON(status_btn, theme_cache.var_private_icon);
+		status_btn->set_button_icon(theme_cache.var_private_icon);
 		status_btn->set_tooltip_text(TTR("This variable is private and is not included in the blackboard plan.\nClick to open the blackboard plan."));
 	} else {
-		BUTTON_SET_ICON(status_btn, theme_cache.var_not_found_icon);
+		status_btn->set_button_icon(theme_cache.var_not_found_icon);
 		status_btn->set_tooltip_text(TTR("No matching variable found in the blackboard plan!\nClick to open the blackboard plan."));
 	}
 }
@@ -122,7 +122,7 @@ void EditorPropertyVariableName::_status_pressed() {
 void EditorPropertyVariableName::_status_mouse_entered() {
 	ERR_FAIL_NULL(plan);
 	if (!plan->has_var(name_edit->get_text())) {
-		BUTTON_SET_ICON(status_btn, theme_cache.var_add_icon);
+		status_btn->set_button_icon(theme_cache.var_add_icon);
 	}
 }
 
@@ -182,7 +182,7 @@ void EditorPropertyVariableName::_notification(int p_what) {
 			}
 		} break;
 		case NOTIFICATION_THEME_CHANGED: {
-			BUTTON_SET_ICON(drop_btn, get_theme_icon(LW_NAME(GuiOptionArrow), LW_NAME(EditorIcons)));
+			drop_btn->set_button_icon(get_theme_icon(LW_NAME(GuiOptionArrow), LW_NAME(EditorIcons)));
 			theme_cache.var_add_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarAdd));
 			theme_cache.var_exists_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarExists));
 			theme_cache.var_not_found_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarNotFound));
diff --git a/editor/limbo_ai_editor_plugin.cpp b/editor/limbo_ai_editor_plugin.cpp
index e50b06e..32b6a79 100644
--- a/editor/limbo_ai_editor_plugin.cpp
+++ b/editor/limbo_ai_editor_plugin.cpp
@@ -1359,7 +1359,7 @@ void LimboAIEditor::_update_favorite_tasks() {
 		}
 		btn->set_text(task_name);
 		btn->set_meta(LW_NAME(task_meta), task_meta);
-		BUTTON_SET_ICON(btn, LimboUtility::get_singleton()->get_task_icon(task_meta));
+		btn->set_button_icon(LimboUtility::get_singleton()->get_task_icon(task_meta));
 		btn->set_tooltip_text(vformat(TTR("Add %s task."), task_name));
 		btn->set_flat(true);
 		btn->add_theme_constant_override(LW_NAME(icon_max_width), 16 * EDSCALE); // Force user icons to be of the proper size.
@@ -1530,11 +1530,11 @@ void LimboAIEditor::_notification(int p_what) {
 
 			ADD_STYLEBOX_OVERRIDE(tab_bar_panel, "panel", get_theme_stylebox("tabbar_background", "TabContainer"));
 
-			BUTTON_SET_ICON(new_btn, get_theme_icon(LW_NAME(New), LW_NAME(EditorIcons)));
-			BUTTON_SET_ICON(load_btn, get_theme_icon(LW_NAME(Load), LW_NAME(EditorIcons)));
-			BUTTON_SET_ICON(save_btn, get_theme_icon(LW_NAME(Save), LW_NAME(EditorIcons)));
-			BUTTON_SET_ICON(new_script_btn, get_theme_icon(LW_NAME(ScriptCreate), LW_NAME(EditorIcons)));
-			BUTTON_SET_ICON(misc_btn, get_theme_icon(LW_NAME(Tools), LW_NAME(EditorIcons)));
+			new_btn->set_button_icon(get_theme_icon(LW_NAME(New), LW_NAME(EditorIcons)));
+			load_btn->set_button_icon(get_theme_icon(LW_NAME(Load), LW_NAME(EditorIcons)));
+			save_btn->set_button_icon(get_theme_icon(LW_NAME(Save), LW_NAME(EditorIcons)));
+			new_script_btn->set_button_icon(get_theme_icon(LW_NAME(ScriptCreate), LW_NAME(EditorIcons)));
+			misc_btn->set_button_icon(get_theme_icon(LW_NAME(Tools), LW_NAME(EditorIcons)));
 
 			_update_favorite_tasks();
 		} break;
diff --git a/editor/mode_switch_button.h b/editor/mode_switch_button.h
index 4bc6a09..e7b5e3e 100644
--- a/editor/mode_switch_button.h
+++ b/editor/mode_switch_button.h
@@ -44,7 +44,7 @@ private:
 
 	_FORCE_INLINE_ void _set_mode_by_index(int p_index) {
 		current_mode_index = p_index;
-		BUTTON_SET_ICON(this, modes[current_mode_index].icon);
+		this->set_button_icon(modes[current_mode_index].icon);
 		if (!modes[current_mode_index].tooltip.is_empty()) {
 			set_tooltip_text(modes[current_mode_index].tooltip);
 		}
diff --git a/editor/task_palette.cpp b/editor/task_palette.cpp
index b0af452..7f427a6 100644
--- a/editor/task_palette.cpp
+++ b/editor/task_palette.cpp
@@ -184,7 +184,7 @@ void TaskPaletteSection::set_filter(String p_filter_text) {
 void TaskPaletteSection::add_task_button(const String &p_name, const Ref<Texture> &icon, const String &p_meta) {
 	TaskButton *btn = memnew(TaskButton);
 	btn->set_text(p_name);
-	BUTTON_SET_ICON(btn, icon);
+	btn->set_button_icon(icon);
 	btn->set_tooltip_text("dummy_text"); // Force tooltip to be shown.
 	btn->set_task_meta(p_meta);
 	btn->add_theme_constant_override(LW_NAME(icon_max_width), 16 * EDSCALE); // Force user icons to  be of the proper size.
@@ -195,7 +195,7 @@ void TaskPaletteSection::add_task_button(const String &p_name, const Ref<Texture
 
 void TaskPaletteSection::set_collapsed(bool p_collapsed) {
 	tasks_container->set_visible(!p_collapsed);
-	BUTTON_SET_ICON(section_header, (p_collapsed ? theme_cache.arrow_right_icon : theme_cache.arrow_down_icon));
+	section_header->set_button_icon((p_collapsed ? theme_cache.arrow_right_icon : theme_cache.arrow_down_icon));
 }
 
 bool TaskPaletteSection::is_collapsed() const {
@@ -214,7 +214,7 @@ void TaskPaletteSection::_notification(int p_what) {
 		} break;
 		case NOTIFICATION_THEME_CHANGED: {
 			_do_update_theme_item_cache();
-			BUTTON_SET_ICON(section_header, (is_collapsed() ? theme_cache.arrow_right_icon : theme_cache.arrow_down_icon));
+			section_header->set_button_icon((is_collapsed() ? theme_cache.arrow_right_icon : theme_cache.arrow_down_icon));
 			section_header->add_theme_font_override(LW_NAME(font), get_theme_font(LW_NAME(bold), LW_NAME(EditorFonts)));
 		} break;
 	}
@@ -600,13 +600,13 @@ void TaskPalette::_notification(int p_what) {
 		case NOTIFICATION_THEME_CHANGED: {
 			_do_update_theme_item_cache();
 
-			BUTTON_SET_ICON(tool_filters, get_theme_icon(LW_NAME(AnimationFilter), LW_NAME(EditorIcons)));
-			BUTTON_SET_ICON(tool_refresh, get_theme_icon(LW_NAME(Reload), LW_NAME(EditorIcons)));
+			tool_filters->set_button_icon(get_theme_icon(LW_NAME(AnimationFilter), LW_NAME(EditorIcons)));
+			tool_refresh->set_button_icon(get_theme_icon(LW_NAME(Reload), LW_NAME(EditorIcons)));
 
 			filter_edit->set_right_icon(get_theme_icon(LW_NAME(Search), LW_NAME(EditorIcons)));
 
-			BUTTON_SET_ICON(select_all, LimboUtility::get_singleton()->get_task_icon("LimboSelectAll"));
-			BUTTON_SET_ICON(deselect_all, LimboUtility::get_singleton()->get_task_icon("LimboDeselectAll"));
+			select_all->set_button_icon(LimboUtility::get_singleton()->get_task_icon("LimboSelectAll"));
+			deselect_all->set_button_icon(LimboUtility::get_singleton()->get_task_icon("LimboDeselectAll"));
 
 			category_choice->queue_redraw();
 
diff --git a/editor/tree_search.cpp b/editor/tree_search.cpp
index cea10fc..e510edd 100644
--- a/editor/tree_search.cpp
+++ b/editor/tree_search.cpp
@@ -559,9 +559,9 @@ void TreeSearchPanel::_notification(int p_what) {
 			break;
 		}
 		case NOTIFICATION_THEME_CHANGED: {
-			BUTTON_SET_ICON(close_button, get_theme_icon(LW_NAME(Close), LW_NAME(EditorIcons)));
-			BUTTON_SET_ICON(find_prev_button, get_theme_icon("MoveUp", LW_NAME(EditorIcons)));
-			BUTTON_SET_ICON(find_next_button, get_theme_icon("MoveDown", LW_NAME(EditorIcons)));
+			close_button->set_button_icon(get_theme_icon(LW_NAME(Close), LW_NAME(EditorIcons)));
+			find_prev_button->set_button_icon(get_theme_icon("MoveUp", LW_NAME(EditorIcons)));
+			find_next_button->set_button_icon(get_theme_icon("MoveDown", LW_NAME(EditorIcons)));
 			label_filter->set_text(TTR("Filter"));
 			break;
 		}
diff --git a/util/limbo_compat.h b/util/limbo_compat.h
index 61201af..59a0bda 100644
--- a/util/limbo_compat.h
+++ b/util/limbo_compat.h
@@ -37,7 +37,6 @@
 #define IS_CLASS(m_obj, m_class) (m_obj->is_class_ptr(m_class::get_class_ptr_static()))
 #define RAND_RANGE(m_from, m_to) (Math::random(m_from, m_to))
 #define RANDF() (Math::randf())
-#define BUTTON_SET_ICON(m_btn, m_icon) m_btn->set_icon(m_icon)
 #define RESOURCE_LOAD(m_path, m_hint) ResourceLoader::load(m_path, m_hint)
 #define RESOURCE_LOAD_NO_CACHE(m_path, m_hint) ResourceLoader::load(m_path, m_hint, ResourceFormatLoader::CACHE_MODE_IGNORE)
 #define RESOURCE_SAVE(m_res, m_path, m_flags) ResourceSaver::save(m_res, m_path, m_flags)
@@ -96,7 +95,6 @@ using namespace godot;
 #define IS_CLASS(m_obj, m_class) (m_obj->is_class(#m_class))
 #define RAND_RANGE(m_from, m_to) (UtilityFunctions::randf_range(m_from, m_to))
 #define RANDF() (UtilityFunctions::randf())
-#define BUTTON_SET_ICON(m_btn, m_icon) m_btn->set_button_icon(m_icon)
 #define RESOURCE_LOAD(m_path, m_hint) ResourceLoader::get_singleton()->load(m_path, m_hint)
 #define RESOURCE_LOAD_NO_CACHE(m_path, m_hint) ResourceLoader::get_singleton()->load(m_path, m_hint, ResourceLoader::CACHE_MODE_IGNORE)
 #define RESOURCE_SAVE(m_res, m_path, m_flags) ResourceSaver::get_singleton()->save(m_res, m_path, m_flags)

From c4597c1cbd28727331f956e27dfbf35e474fe9fd Mon Sep 17 00:00:00 2001
From: "Wilson E. Alvarez" <wilson.e.alvarez@rubonnek.com>
Date: Sat, 2 Nov 2024 23:53:56 -0400
Subject: [PATCH 5/9] Fix forbidden comparisons between Ref and nullptr.

Necessary when compiling with strict_checks=yes.

Due to upstream change:

	https://github.com/godotengine/godot/commit/df29cc696f22e6b91b09284ee9ce0779ed77a3d9
---
 blackboard/bb_param/bb_node.cpp          |  2 +-
 blackboard/blackboard_plan.cpp           |  2 +-
 bt/behavior_tree.cpp                     |  4 ++--
 bt/bt_instance.cpp                       |  4 ++--
 bt/bt_state.cpp                          |  2 +-
 bt/tasks/bt_comment.cpp                  |  2 +-
 bt/tasks/bt_task.cpp                     |  2 +-
 bt/tasks/decorators/bt_cooldown.cpp      |  2 +-
 bt/tasks/decorators/bt_new_scope.cpp     |  6 +++---
 editor/blackboard_plan_editor.cpp        | 20 ++++++++++----------
 editor/editor_property_variable_name.cpp | 12 ++++++------
 editor/limbo_ai_editor_plugin.cpp        |  6 +++---
 editor/task_tree.cpp                     |  6 +++---
 editor/tree_search.cpp                   |  4 ++--
 tests/test_task.h                        |  4 ++--
 15 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/blackboard/bb_param/bb_node.cpp b/blackboard/bb_param/bb_node.cpp
index c841193..f7546ef 100644
--- a/blackboard/bb_param/bb_node.cpp
+++ b/blackboard/bb_param/bb_node.cpp
@@ -13,7 +13,7 @@
 
 Variant BBNode::get_value(Node *p_scene_root, const Ref<Blackboard> &p_blackboard, const Variant &p_default) {
 	ERR_FAIL_NULL_V_MSG(p_scene_root, Variant(), "BBNode: get_value() failed - scene_root is null.");
-	ERR_FAIL_NULL_V_MSG(p_blackboard, Variant(), "BBNode: get_value() failed - blackboard is null.");
+	ERR_FAIL_COND_V_MSG(p_blackboard.is_null(), Variant(), "BBNode: get_value() failed - blackboard is null.");
 
 	Variant val;
 	if (get_value_source() == SAVED_VALUE) {
diff --git a/blackboard/blackboard_plan.cpp b/blackboard/blackboard_plan.cpp
index 567e1d9..2f8f02b 100644
--- a/blackboard/blackboard_plan.cpp
+++ b/blackboard/blackboard_plan.cpp
@@ -532,7 +532,7 @@ void BlackboardPlan::populate_blackboard(const Ref<Blackboard> &p_blackboard, bo
 		if (has_mapping) {
 			StringName target_var = parent_scope_mapping[p.first];
 			if (target_var != StringName()) {
-				ERR_CONTINUE_MSG(p_blackboard->get_parent() == nullptr, vformat("BlackboardPlan: Cannot link variable %s to parent scope because the parent scope is not set.", LimboUtility::get_singleton()->decorate_var(p.first)));
+				ERR_CONTINUE_MSG(p_blackboard->get_parent().is_null(), vformat("BlackboardPlan: Cannot link variable %s to parent scope because the parent scope is not set.", LimboUtility::get_singleton()->decorate_var(p.first)));
 				p_blackboard->link_var(p.first, p_blackboard->get_parent(), target_var);
 			}
 		} else if (is_bound) {
diff --git a/bt/behavior_tree.cpp b/bt/behavior_tree.cpp
index 64d5f4a..afd0feb 100644
--- a/bt/behavior_tree.cpp
+++ b/bt/behavior_tree.cpp
@@ -78,10 +78,10 @@ void BehaviorTree::copy_other(const Ref<BehaviorTree> &p_other) {
 }
 
 Ref<BTInstance> BehaviorTree::instantiate(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_instance_owner, Node *p_custom_scene_root) const {
-	ERR_FAIL_COND_V_MSG(root_task == nullptr, nullptr, "BehaviorTree: Instantiation failed - BT has no valid root task.");
+	ERR_FAIL_COND_V_MSG(root_task.is_null(), nullptr, "BehaviorTree: Instantiation failed - BT has no valid root task.");
 	ERR_FAIL_NULL_V_MSG(p_agent, nullptr, "BehaviorTree: Instantiation failed - agent can't be null.");
 	ERR_FAIL_NULL_V_MSG(p_instance_owner, nullptr, "BehaviorTree: Instantiation failed -- instance owner can't be null.");
-	ERR_FAIL_NULL_V_MSG(p_blackboard, nullptr, "BehaviorTree: Instantiation failed - blackboard can't be null.");
+	ERR_FAIL_COND_V_MSG(p_blackboard.is_null(), nullptr, "BehaviorTree: Instantiation failed - blackboard can't be null.");
 	Node *scene_root = p_custom_scene_root ? p_custom_scene_root : p_instance_owner->get_owner();
 	ERR_FAIL_NULL_V_MSG(scene_root, nullptr, "BehaviorTree: Instantiation failed - unable to establish scene root. This is likely due to the instance owner not being owned by a scene node and custom_scene_root being null.");
 	Ref<BTTask> root_copy = root_task->clone();
diff --git a/bt/bt_instance.cpp b/bt/bt_instance.cpp
index dd0df10..961d3bc 100644
--- a/bt/bt_instance.cpp
+++ b/bt/bt_instance.cpp
@@ -25,7 +25,7 @@
 #endif
 
 Ref<BTInstance> BTInstance::create(Ref<BTTask> p_root_task, String p_source_bt_path, Node *p_owner_node) {
-	ERR_FAIL_NULL_V(p_root_task, nullptr);
+	ERR_FAIL_COND_V(p_root_task.is_null(), nullptr);
 	ERR_FAIL_NULL_V(p_owner_node, nullptr);
 	Ref<BTInstance> inst;
 	inst.instantiate();
@@ -103,7 +103,7 @@ double BTInstance::_get_mean_update_time_msec_and_reset() {
 
 void BTInstance::_add_custom_monitor() {
 	ERR_FAIL_NULL(get_owner_node());
-	ERR_FAIL_NULL(root_task);
+	ERR_FAIL_COND(root_task.is_null());
 	ERR_FAIL_NULL(root_task->get_agent());
 
 	if (monitor_id == StringName()) {
diff --git a/bt/bt_state.cpp b/bt/bt_state.cpp
index 5449943..835d382 100644
--- a/bt/bt_state.cpp
+++ b/bt/bt_state.cpp
@@ -98,7 +98,7 @@ void BTState::_update(double p_delta) {
 		// Bail out if a transition happened in the meantime.
 		return;
 	}
-	ERR_FAIL_NULL(bt_instance);
+	ERR_FAIL_COND(bt_instance.is_null());
 	BT::Status status = bt_instance->update(p_delta);
 	if (status == BTTask::SUCCESS) {
 		get_root()->dispatch(success_event, Variant());
diff --git a/bt/tasks/bt_comment.cpp b/bt/tasks/bt_comment.cpp
index b5689da..d2475b6 100644
--- a/bt/tasks/bt_comment.cpp
+++ b/bt/tasks/bt_comment.cpp
@@ -30,7 +30,7 @@ PackedStringArray BTComment::get_configuration_warnings() {
 	if (get_child_count_excluding_comments() > 0) {
 		warnings.append("Can only have other comment tasks as children.");
 	}
-	if (get_parent() == nullptr) {
+	if (get_parent().is_null()) {
 		warnings.append("Can't be the root task.");
 	}
 	return warnings;
diff --git a/bt/tasks/bt_task.cpp b/bt/tasks/bt_task.cpp
index 11ae322..315344e 100644
--- a/bt/tasks/bt_task.cpp
+++ b/bt/tasks/bt_task.cpp
@@ -163,7 +163,7 @@ void BTTask::set_custom_name(const String &p_name) {
 
 void BTTask::initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_scene_root) {
 	ERR_FAIL_NULL(p_agent);
-	ERR_FAIL_NULL(p_blackboard);
+	ERR_FAIL_COND(p_blackboard.is_null());
 	ERR_FAIL_NULL(p_scene_root);
 	data.agent = p_agent;
 	data.blackboard = p_blackboard;
diff --git a/bt/tasks/decorators/bt_cooldown.cpp b/bt/tasks/decorators/bt_cooldown.cpp
index c16199f..1997bce 100644
--- a/bt/tasks/decorators/bt_cooldown.cpp
+++ b/bt/tasks/decorators/bt_cooldown.cpp
@@ -80,7 +80,7 @@ void BTCooldown::_chill() {
 		timer->set_time_left(duration);
 	} else {
 		timer = SCENE_TREE()->create_timer(duration, process_pause);
-		ERR_FAIL_NULL(timer);
+		ERR_FAIL_COND(timer.is_null());
 		timer->connect(LW_NAME(timeout), callable_mp(this, &BTCooldown::_on_timeout), CONNECT_ONE_SHOT);
 	}
 }
diff --git a/bt/tasks/decorators/bt_new_scope.cpp b/bt/tasks/decorators/bt_new_scope.cpp
index 1c6dd8a..a9232c9 100644
--- a/bt/tasks/decorators/bt_new_scope.cpp
+++ b/bt/tasks/decorators/bt_new_scope.cpp
@@ -32,16 +32,16 @@ void BTNewScope::set_blackboard_plan(const Ref<BlackboardPlan> &p_plan) {
 
 #ifdef TOOLS_ENABLED
 void BTNewScope::_set_parent_scope_plan_from_bt() {
-	ERR_FAIL_NULL(get_blackboard_plan());
+	ERR_FAIL_COND(get_blackboard_plan().is_null());
 	Ref<BehaviorTree> bt = get_root()->editor_get_behavior_tree();
-	ERR_FAIL_NULL(bt);
+	ERR_FAIL_COND(bt.is_null());
 	get_blackboard_plan()->set_parent_scope_plan_provider(Callable(bt.ptr(), "get_blackboard_plan"));
 }
 #endif // TOOLS_ENABLED
 
 void BTNewScope::initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_scene_root) {
 	ERR_FAIL_COND(p_agent == nullptr);
-	ERR_FAIL_COND(p_blackboard == nullptr);
+	ERR_FAIL_COND(p_blackboard.is_null());
 
 	Ref<Blackboard> bb;
 	if (blackboard_plan.is_valid()) {
diff --git a/editor/blackboard_plan_editor.cpp b/editor/blackboard_plan_editor.cpp
index b9dd910..75c1bfc 100644
--- a/editor/blackboard_plan_editor.cpp
+++ b/editor/blackboard_plan_editor.cpp
@@ -46,7 +46,7 @@ LineEdit *BlackboardPlanEditor::_get_name_edit(int p_row_index) const {
 }
 
 void BlackboardPlanEditor::_add_var() {
-	ERR_FAIL_NULL(plan);
+	ERR_FAIL_COND(plan.is_null());
 
 	int suffix = 1;
 	StringName var_name = default_var_name == StringName() ? "var" : default_var_name;
@@ -65,14 +65,14 @@ void BlackboardPlanEditor::_add_var() {
 }
 
 void BlackboardPlanEditor::_trash_var(int p_index) {
-	ERR_FAIL_NULL(plan);
+	ERR_FAIL_COND(plan.is_null());
 	StringName var_name = plan->get_var_by_index(p_index).first;
 	plan->remove_var(var_name);
 	_refresh();
 }
 
 void BlackboardPlanEditor::_rename_var(const StringName &p_new_name, int p_index) {
-	ERR_FAIL_NULL(plan);
+	ERR_FAIL_COND(plan.is_null());
 
 	LineEdit *name_edit = _get_name_edit(p_index);
 	ERR_FAIL_NULL(name_edit);
@@ -96,7 +96,7 @@ void BlackboardPlanEditor::_rename_var(const StringName &p_new_name, int p_index
 }
 
 void BlackboardPlanEditor::_change_var_type(Variant::Type p_new_type, int p_index) {
-	ERR_FAIL_NULL(plan);
+	ERR_FAIL_COND(plan.is_null());
 
 	BBVariable var = plan->get_var_by_index(p_index).second;
 	if (var.get_type() == p_new_type) {
@@ -115,14 +115,14 @@ void BlackboardPlanEditor::_change_var_type(Variant::Type p_new_type, int p_inde
 }
 
 void BlackboardPlanEditor::_change_var_hint(PropertyHint p_new_hint, int p_index) {
-	ERR_FAIL_NULL(plan);
+	ERR_FAIL_COND(plan.is_null());
 	plan->get_var_by_index(p_index).second.set_hint(p_new_hint);
 	plan->notify_property_list_changed();
 	_refresh();
 }
 
 void BlackboardPlanEditor::_change_var_hint_string(const String &p_new_hint_string, int p_index) {
-	ERR_FAIL_NULL(plan);
+	ERR_FAIL_COND(plan.is_null());
 	plan->get_var_by_index(p_index).second.set_hint_string(p_new_hint_string);
 	plan->notify_property_list_changed();
 }
@@ -472,14 +472,14 @@ BlackboardPlanEditor::BlackboardPlanEditor() {
 // ***** EditorInspectorPluginBBPlan *****
 
 void EditorInspectorPluginBBPlan::_edit_plan(const Ref<BlackboardPlan> &p_plan) {
-	ERR_FAIL_NULL(p_plan);
+	ERR_FAIL_COND(p_plan.is_null());
 	plan_editor->edit_plan(p_plan);
 	plan_editor->popup_centered();
 }
 
 void EditorInspectorPluginBBPlan::_open_base_plan(const Ref<BlackboardPlan> &p_plan) {
-	ERR_FAIL_NULL(p_plan);
-	ERR_FAIL_NULL(p_plan->get_base_plan());
+	ERR_FAIL_COND(p_plan.is_null());
+	ERR_FAIL_COND(p_plan->get_base_plan().is_null());
 	EditorInterface::get_singleton()->call_deferred("edit_resource", p_plan->get_base_plan());
 }
 
@@ -501,7 +501,7 @@ void EditorInspectorPluginBBPlan::parse_begin(Object *p_object) {
 void EditorInspectorPluginBBPlan::_parse_begin(Object *p_object) {
 #endif
 	Ref<BlackboardPlan> plan = Object::cast_to<BlackboardPlan>(p_object);
-	ERR_FAIL_NULL(plan);
+	ERR_FAIL_COND(plan.is_null());
 
 	PanelContainer *panel = memnew(PanelContainer);
 	ADD_STYLEBOX_OVERRIDE(panel, LW_NAME(panel), toolbar_style);
diff --git a/editor/editor_property_variable_name.cpp b/editor/editor_property_variable_name.cpp
index 75cdcbe..7d2adf5 100644
--- a/editor/editor_property_variable_name.cpp
+++ b/editor/editor_property_variable_name.cpp
@@ -36,7 +36,7 @@ int EditorPropertyVariableName::last_caret_column = 0;
 //***** EditorPropertyVariableName
 
 void EditorPropertyVariableName::_show_variables_popup() {
-	ERR_FAIL_NULL(plan);
+	ERR_FAIL_COND(plan.is_null());
 
 	variables_popup->clear();
 	variables_popup->reset_size();
@@ -109,7 +109,7 @@ void EditorPropertyVariableName::_update_status() {
 }
 
 void EditorPropertyVariableName::_status_pressed() {
-	ERR_FAIL_NULL(plan);
+	ERR_FAIL_COND(plan.is_null());
 	if (!plan->has_var(name_edit->get_text())) {
 		BlackboardPlanEditor::get_singleton()->set_defaults(name_edit->get_text(),
 				expected_type == Variant::NIL ? Variant::FLOAT : expected_type,
@@ -120,14 +120,14 @@ void EditorPropertyVariableName::_status_pressed() {
 }
 
 void EditorPropertyVariableName::_status_mouse_entered() {
-	ERR_FAIL_NULL(plan);
+	ERR_FAIL_COND(plan.is_null());
 	if (!plan->has_var(name_edit->get_text())) {
 		status_btn->set_button_icon(theme_cache.var_add_icon);
 	}
 }
 
 void EditorPropertyVariableName::_status_mouse_exited() {
-	ERR_FAIL_NULL(plan);
+	ERR_FAIL_COND(plan.is_null());
 	_update_status();
 }
 
@@ -262,7 +262,7 @@ bool EditorInspectorPluginVariableName::_parse_property(Object *p_object, const
 	Variant default_value;
 	if (is_mapping) {
 		plan.reference_ptr(Object::cast_to<BlackboardPlan>(p_object));
-		ERR_FAIL_NULL_V(plan, false);
+		ERR_FAIL_COND_V(plan.is_null(), false);
 		String var_name = p_path.trim_prefix("mapping/");
 		if (plan->has_var(var_name)) {
 			BBVariable variable = plan->get_var(var_name);
@@ -277,7 +277,7 @@ bool EditorInspectorPluginVariableName::_parse_property(Object *p_object, const
 				plan = parent_plan;
 			}
 		}
-		ERR_FAIL_NULL_V(plan, false);
+		ERR_FAIL_COND_V(plan.is_null(), false);
 	} else {
 		plan = editor_plan_provider.call();
 	}
diff --git a/editor/limbo_ai_editor_plugin.cpp b/editor/limbo_ai_editor_plugin.cpp
index 32b6a79..b6c21e8 100644
--- a/editor/limbo_ai_editor_plugin.cpp
+++ b/editor/limbo_ai_editor_plugin.cpp
@@ -200,7 +200,7 @@ void LimboAIEditor::_remove_task(const Ref<BTTask> &p_task) {
 	ERR_FAIL_COND(p_task.is_null());
 	ERR_FAIL_COND(task_tree->get_bt().is_null());
 	EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Remove BT Task"));
-	if (p_task->get_parent() == nullptr) {
+	if (p_task->get_parent().is_null()) {
 		ERR_FAIL_COND(task_tree->get_bt()->get_root_task() != p_task);
 		undo_redo->add_do_method(task_tree->get_bt().ptr(), LW_NAME(set_root_task), Variant());
 		undo_redo->add_undo_method(task_tree->get_bt().ptr(), LW_NAME(set_root_task), task_tree->get_bt()->get_root_task());
@@ -746,7 +746,7 @@ void LimboAIEditor::_action_selected(int p_id) {
 
 void LimboAIEditor::_on_probability_edited(double p_value) {
 	Ref<BTTask> selected = task_tree->get_selected();
-	ERR_FAIL_COND(selected == nullptr);
+	ERR_FAIL_COND(selected.is_null());
 	Ref<BTProbabilitySelector> probability_selector = selected->get_parent();
 	ERR_FAIL_COND(probability_selector.is_null());
 	if (percent_mode->is_pressed()) {
@@ -1241,7 +1241,7 @@ void LimboAIEditor::_tab_menu_option_selected(int p_id) {
 		} break;
 		case TAB_JUMP_TO_OWNER: {
 			Ref<BehaviorTree> bt = history[idx_history];
-			ERR_FAIL_NULL(bt);
+			ERR_FAIL_COND(bt.is_null());
 			String bt_path = bt->get_path();
 			if (!bt_path.is_empty()) {
 				owner_picker->pick_and_open_owner_of_resource(bt_path);
diff --git a/editor/task_tree.cpp b/editor/task_tree.cpp
index efd57b2..f215539 100644
--- a/editor/task_tree.cpp
+++ b/editor/task_tree.cpp
@@ -192,7 +192,7 @@ void TaskTree::_on_item_collapsed(Object *p_obj) {
 	}
 
 	Ref<BTTask> task = item->get_metadata(0);
-	ERR_FAIL_NULL(task);
+	ERR_FAIL_COND(task.is_null());
 	task->set_display_collapsed(item->is_collapsed());
 }
 
@@ -574,7 +574,7 @@ void TaskTree::_bind_methods() {
 
 // TreeSearch API
 void TaskTree::tree_search_show_and_focus() {
-	ERR_FAIL_NULL(tree_search);
+	ERR_FAIL_COND(tree_search.is_null());
 	tree_search_panel->set_visible(true);
 	tree_search_panel->focus_editor();
 }
@@ -587,7 +587,7 @@ TreeSearch::SearchInfo TaskTree::tree_search_get_search_info() const {
 }
 
 void TaskTree::tree_search_set_search_info(const TreeSearch::SearchInfo &p_search_info) {
-	ERR_FAIL_NULL(tree_search);
+	ERR_FAIL_COND(tree_search.is_null());
 	tree_search_panel->set_search_info(p_search_info);
 }
 
diff --git a/editor/tree_search.cpp b/editor/tree_search.cpp
index e510edd..ff8bb6d 100644
--- a/editor/tree_search.cpp
+++ b/editor/tree_search.cpp
@@ -158,7 +158,7 @@ void TreeSearch::_draw_highlight_item(TreeItem *p_tree_item, const Rect2 p_rect,
 		if (font.is_null()) {
 			font = p_tree_item->get_tree()->get_theme_font(LW_NAME(font));
 		}
-		ERR_FAIL_NULL(font);
+		ERR_FAIL_COND(font.is_null());
 		float font_size = p_tree_item->get_custom_font_size(0);
 		if (font_size == -1) {
 			font_size = p_tree_item->get_tree()->get_theme_font_size(LW_NAME(font));
@@ -176,7 +176,7 @@ void TreeSearch::_draw_highlight_item(TreeItem *p_tree_item, const Rect2 p_rect,
 
 		// Stylebox
 		Ref<StyleBox> stylebox = p_tree_item->get_tree()->get_theme_stylebox(LW_NAME(Focus));
-		ERR_FAIL_NULL(stylebox);
+		ERR_FAIL_COND(stylebox.is_null());
 
 		// Extract separation
 		float h_sep = p_tree_item->get_tree()->get_theme_constant(LW_NAME(h_separation));
diff --git a/tests/test_task.h b/tests/test_task.h
index 5e79ae0..efa3350 100644
--- a/tests/test_task.h
+++ b/tests/test_task.h
@@ -78,7 +78,7 @@ TEST_CASE("[Modules][LimboAI] BTTask") {
 		SUBCASE("Test next_sibling()") {
 			CHECK(child1->next_sibling() == child2);
 			CHECK(child2->next_sibling() == child3);
-			CHECK(child3->next_sibling() == nullptr);
+			CHECK(child3->next_sibling().is_null());
 		}
 		SUBCASE("Test remove_child()") {
 			task->remove_child(child2);
@@ -153,7 +153,7 @@ TEST_CASE("[Modules][LimboAI] BTTask") {
 			CHECK(child3->get_root() == task);
 		}
 		SUBCASE("Test get_parent()") {
-			CHECK(task->get_parent() == nullptr);
+			CHECK(task->get_parent().is_null());
 			CHECK(child1->get_parent() == task);
 			CHECK(child2->get_parent() == task);
 			CHECK(child2->get_parent() == task);

From ebc5194dc493ce0a6f22f65207ef3c468b945ce8 Mon Sep 17 00:00:00 2001
From: "Wilson E. Alvarez" <wilson.e.alvarez@rubonnek.com>
Date: Mon, 25 Nov 2024 17:50:04 -0500
Subject: [PATCH 6/9] Fix unhandled PROPERTY_HINT_ONESHOT warning

Due to upstream change:

	https://github.com/godotengine/godot/commit/761a20f7a720864af1c43747f5ac31b9915d04e3
---
 util/limbo_utility.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/util/limbo_utility.cpp b/util/limbo_utility.cpp
index 381cfee..81c5b53 100644
--- a/util/limbo_utility.cpp
+++ b/util/limbo_utility.cpp
@@ -401,6 +401,9 @@ String LimboUtility::get_property_hint_text(PropertyHint p_hint) const {
 		case PROPERTY_HINT_TOOL_BUTTON: {
 			return "TOOL_BUTTON";
 		}
+		case PROPERTY_HINT_ONESHOT: {
+			return "ONESHOT";
+		}
 		case PROPERTY_HINT_LOCALE_ID: {
 			return "LOCALE_ID";
 		}

From 8274ff605f59e9a8213cfba73763c8b0670ccb3a Mon Sep 17 00:00:00 2001
From: "Wilson E. Alvarez" <wilson.e.alvarez@rubonnek.com>
Date: Sun, 15 Dec 2024 17:21:29 -0500
Subject: [PATCH 7/9] Refactor EditorHelpBit usage

Due to upstream change:

	https://github.com/godotengine/godot/commit/4e19ab8afed8407f1b077458863de1f7431b7f61
---
 editor/task_palette.cpp | 11 ++---------
 1 file changed, 2 insertions(+), 9 deletions(-)

diff --git a/editor/task_palette.cpp b/editor/task_palette.cpp
index 7f427a6..4278006 100644
--- a/editor/task_palette.cpp
+++ b/editor/task_palette.cpp
@@ -68,9 +68,6 @@ Control *TaskButton::_do_make_tooltip() const {
 		help_symbol = "class|" + task_meta + "|";
 	}
 
-	EditorHelpBit *help_bit = memnew(EditorHelpBit(help_symbol));
-	help_bit->set_content_height_limits(1, 360 * EDSCALE);
-
 	String desc = _module_get_help_description(task_meta);
 	if (desc.is_empty() && is_resource) {
 		// ! HACK: Force documentation parsing.
@@ -84,14 +81,10 @@ Control *TaskButton::_do_make_tooltip() const {
 			desc = _module_get_help_description(task_meta);
 		}
 	}
-	if (desc.is_empty() && help_bit->get_description().is_empty()) {
+	if (desc.is_empty()) {
 		desc = "[i]" + TTR("No description.") + "[/i]";
 	}
-	if (!desc.is_empty()) {
-		help_bit->set_description(desc);
-	}
-
-	EditorHelpBitTooltip::show_tooltip(help_bit, const_cast<TaskButton *>(this));
+	EditorHelpBitTooltip::show_tooltip(const_cast<TaskButton *>(this), help_symbol, desc);
 #endif // LIMBOAI_MODULE
 
 #ifdef LIMBOAI_GDEXTENSION

From d294e922599e34850421eb4dce38f332497d46c2 Mon Sep 17 00:00:00 2001
From: "Wilson E. Alvarez" <wilson.e.alvarez@rubonnek.com>
Date: Tue, 17 Dec 2024 17:37:35 -0500
Subject: [PATCH 8/9] Override renamed EditorPlugin::get_name() method

Due to upstream change:

	https://github.com/godotengine/godot/commit/0ab3dc273ee783eea8a5af6922d7960a8274597c
---
 editor/limbo_ai_editor_plugin.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/editor/limbo_ai_editor_plugin.h b/editor/limbo_ai_editor_plugin.h
index 93bf49e..20b39f6 100644
--- a/editor/limbo_ai_editor_plugin.h
+++ b/editor/limbo_ai_editor_plugin.h
@@ -297,7 +297,7 @@ public:
 #ifdef LIMBOAI_MODULE
 	bool has_main_screen() const override { return true; }
 
-	virtual String get_name() const override { return "LimboAI"; }
+	virtual String get_plugin_name() const override { return "LimboAI"; }
 	virtual void make_visible(bool p_visible) override;
 	virtual void edit(Object *p_object) override;
 	virtual bool handles(Object *p_object) const override;

From acfe76e1efd9253c1e6ce923fcb89d6ed29500e2 Mon Sep 17 00:00:00 2001
From: "Wilson E. Alvarez" <wilson.e.alvarez@rubonnek.com>
Date: Tue, 17 Dec 2024 17:41:33 -0500
Subject: [PATCH 9/9] Fix unhandled PROPERTY_HINT_NO_NODEPATH warning

Due to upstream change:

	https://github.com/godotengine/godot/commit/6f7525c396cb28f4eb89203b476fd4a787cfd68d
---
 util/limbo_utility.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/util/limbo_utility.cpp b/util/limbo_utility.cpp
index 81c5b53..fd029e6 100644
--- a/util/limbo_utility.cpp
+++ b/util/limbo_utility.cpp
@@ -404,6 +404,9 @@ String LimboUtility::get_property_hint_text(PropertyHint p_hint) const {
 		case PROPERTY_HINT_ONESHOT: {
 			return "ONESHOT";
 		}
+		case PROPERTY_HINT_NO_NODEPATH: {
+			return "NO_NODEPATH";
+		}
 		case PROPERTY_HINT_LOCALE_ID: {
 			return "LOCALE_ID";
 		}