From a1c8b76cb9d973827dac54fc349a6e196ce81a08 Mon Sep 17 00:00:00 2001
From: Yona-TYT <yonatan.el.amigo@gmail.com>
Date: Sun, 24 Nov 2024 23:00:52 -0400
Subject: [PATCH] Listen and Send message chat

---
 src/simutrans/dataobj/scenario.cc   | 13 +++++++++++++
 src/simutrans/dataobj/scenario.h    |  4 ++++
 src/simutrans/script/api/api_gui.cc | 21 +++++++++++++++++++++
 src/simutrans/simmesg.cc            |  2 ++
 4 files changed, 40 insertions(+)

diff --git a/src/simutrans/dataobj/scenario.cc b/src/simutrans/dataobj/scenario.cc
index c58cc91b5..6df58a31d 100644
--- a/src/simutrans/dataobj/scenario.cc
+++ b/src/simutrans/dataobj/scenario.cc
@@ -666,6 +666,19 @@ const char* scenario_t::jump_to_link_executed(koord3d pos)
 	return NULL;
 }
 
+
+void scenario_t::is_message_chat(sint8 chanel, const player_t* player, const char *sender_nick, const char *recipient, koord pos, const char *msg)
+{
+	// call script
+	if (what_scenario == SCRIPTED) {
+		static plainstring str;
+		const player_t* curr_player = welt->get_active_player();
+		script->call_function(script_vm_t::FORCE, "is_message_chat", str, msg, player->get_player_nr(), chanel, sender_nick, recipient, pos, (uint8)(curr_player ? curr_player->get_player_nr() : PLAYER_UNOWNED));
+
+	}
+}
+
+
 const char* scenario_t::get_error_text()
 {
 	if (script) {
diff --git a/src/simutrans/dataobj/scenario.h b/src/simutrans/dataobj/scenario.h
index 597844518..6077421a5 100644
--- a/src/simutrans/dataobj/scenario.h
+++ b/src/simutrans/dataobj/scenario.h
@@ -21,6 +21,7 @@ class fabrik_t;
 class karte_t;
 class schedule_t;
 class depot_t;
+class nwc_chat_t;
 
 /**
  * @class scenario_t
@@ -483,6 +484,9 @@ public:
 	 */
 	const char* jump_to_link_executed(koord3d pos);
 
+
+	void is_message_chat(sint8 chanel, const player_t* player, const char *sender_nick, const char *recipient, koord pos, const char *msg);
+
 	/// @return debug dump of forbidden tools
 	const char* get_forbidden_text();
 	/// @}
diff --git a/src/simutrans/script/api/api_gui.cc b/src/simutrans/script/api/api_gui.cc
index c5a6d71eb..0a698426c 100644
--- a/src/simutrans/script/api/api_gui.cc
+++ b/src/simutrans/script/api/api_gui.cc
@@ -75,6 +75,25 @@ void open_info_win()
 	open_info_win_client("", PLAYER_UNOWNED);
 }
 
+static SQInteger add_chat_message(HSQUIRRELVM vm)
+{
+
+	const char* text = param<const char*>::get(vm, 2);
+	const sint8 sender_company_nr = param<sint8>::get(vm, 3);
+	const sint8 channel = param<sint8>::get(vm, 4);
+	const char* clientname = param<const char*>::get(vm, 5);
+	const char* destination = param<const char*>::get(vm, 6);
+	const koord pos = param<koord>::get(vm, 7);
+
+	dbg->warning("API messge","--------- Desc %s -- wt %x",text, pos);
+
+	// Send chat message to server for distribution
+	nwc_chat_t* nwchat = new nwc_chat_t(text, sender_company_nr, channel, clientname, destination, pos);
+	network_send_server(nwchat);
+
+	return SQ_OK;
+}
+
 void export_gui(HSQUIRRELVM vm, bool scenario)
 {
 	/**
@@ -127,6 +146,8 @@ void export_gui(HSQUIRRELVM vm, bool scenario)
 		* @ingroup scen_only
 		*/
 		STATIC register_method(vm, &add_scenario_message, "add_message");
+
+		STATIC register_function(vm, add_chat_message, "add_chat_message", 7, "..i i..t|x|y");
 	}
 	else {
 		/**
diff --git a/src/simutrans/simmesg.cc b/src/simutrans/simmesg.cc
index 3cfd5045c..5de214131 100644
--- a/src/simutrans/simmesg.cc
+++ b/src/simutrans/simmesg.cc
@@ -17,6 +17,7 @@
 #include "dataobj/translator.h"
 #include "dataobj/environment.h"
 #include "dataobj/pakset_manager.h"
+#include "dataobj/scenario.h"
 #include "network/network_socket_list.h"
 #include "player/simplay.h"
 #include "utils/simstring.h"
@@ -413,6 +414,7 @@ void chat_message_t::add_chat_message(const char* text, sint8 channel, sint8 sen
 					sound_play(sound_desc_t::message_sound, 255, TOOL_SOUND);
 				}
 			}
+			welt->get_scenario()->is_message_chat(channel, player, sender_nick.c_str(), recipient.c_str(), pos, text);
 		}
 	}
 	else if (channel == -2) {
-- 
2.47.0

