diff --git a/bt/actions/bt_console_print.cpp b/bt/actions/bt_console_print.cpp
new file mode 100644
index 0000000..e030d69
--- /dev/null
+++ b/bt/actions/bt_console_print.cpp
@@ -0,0 +1,74 @@
+/* bt_console_print.cpp */
+
+#include "bt_console_print.h"
+#include "core/object.h"
+#include "core/print_string.h"
+#include "modules/limboai/bt/actions/bt_action.h"
+
+String BTConsolePrint::_generate_name() const {
+ String tx = text;
+ if (text.length() > 30) {
+ tx = text.substr(0, 30) + "...";
+ }
+ tx = tx.replace("\"", "\\\"");
+ if (format_var_args.size() > 0) {
+ return vformat("ConsolePrint text: \"%s\" format_args: %s", tx, format_var_args);
+ }
+ return vformat("ConsolePrint \"%s\"", tx);
+}
+
+int BTConsolePrint::_tick(float p_delta) {
+ switch (format_var_args.size()) {
+ case 0: {
+ print_line(text);
+ } break;
+ case 1: {
+ print_line(vformat(text, get_blackboard().get(format_var_args[0], "")));
+ } break;
+ case 2: {
+ print_line(vformat(text, get_blackboard().get(format_var_args[0], ""),
+ get_blackboard().get(format_var_args[1], "")));
+ } break;
+ case 3: {
+ print_line(vformat(text, get_blackboard().get(format_var_args[0], ""),
+ get_blackboard().get(format_var_args[1], ""),
+ get_blackboard().get(format_var_args[2], "")));
+ } break;
+ case 4: {
+ print_line(vformat(text, get_blackboard().get(format_var_args[0], ""),
+ get_blackboard().get(format_var_args[1], ""),
+ get_blackboard().get(format_var_args[2], ""),
+ get_blackboard().get(format_var_args[3], "")));
+ } break;
+ case 5:
+ default: {
+ print_line(vformat(text, get_blackboard().get(format_var_args[0], ""),
+ get_blackboard().get(format_var_args[1], ""),
+ get_blackboard().get(format_var_args[2], ""),
+ get_blackboard().get(format_var_args[3], ""),
+ get_blackboard().get(format_var_args[4], "")));
+ } break;
+ }
+ return SUCCESS;
+}
+
+String BTConsolePrint::get_configuration_warning() const {
+ String warning = BTAction::get_configuration_warning();
+ if (!warning.empty()) {
+ warning += "\n";
+ }
+ if (format_var_args.size() > 5) {
+ warning += "ConsolePrint supports up to 5 format arguments.\n";
+ }
+ return warning;
+}
+
+void BTConsolePrint::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("set_text", "p_text"), &BTConsolePrint::set_text);
+ ClassDB::bind_method(D_METHOD("get_text"), &BTConsolePrint::get_text);
+ ClassDB::bind_method(D_METHOD("set_format_var_args", "p_variables"), &BTConsolePrint::set_format_var_args);
+ ClassDB::bind_method(D_METHOD("get_format_var_args"), &BTConsolePrint::get_format_var_args);
+
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "text", PROPERTY_HINT_MULTILINE_TEXT), "set_text", "get_text");
+ ADD_PROPERTY(PropertyInfo(Variant::POOL_STRING_ARRAY, "format_var_args"), "set_format_var_args", "get_format_var_args");
+}
\ No newline at end of file
diff --git a/bt/actions/bt_console_print.h b/bt/actions/bt_console_print.h
new file mode 100644
index 0000000..6a21475
--- /dev/null
+++ b/bt/actions/bt_console_print.h
@@ -0,0 +1,39 @@
+/* bt_console_print.h */
+
+#ifndef BT_CONSOLE_PRINT_H
+#define BT_CONSOLE_PRINT_H
+
+#include "bt_action.h"
+#include "core/object.h"
+#include "core/variant.h"
+
+class BTConsolePrint : public BTAction {
+ GDCLASS(BTConsolePrint, BTAction);
+
+private:
+ String text;
+ PoolStringArray format_var_args;
+
+protected:
+ static void _bind_methods();
+
+ virtual String _generate_name() const;
+ virtual int _tick(float p_delta);
+
+public:
+ void set_text(String p_value) {
+ text = p_value;
+ emit_changed();
+ }
+ String get_text() const { return text; }
+
+ void set_format_var_args(const PoolStringArray &p_value) {
+ format_var_args = p_value;
+ emit_changed();
+ }
+ PoolStringArray get_format_var_args() const { return format_var_args; }
+
+ virtual String get_configuration_warning() const;
+};
+
+#endif // BT_CONSOLE_PRINT_H
\ No newline at end of file
diff --git a/icons/icon_b_t_console_print.svg b/icons/icon_b_t_console_print.svg
new file mode 100644
index 0000000..cee42eb
--- /dev/null
+++ b/icons/icon_b_t_console_print.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/register_types.cpp b/register_types.cpp
index 41e108e..01a794a 100644
--- a/register_types.cpp
+++ b/register_types.cpp
@@ -5,6 +5,7 @@
#include "core/class_db.h"
#include "bt/actions/bt_action.h"
+#include "bt/actions/bt_console_print.h"
#include "bt/actions/bt_fail.h"
#include "bt/actions/bt_random_wait.h"
#include "bt/actions/bt_subtree.h"
@@ -75,6 +76,7 @@ void register_limboai_types() {
ClassDB::register_class();
ClassDB::register_class();
ClassDB::register_class();
+ ClassDB::register_class();
ClassDB::register_class();