merged whispering system by cinaera

This commit is contained in:
oy 2017-12-11 10:52:54 +01:00
parent 2503dfdaec
commit f548838356
6 changed files with 126 additions and 90 deletions

View file

@ -4,6 +4,7 @@ Pickups = Enum("PICKUP", ["HEALTH", "ARMOR", "GRENADE", "SHOTGUN", "LASER", "NIN
Emotes = Enum("EMOTE", ["NORMAL", "PAIN", "HAPPY", "SURPRISE", "ANGRY", "BLINK"]) Emotes = Enum("EMOTE", ["NORMAL", "PAIN", "HAPPY", "SURPRISE", "ANGRY", "BLINK"])
Emoticons = Enum("EMOTICON", ["OOP", "EXCLAMATION", "HEARTS", "DROP", "DOTDOT", "MUSIC", "SORRY", "GHOST", "SUSHI", "SPLATTEE", "DEVILTEE", "ZOMG", "ZZZ", "WTF", "EYES", "QUESTION"]) Emoticons = Enum("EMOTICON", ["OOP", "EXCLAMATION", "HEARTS", "DROP", "DOTDOT", "MUSIC", "SORRY", "GHOST", "SUSHI", "SPLATTEE", "DEVILTEE", "ZOMG", "ZZZ", "WTF", "EYES", "QUESTION"])
Votes = Enum("VOTE", ["UNKNOWN", "START_OP", "START_KICK", "START_SPEC", "END_ABORT", "END_PASS", "END_FAIL"]) Votes = Enum("VOTE", ["UNKNOWN", "START_OP", "START_KICK", "START_SPEC", "END_ABORT", "END_PASS", "END_FAIL"])
ChatModes = Enum("CHAT", ["NONE", "ALL", "TEAM", "WHISPER"])
PlayerFlags = Flags("PLAYERFLAG", ["ADMIN", "CHATTING", "SCOREBOARD", "READY", "DEAD", "WATCHING"]) PlayerFlags = Flags("PLAYERFLAG", ["ADMIN", "CHATTING", "SCOREBOARD", "READY", "DEAD", "WATCHING"])
GameFlags = Flags("GAMEFLAG", ["TEAMS", "FLAGS", "SURVIVAL"]) GameFlags = Flags("GAMEFLAG", ["TEAMS", "FLAGS", "SURVIVAL"])
@ -55,6 +56,7 @@ Enums = [
Emotes, Emotes,
Emoticons, Emoticons,
Votes, Votes,
ChatModes,
GameMsgIDs, GameMsgIDs,
] ]
@ -240,7 +242,7 @@ Messages = [
]), ]),
NetMessage("Sv_Chat", [ NetMessage("Sv_Chat", [
NetIntRange("m_Team", 'TEAM_SPECTATORS', 'TEAM_BLUE'), NetIntRange("m_Mode", 0, 'NUM_CHATS-1'),
NetIntRange("m_ClientID", -1, 'MAX_CLIENTS-1'), NetIntRange("m_ClientID", -1, 'MAX_CLIENTS-1'),
NetStringStrict("m_pMessage"), NetStringStrict("m_pMessage"),
]), ]),
@ -352,7 +354,8 @@ Messages = [
### Client messages ### Client messages
NetMessage("Cl_Say", [ NetMessage("Cl_Say", [
NetBool("m_Team"), NetIntRange("m_Mode", 0, 'NUM_CHATS-1'),
NetIntRange("m_Target", -1, 'MAX_CLIENTS-1'),
NetStringStrict("m_pMessage"), NetStringStrict("m_pMessage"),
]), ]),

View file

@ -34,7 +34,7 @@ void CChat::OnReset()
m_aLines[i].m_aName[0] = 0; m_aLines[i].m_aName[0] = 0;
} }
m_Mode = MODE_NONE; m_Mode = CHAT_NONE;
m_ReverseCompletion = false; m_ReverseCompletion = false;
m_Show = false; m_Show = false;
m_InputUpdate = false; m_InputUpdate = false;
@ -61,7 +61,7 @@ void CChat::OnStateChange(int NewState, int OldState)
{ {
if(OldState <= IClient::STATE_CONNECTING) if(OldState <= IClient::STATE_CONNECTING)
{ {
m_Mode = MODE_NONE; m_Mode = CHAT_NONE;
for(int i = 0; i < MAX_LINES; i++) for(int i = 0; i < MAX_LINES; i++)
m_aLines[i].m_Time = 0; m_aLines[i].m_Time = 0;
m_CurrentLine = 0; m_CurrentLine = 0;
@ -70,23 +70,50 @@ void CChat::OnStateChange(int NewState, int OldState)
void CChat::ConSay(IConsole::IResult *pResult, void *pUserData) void CChat::ConSay(IConsole::IResult *pResult, void *pUserData)
{ {
((CChat*)pUserData)->Say(0, pResult->GetString(0)); ((CChat*)pUserData)->Say(CHAT_ALL, pResult->GetString(0));
} }
void CChat::ConSayTeam(IConsole::IResult *pResult, void *pUserData) void CChat::ConSayTeam(IConsole::IResult *pResult, void *pUserData)
{ {
((CChat*)pUserData)->Say(1, pResult->GetString(0)); ((CChat*)pUserData)->Say(CHAT_TEAM, pResult->GetString(0));
}
void CChat::ConWhisper(IConsole::IResult *pResult, void *pUserData)
{
CChat *pChat = (CChat *)pUserData;
int Target = pResult->GetInteger(0);
if(Target < 0 || Target >= MAX_CLIENTS || !pChat->m_pClient->m_aClients[Target].m_Active || pChat->m_pClient->m_LocalClientID == Target)
pChat->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", "please enter a valid ClientID");
else
{
pChat->m_WhisperTarget = Target;
pChat->Say(CHAT_WHISPER, pResult->GetString(1));
}
} }
void CChat::ConChat(IConsole::IResult *pResult, void *pUserData) void CChat::ConChat(IConsole::IResult *pResult, void *pUserData)
{ {
CChat *pChat = (CChat *)pUserData;
const char *pMode = pResult->GetString(0); const char *pMode = pResult->GetString(0);
if(str_comp(pMode, "all") == 0) if(str_comp(pMode, "all") == 0)
((CChat*)pUserData)->EnableMode(0); pChat->EnableMode(CHAT_ALL);
else if(str_comp(pMode, "team") == 0) else if(str_comp(pMode, "team") == 0)
((CChat*)pUserData)->EnableMode(1); pChat->EnableMode(CHAT_TEAM);
else if(str_comp(pMode, "whisper") == 0)
{
int Target = pResult->GetInteger(1);
if(Target < 0 || Target >= MAX_CLIENTS || !pChat->m_pClient->m_aClients[Target].m_Active || pChat->m_pClient->m_LocalClientID == Target)
pChat->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", "please enter a valid ClientID");
else
{
pChat->m_WhisperTarget = Target;
pChat->EnableMode(CHAT_WHISPER);
}
}
else else
((CChat*)pUserData)->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", "expected all or team as mode"); ((CChat*)pUserData)->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", "expected all, team or whisper as mode");
} }
void CChat::ConShowChat(IConsole::IResult *pResult, void *pUserData) void CChat::ConShowChat(IConsole::IResult *pResult, void *pUserData)
@ -98,18 +125,19 @@ void CChat::OnConsoleInit()
{ {
Console()->Register("say", "r", CFGFLAG_CLIENT, ConSay, this, "Say in chat"); Console()->Register("say", "r", CFGFLAG_CLIENT, ConSay, this, "Say in chat");
Console()->Register("say_team", "r", CFGFLAG_CLIENT, ConSayTeam, this, "Say in team chat"); Console()->Register("say_team", "r", CFGFLAG_CLIENT, ConSayTeam, this, "Say in team chat");
Console()->Register("chat", "s", CFGFLAG_CLIENT, ConChat, this, "Enable chat with all/team mode"); Console()->Register("whisper", "ir", CFGFLAG_CLIENT, ConWhisper, this, "Whisper to a client in chat");
Console()->Register("chat", "s?i", CFGFLAG_CLIENT, ConChat, this, "Enable chat with all/team/whisper mode");
Console()->Register("+show_chat", "", CFGFLAG_CLIENT, ConShowChat, this, "Show chat"); Console()->Register("+show_chat", "", CFGFLAG_CLIENT, ConShowChat, this, "Show chat");
} }
bool CChat::OnInput(IInput::CEvent Event) bool CChat::OnInput(IInput::CEvent Event)
{ {
if(m_Mode == MODE_NONE) if(m_Mode == CHAT_NONE)
return false; return false;
if(Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key == KEY_ESCAPE) if(Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key == KEY_ESCAPE)
{ {
m_Mode = MODE_NONE; m_Mode = CHAT_NONE;
m_pClient->OnRelease(); m_pClient->OnRelease();
} }
else if(Event.m_Flags&IInput::FLAG_PRESS && (Event.m_Key == KEY_RETURN || Event.m_Key == KEY_KP_ENTER)) else if(Event.m_Flags&IInput::FLAG_PRESS && (Event.m_Key == KEY_RETURN || Event.m_Key == KEY_KP_ENTER))
@ -120,7 +148,7 @@ bool CChat::OnInput(IInput::CEvent Event)
if(m_LastChatSend+time_freq() < time_get()) if(m_LastChatSend+time_freq() < time_get())
{ {
Say(m_Mode == MODE_ALL ? 0 : 1, m_Input.GetString()); Say(m_Mode, m_Input.GetString());
AddEntry = true; AddEntry = true;
} }
else if(m_PendingChatCounter < 3) else if(m_PendingChatCounter < 3)
@ -132,12 +160,12 @@ bool CChat::OnInput(IInput::CEvent Event)
if(AddEntry) if(AddEntry)
{ {
CHistoryEntry *pEntry = m_History.Allocate(sizeof(CHistoryEntry)+m_Input.GetLength()); CHistoryEntry *pEntry = m_History.Allocate(sizeof(CHistoryEntry)+m_Input.GetLength());
pEntry->m_Team = m_Mode == MODE_ALL ? 0 : 1; pEntry->m_Mode = m_Mode;
mem_copy(pEntry->m_aText, m_Input.GetString(), m_Input.GetLength()+1); mem_copy(pEntry->m_aText, m_Input.GetString(), m_Input.GetLength()+1);
} }
} }
m_pHistoryEntry = 0x0; m_pHistoryEntry = 0x0;
m_Mode = MODE_NONE; m_Mode = CHAT_NONE;
m_pClient->OnRelease(); m_pClient->OnRelease();
} }
if(Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key == KEY_TAB) if(Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key == KEY_TAB)
@ -281,18 +309,14 @@ bool CChat::OnInput(IInput::CEvent Event)
} }
void CChat::EnableMode(int Team) void CChat::EnableMode(int Mode)
{ {
if(Client()->State() == IClient::STATE_DEMOPLAYBACK) if(Client()->State() == IClient::STATE_DEMOPLAYBACK)
return; return;
if(m_Mode == MODE_NONE) if(m_Mode == CHAT_NONE)
{ {
if(Team) m_Mode = Mode;
m_Mode = MODE_TEAM;
else
m_Mode = MODE_ALL;
m_Input.Clear(); m_Input.Clear();
Input()->Clear(); Input()->Clear();
m_CompletionChosen = -1; m_CompletionChosen = -1;
@ -304,11 +328,11 @@ void CChat::OnMessage(int MsgType, void *pRawMsg)
if(MsgType == NETMSGTYPE_SV_CHAT) if(MsgType == NETMSGTYPE_SV_CHAT)
{ {
CNetMsg_Sv_Chat *pMsg = (CNetMsg_Sv_Chat *)pRawMsg; CNetMsg_Sv_Chat *pMsg = (CNetMsg_Sv_Chat *)pRawMsg;
AddLine(pMsg->m_ClientID, pMsg->m_Team, pMsg->m_pMessage); AddLine(pMsg->m_ClientID, pMsg->m_Mode, pMsg->m_pMessage);
} }
} }
void CChat::AddLine(int ClientID, int Team, const char *pLine) void CChat::AddLine(int ClientID, int Mode, const char *pLine)
{ {
if(*pLine == 0 || (ClientID != -1 && (!g_Config.m_ClShowsocial || m_pClient->m_aClients[ClientID].m_aName[0] == '\0' || // unknown client if(*pLine == 0 || (ClientID != -1 && (!g_Config.m_ClShowsocial || m_pClient->m_aClients[ClientID].m_aName[0] == '\0' || // unknown client
m_pClient->m_aClients[ClientID].m_ChatIgnore || m_pClient->m_aClients[ClientID].m_ChatIgnore ||
@ -364,7 +388,7 @@ void CChat::AddLine(int ClientID, int Team, const char *pLine)
m_aLines[m_CurrentLine].m_YOffset[0] = -1.0f; m_aLines[m_CurrentLine].m_YOffset[0] = -1.0f;
m_aLines[m_CurrentLine].m_YOffset[1] = -1.0f; m_aLines[m_CurrentLine].m_YOffset[1] = -1.0f;
m_aLines[m_CurrentLine].m_ClientID = ClientID; m_aLines[m_CurrentLine].m_ClientID = ClientID;
m_aLines[m_CurrentLine].m_Team = Team; m_aLines[m_CurrentLine].m_Mode = Mode;
m_aLines[m_CurrentLine].m_NameColor = -2; m_aLines[m_CurrentLine].m_NameColor = -2;
// check for highlighted name // check for highlighted name
@ -376,7 +400,8 @@ void CChat::AddLine(int ClientID, int Team, const char *pLine)
Highlighted = true; Highlighted = true;
m_CompletionFav = ClientID; m_CompletionFav = ClientID;
} }
m_aLines[m_CurrentLine].m_Highlighted = Highlighted;
m_aLines[m_CurrentLine].m_Highlighted = Highlighted || Mode == CHAT_WHISPER;
if(ClientID == -1) // server message if(ClientID == -1) // server message
{ {
@ -401,8 +426,15 @@ void CChat::AddLine(int ClientID, int Team, const char *pLine)
} }
char aBuf[1024]; char aBuf[1024];
char aBufMode[32];
if(Mode == CHAT_WHISPER)
str_copy(aBufMode, "whisper", sizeof(aBufMode));
else if(Mode == CHAT_TEAM)
str_copy(aBufMode, "teamchat", sizeof(aBufMode));
else
str_copy(aBufMode, "chat", sizeof(aBufMode));
str_format(aBuf, sizeof(aBuf), "%s%s", m_aLines[m_CurrentLine].m_aName, m_aLines[m_CurrentLine].m_aText); str_format(aBuf, sizeof(aBuf), "%s%s", m_aLines[m_CurrentLine].m_aName, m_aLines[m_CurrentLine].m_aText);
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, m_aLines[m_CurrentLine].m_Team?"teamchat":"chat", aBuf, Highlighted); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, aBufMode, aBuf, Highlighted);
} }
// play sound // play sound
@ -443,7 +475,7 @@ void CChat::OnRender()
{ {
if(i == 0) if(i == 0)
{ {
Say(pEntry->m_Team, pEntry->m_aText); Say(pEntry->m_Mode, pEntry->m_aText);
break; break;
} }
} }
@ -458,7 +490,7 @@ void CChat::OnRender()
Graphics()->MapScreen(0.0f, 0.0f, Width, 300.0f); Graphics()->MapScreen(0.0f, 0.0f, Width, 300.0f);
float x = 5.0f; float x = 5.0f;
float y = 300.0f-20.0f; float y = 300.0f-20.0f;
if(m_Mode != MODE_NONE) if(m_Mode != CHAT_NONE)
{ {
// render chat input // render chat input
CTextCursor Cursor; CTextCursor Cursor;
@ -466,13 +498,17 @@ void CChat::OnRender()
Cursor.m_LineWidth = Width-190.0f; Cursor.m_LineWidth = Width-190.0f;
Cursor.m_MaxLines = 2; Cursor.m_MaxLines = 2;
if(m_Mode == MODE_ALL) char aBuf[32];
TextRender()->TextEx(&Cursor, Localize("All"), -1); if(m_Mode == CHAT_ALL)
else if(m_Mode == MODE_TEAM) str_copy(aBuf, Localize("All"), sizeof(aBuf));
TextRender()->TextEx(&Cursor, Localize("Team"), -1); else if(m_Mode == CHAT_TEAM)
str_copy(aBuf, Localize("Team"), sizeof(aBuf));
else if(m_Mode == CHAT_WHISPER)
str_format(aBuf, sizeof(aBuf), "%s %s", Localize("To"), m_pClient->m_aClients[m_WhisperTarget].m_aName);
else else
TextRender()->TextEx(&Cursor, Localize("Chat"), -1); str_copy(aBuf, Localize("Chat"), sizeof(aBuf));
TextRender()->TextEx(&Cursor, aBuf, -1);
TextRender()->TextEx(&Cursor, ": ", -1); TextRender()->TextEx(&Cursor, ": ", -1);
// check if the visible text has to be moved // check if the visible text has to be moved
@ -548,7 +584,7 @@ void CChat::OnRender()
// render name // render name
if(m_aLines[r].m_ClientID == -1) if(m_aLines[r].m_ClientID == -1)
TextRender()->TextColor(1.0f, 1.0f, 0.5f, Blend); // system TextRender()->TextColor(1.0f, 1.0f, 0.5f, Blend); // system
else if(m_aLines[r].m_Team) else if(m_aLines[r].m_Mode == CHAT_TEAM)
TextRender()->TextColor(0.45f, 0.9f, 0.45f, Blend); // team message TextRender()->TextColor(0.45f, 0.9f, 0.45f, Blend); // team message
else if(m_aLines[r].m_NameColor == TEAM_RED) else if(m_aLines[r].m_NameColor == TEAM_RED)
TextRender()->TextColor(1.0f, 0.5f, 0.5f, Blend); // red TextRender()->TextColor(1.0f, 0.5f, 0.5f, Blend); // red
@ -566,7 +602,7 @@ void CChat::OnRender()
TextRender()->TextColor(1.0f, 1.0f, 0.5f, Blend); // system TextRender()->TextColor(1.0f, 1.0f, 0.5f, Blend); // system
else if(m_aLines[r].m_Highlighted) else if(m_aLines[r].m_Highlighted)
TextRender()->TextColor(1.0f, 0.5f, 0.5f, Blend); // highlighted TextRender()->TextColor(1.0f, 0.5f, 0.5f, Blend); // highlighted
else if(m_aLines[r].m_Team) else if(m_aLines[r].m_Mode == CHAT_TEAM)
TextRender()->TextColor(0.65f, 1.0f, 0.65f, Blend); // team message TextRender()->TextColor(0.65f, 1.0f, 0.65f, Blend); // team message
else else
TextRender()->TextColor(1.0f, 1.0f, 1.0f, Blend); TextRender()->TextColor(1.0f, 1.0f, 1.0f, Blend);
@ -577,13 +613,14 @@ void CChat::OnRender()
TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f);
} }
void CChat::Say(int Team, const char *pLine) void CChat::Say(int Mode, const char *pLine)
{ {
m_LastChatSend = time_get(); m_LastChatSend = time_get();
// send chat message // send chat message
CNetMsg_Cl_Say Msg; CNetMsg_Cl_Say Msg;
Msg.m_Team = Team; Msg.m_Mode = Mode;
Msg.m_Target = Mode==CHAT_WHISPER ? m_WhisperTarget : -1;
Msg.m_pMessage = pLine; Msg.m_pMessage = pLine;
Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); Client()->SendPackMsg(&Msg, MSGFLAG_VITAL);
} }

