@@ -35,11 +35,24 @@ ChatManager::ChatManager() {}
3535
3636ChatManager::~ChatManager () {}
3737
38- void ChatManager::OnAllInitialized () {}
38+ void ChatManager::OnAllInitialized ()
39+ {
40+ m_pHostSay = reinterpret_cast <HostSay>(modules::server->FindSignature (globals::gameConfig->GetSignature (" Host_Say" )));
41+
42+ if (m_pHostSay == nullptr )
43+ {
44+ CSSHARP_CORE_ERROR (" Failed to find signature for \' Host_Say\' " );
45+ return ;
46+ }
47+
48+ auto m_hook = funchook_create ();
49+ funchook_prepare (m_hook, (void **)&m_pHostSay, (void *)&DetourHostSay);
50+ funchook_install (m_hook, 0 );
51+ }
3952
4053void ChatManager::OnShutdown () {}
4154
42- bool ChatManager::OnSayCommand (CEntityInstance* pController, const CCommand& args, bool teamonly)
55+ void DetourHostSay (CEntityInstance* pController, CCommand& args, bool teamonly, int unk1, const char * unk2 )
4356{
4457 if (pController)
4558 {
@@ -58,35 +71,32 @@ bool ChatManager::OnSayCommand(CEntityInstance* pController, const CCommand& arg
5871 bool bSilent = globals::coreConfig->IsSilentChatTrigger (args[1 ], prefix);
5972 bool bCommand = globals::coreConfig->IsPublicChatTrigger (args[1 ], prefix) || bSilent;
6073
74+ if (!bSilent)
75+ {
76+ m_pHostSay (pController, args, teamonly, unk1, unk2);
77+ }
78+
6179 if (bCommand)
6280 {
63- auto message = std::string ( args.ArgS ());
81+ char * pszMessage = ( char *)( args.ArgS () + prefix. length () + 1 );
6482
65- // trim quotes off message if they appear, then trim the prefix
66- // "!foobar" -> foobar
67- // !foobar -> foobar
68- if (message.size () >= 2 && message.front () == ' "' && message.back () == ' "' )
69- {
70- message = message.substr (1 , message.size () - 2 );
71- }
72- message = message.substr (prefix.size ());
83+ // Trailing slashes are only removed if Host_Say has been called.
84+ if (bSilent) pszMessage[V_strlen (pszMessage) - 1 ] = 0 ;
7385
74- CCommand newArgs ;
75- newArgs .Tokenize (message. c_str () );
86+ CCommand args ;
87+ args .Tokenize (pszMessage );
7688
77- auto prefixedPhrase = std::string (" css_" ) + newArgs .Arg (0 );
89+ auto prefixedPhrase = std::string (" css_" ) + args .Arg (0 );
7890 auto bValidWithPrefix = globals::conCommandManager.IsValidValveCommand (prefixedPhrase.c_str ());
7991
8092 if (bValidWithPrefix)
8193 {
8294 // Re-tokenize with a `css_` prefix if we have found that its a valid command.
83- newArgs .Tokenize ((" css_" + std::string (message )).c_str ());
95+ args .Tokenize ((" css_" + std::string (pszMessage )).c_str ());
8496 }
8597
86- globals::chatManager.OnSayCommandPost (pController, newArgs );
98+ globals::chatManager.OnSayCommandPost (pController, args );
8799 }
88-
89- return bSilent;
90100}
91101
92102bool ChatManager::OnSayCommandPre (CEntityInstance* pController, CCommand& command) { return false ; }
0 commit comments