Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions managed/CounterStrikeSharp.API/Core/Listeners.g.cs
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,16 @@ public class Listeners
[ListenerName("OnPlayerButtonsChanged")]
public delegate void OnPlayerButtonsChanged(CCSPlayerController player, PlayerButtons pressed, PlayerButtons released);


/// <summary>
/// Called when a player sends a chat message.
/// </summary>
/// <param name="player">The player who sent the chat message.</param>
/// <param name="message">The content of the chat message.</param>
/// <param name="teamChat">If the chat message was sent to team only.</param>
[ListenerName("OnPlayerChat")]
public delegate void OnPlayerChat(CCSPlayerController player, string message, bool teamChat);

/// <summary>
/// Called when all metamod plugins are loaded.
/// </summary>
Expand Down
41 changes: 27 additions & 14 deletions src/core/managers/chat_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,25 +48,14 @@ void ChatManager::OnAllInitialized()
auto m_hook = funchook_create();
funchook_prepare(m_hook, (void**)&m_pHostSay, (void*)&DetourHostSay);
funchook_install(m_hook, 0);

on_player_chat_callback = globals::callbackManager.CreateCallback("OnPlayerChat");
}

void ChatManager::OnShutdown() {}
void ChatManager::OnShutdown() { globals::callbackManager.ReleaseCallback(on_player_chat_callback); }

void DetourHostSay(CEntityInstance* pController, CCommand& args, bool teamonly, int unk1, const char* unk2)
{
if (pController)
{
auto pEvent = globals::gameEventManager->CreateEvent("player_chat", true);
if (pEvent)
{
pEvent->SetBool("teamonly", teamonly);
pEvent->SetInt("userid", pController->GetEntityIndex().Get() - 1);
pEvent->SetString("text", args[1]);

globals::gameEventManager->FireEvent(pEvent, true);
}
}

std::string prefix;
bool bSilent = globals::coreConfig->IsSilentChatTrigger(args[1], prefix);
bool bCommand = globals::coreConfig->IsPublicChatTrigger(args[1], prefix) || bSilent;
Expand Down Expand Up @@ -97,6 +86,30 @@ void DetourHostSay(CEntityInstance* pController, CCommand& args, bool teamonly,

globals::chatManager.OnSayCommandPost(pController, args);
}

if (pController)
{
auto callback = globals::chatManager.on_player_chat_callback;

if (callback && callback->GetFunctionCount())
{
callback->ScriptContext().Reset();
callback->ScriptContext().Push(pController);
callback->ScriptContext().Push(args.Arg(1));
callback->ScriptContext().Push(teamonly);
callback->Execute();
}

auto pEvent = globals::gameEventManager->CreateEvent("player_chat", true);
if (pEvent)
{
pEvent->SetBool("teamonly", teamonly);
pEvent->SetInt("userid", pController->GetEntityIndex().Get() - 1);
pEvent->SetString("text", args[1]);

globals::gameEventManager->FireEvent(pEvent, false);
}
}
}

bool ChatManager::OnSayCommandPre(CEntityInstance* pController, CCommand& command) { return false; }
Expand Down
2 changes: 2 additions & 0 deletions src/core/managers/chat_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ class ChatManager : public GlobalClass
bool OnSayCommandPre(CEntityInstance* pController, CCommand& args);
void OnSayCommandPost(CEntityInstance* pController, CCommand& args);

ScriptCallback* on_player_chat_callback = nullptr;

private:
void InternalDispatch(CEntityInstance* pPlayerController, const char* szTriggerPhrase, CCommand& pFullCommand);

Expand Down
Loading