View file

@ -20,7 +20,7 @@ class CChat : public CComponent
int64 m_Time; int64 m_Time;
float m_YOffset[2]; float m_YOffset[2];
int m_ClientID; int m_ClientID;
int m_Team; int m_Mode;
int m_NameColor; int m_NameColor;
char m_aName[64]; char m_aName[64];
char m_aText[512]; char m_aText[512];
@ -33,10 +33,6 @@ class CChat : public CComponent
// chat // chat
enum enum
{ {
MODE_NONE=0,
MODE_ALL,
MODE_TEAM,
CHAT_SERVER=0, CHAT_SERVER=0,
CHAT_HIGHLIGHT, CHAT_HIGHLIGHT,
CHAT_CLIENT, CHAT_CLIENT,
@ -44,6 +40,7 @@ class CChat : public CComponent
}; };
int m_Mode; int m_Mode;
int m_WhisperTarget;
bool m_Show; bool m_Show;
bool m_InputUpdate; bool m_InputUpdate;
int m_ChatStringOffset; int m_ChatStringOffset;
@ -57,7 +54,7 @@ class CChat : public CComponent
struct CHistoryEntry struct CHistoryEntry
{ {
int m_Team; int m_Mode;
char m_aText[1]; char m_aText[1];
}; };
CHistoryEntry *m_pHistoryEntry; CHistoryEntry *m_pHistoryEntry;
@ -68,13 +65,14 @@ class CChat : public CComponent
static void ConSay(IConsole::IResult *pResult, void *pUserData); static void ConSay(IConsole::IResult *pResult, void *pUserData);
static void ConSayTeam(IConsole::IResult *pResult, void *pUserData); static void ConSayTeam(IConsole::IResult *pResult, void *pUserData);
static void ConWhisper(IConsole::IResult *pResult, void *pUserData);
static void ConChat(IConsole::IResult *pResult, void *pUserData); static void ConChat(IConsole::IResult *pResult, void *pUserData);
static void ConShowChat(IConsole::IResult *pResult, void *pUserData); static void ConShowChat(IConsole::IResult *pResult, void *pUserData);
public: public:
CChat(); CChat();
bool IsActive() const { return m_Mode != MODE_NONE; } bool IsActive() const { return m_Mode != CHAT_NONE; }
void AddLine(int ClientID, int Team, const char *pLine); void AddLine(int ClientID, int Team, const char *pLine);

View file

@ -895,7 +895,8 @@ void CGameClient::OnNewSnapshot()
aMessage[MsgLen] = 0; aMessage[MsgLen] = 0;
CNetMsg_Cl_Say Msg; CNetMsg_Cl_Say Msg;
Msg.m_Team = random_int()&1; Msg.m_Mode = random_int()&1;
Msg.m_Target = -1;
Msg.m_pMessage = aMessage; Msg.m_pMessage = aMessage;
Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); Client()->SendPackMsg(&Msg, MSGFLAG_VITAL);
} }

View file

@ -190,51 +190,52 @@ void CGameContext::CreateSound(vec2 Pos, int Sound, int Mask)
} }
} }
void CGameContext::SendChat(int ChatterClientID, int Mode, int To, const char *pText)
void CGameContext::SendChatTarget(int To, const char *pText)
{
CNetMsg_Sv_Chat Msg;
Msg.m_Team = 0;
Msg.m_ClientID = -1;
Msg.m_pMessage = pText;
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, To);
}
void CGameContext::SendChat(int ChatterClientID, int Team, const char *pText)
{ {
char aBuf[256]; char aBuf[256];
if(ChatterClientID >= 0 && ChatterClientID < MAX_CLIENTS) if(ChatterClientID >= 0 && ChatterClientID < MAX_CLIENTS)
str_format(aBuf, sizeof(aBuf), "%d:%d:%s: %s", ChatterClientID, Team, Server()->ClientName(ChatterClientID), pText); str_format(aBuf, sizeof(aBuf), "%d:%d:%s: %s", ChatterClientID, Mode, Server()->ClientName(ChatterClientID), pText);
else else
str_format(aBuf, sizeof(aBuf), "*** %s", pText); str_format(aBuf, sizeof(aBuf), "*** %s", pText);
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, Team!=CHAT_ALL?"teamchat":"chat", aBuf);
if(Team == CHAT_ALL) char aBufMode[32];
{ if(Mode == CHAT_WHISPER)
CNetMsg_Sv_Chat Msg; str_copy(aBufMode, "whisper", sizeof(aBufMode));
Msg.m_Team = 0; else if(Mode == CHAT_TEAM)
Msg.m_ClientID = ChatterClientID; str_copy(aBufMode, "teamchat", sizeof(aBufMode));
Msg.m_pMessage = pText;
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1);
}
else else
{ str_copy(aBufMode, "chat", sizeof(aBufMode));
CNetMsg_Sv_Chat Msg;
Msg.m_Team = 1;
Msg.m_ClientID = ChatterClientID;
Msg.m_pMessage = pText;
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, aBufMode, aBuf);
CNetMsg_Sv_Chat Msg;
Msg.m_Mode = Mode;
Msg.m_ClientID = ChatterClientID;
Msg.m_pMessage = pText;
if(Mode == CHAT_ALL)
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1);
else if(Mode == CHAT_TEAM)
{
// pack one for the recording only // pack one for the recording only
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL|MSGFLAG_NOSEND, -1); Server()->SendPackMsg(&Msg, MSGFLAG_VITAL|MSGFLAG_NOSEND, -1);
To = m_apPlayers[ChatterClientID]->GetTeam();
// send to the clients // send to the clients
for(int i = 0; i < MAX_CLIENTS; i++) for(int i = 0; i < MAX_CLIENTS; i++)
{ {
if(m_apPlayers[i] && m_apPlayers[i]->GetTeam() == Team) if(m_apPlayers[i] && m_apPlayers[i]->GetTeam() == To)
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL|MSGFLAG_NORECORD, i); Server()->SendPackMsg(&Msg, MSGFLAG_VITAL|MSGFLAG_NORECORD, i);
} }
} }
else // Mode == CHAT_WHISPER
{
// send to the clients
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ChatterClientID);
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, To);
}
} }
void CGameContext::SendEmoticon(int ClientID, int Emoticon) void CGameContext::SendEmoticon(int ClientID, int Emoticon)
@ -714,7 +715,6 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
return; return;
CNetMsg_Cl_Say *pMsg = (CNetMsg_Cl_Say *)pRawMsg; CNetMsg_Cl_Say *pMsg = (CNetMsg_Cl_Say *)pRawMsg;
int Team = pMsg->m_Team ? pPlayer->GetTeam() : CGameContext::CHAT_ALL;
// trim right and set maximum length to 128 utf8-characters // trim right and set maximum length to 128 utf8-characters
int Length = 0; int Length = 0;
@ -751,13 +751,20 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
pPlayer->m_LastChat = Server()->Tick(); pPlayer->m_LastChat = Server()->Tick();
// don't allow spectators to disturb players during a running game in tournament mode // don't allow spectators to disturb players during a running game in tournament mode
int Mode = pMsg->m_Mode;
if((g_Config.m_SvTournamentMode == 2) && if((g_Config.m_SvTournamentMode == 2) &&
pPlayer->GetTeam() == TEAM_SPECTATORS && pPlayer->GetTeam() == TEAM_SPECTATORS &&
m_pController->IsGameRunning() && m_pController->IsGameRunning() &&
!Server()->IsAuthed(ClientID)) !Server()->IsAuthed(ClientID))
Team = TEAM_SPECTATORS; {
if(Mode != CHAT_WHISPER)
Mode = CHAT_TEAM;
else if(m_apPlayers[pMsg->m_Target] && m_apPlayers[pMsg->m_Target]->GetTeam() != TEAM_SPECTATORS)
Mode = CHAT_NONE;
}
SendChat(ClientID, Team, pMsg->m_pMessage); if(Mode != CHAT_NONE)
SendChat(ClientID, Mode, pMsg->m_Target, pMsg->m_pMessage);
} }
else if(MsgID == NETMSGTYPE_CL_CALLVOTE) else if(MsgID == NETMSGTYPE_CL_CALLVOTE)
{ {
@ -1078,7 +1085,7 @@ void CGameContext::ConRestart(IConsole::IResult *pResult, void *pUserData)
void CGameContext::ConSay(IConsole::IResult *pResult, void *pUserData) void CGameContext::ConSay(IConsole::IResult *pResult, void *pUserData)
{ {
CGameContext *pSelf = (CGameContext *)pUserData; CGameContext *pSelf = (CGameContext *)pUserData;
pSelf->SendChat(-1, CGameContext::CHAT_ALL, pResult->GetString(0)); pSelf->SendChat(-1, CHAT_ALL, -1, pResult->GetString(0));
} }
void CGameContext::ConSetTeam(IConsole::IResult *pResult, void *pUserData) void CGameContext::ConSetTeam(IConsole::IResult *pResult, void *pUserData)

View file

@ -130,18 +130,8 @@ public:
void CreateDeath(vec2 Pos, int Who); void CreateDeath(vec2 Pos, int Who);
void CreateSound(vec2 Pos, int Sound, int Mask=-1); void CreateSound(vec2 Pos, int Sound, int Mask=-1);
enum
{
CHAT_ALL=-2,
CHAT_SPEC=-1,
CHAT_RED=0,
CHAT_BLUE=1
};
// network // network
void SendChatTarget(int To, const char *pText); void SendChat(int ChatterClientID, int Mode, int To, const char *pText);
void SendChat(int ClientID, int Team, const char *pText);
void SendEmoticon(int ClientID, int Emoticon); void SendEmoticon(int ClientID, int Emoticon);
void SendWeaponPickup(int ClientID, int Weapon); void SendWeaponPickup(int ClientID, int Weapon);
void SendMotd(int ClientID); void SendMotd(int ClientID);