/* * Cmd_Say_f */ void Cmd_Say_f( edict_t *ent, bool arg0, bool checkflood ) { char *p; char text[2048]; size_t arg0len = 0; #ifdef AUTHED_SAY if( sv_mm_enable->integer && ent->r.client && ent->r.client->mm_session <= 0 ) { // unauthed players are only allowed to chat to public at non play-time if( GS_MatchState() == MATCH_STATE_PLAYTIME ) { G_PrintMsg( ent, "%s", S_COLOR_YELLOW "You must authenticate to be able to communicate to other players during the match.\n"); return; } } #endif if( checkflood ) { if( CheckFlood( ent, false ) ) return; } if( ent->r.client && ( ent->r.client->muted & 1 ) ) return; if( trap_Cmd_Argc() < 2 && !arg0 ) return; text[0] = 0; if( arg0 ) { Q_strncatz( text, trap_Cmd_Argv( 0 ), sizeof( text ) ); Q_strncatz( text, " ", sizeof( text ) ); arg0len = strlen( text ); Q_strncatz( text, trap_Cmd_Args(), sizeof( text ) ); } else { p = trap_Cmd_Args(); if( *p == '"' ) { if( p[strlen( p )-1] == '"' ) p[strlen( p )-1] = 0; p++; } Q_strncatz( text, p, sizeof( text ) ); } // don't let text be too long for malicious reasons text[arg0len + (MAX_CHAT_BYTES - 1)] = 0; if( !Q_stricmp( text, "gg" ) || !Q_stricmp( text, "good game" ) ) G_AwardFairPlay( ent ); G_ChatMsg( NULL, ent, false, "%s", text ); }
/* * Cmd_Say_f */ void Cmd_Say_f( edict_t *ent, qboolean arg0, qboolean checkflood ) { char *p; char text[2048]; if( checkflood ) { if( CheckFlood( ent, qfalse ) ) return; } if( ent->r.client && ent->r.client->muted & 1 ) return; if( trap_Cmd_Argc() < 2 && !arg0 ) return; text[0] = 0; if( arg0 ) { Q_strncatz( text, trap_Cmd_Argv( 0 ), sizeof( text ) ); Q_strncatz( text, " ", sizeof( text ) ); Q_strncatz( text, trap_Cmd_Args(), sizeof( text ) ); } else { p = trap_Cmd_Args(); if( *p == '"' ) { if( p[strlen( p )-1] == '"' ) p[strlen( p )-1] = 0; p++; } Q_strncatz( text, p, sizeof( text ) ); } // don't let text be too long for malicious reasons if( strlen( text ) > 150 ) text[150] = 0; G_ChatMsg( NULL, ent, qfalse, "%s", text ); // racesow RS_ircSendMessage( va( "%s", COM_RemoveColorTokens(( ent->r.client->netname ) )), va( "%s", COM_RemoveColorTokens(( text)) ) ); // !racesow }
/* * Cmd_Say_f */ void Cmd_Say_f( edict_t *ent, bool arg0, bool checkflood ) { char *p; char text[2048]; if( checkflood ) { if( CheckFlood( ent, false ) ) return; } if( ent->r.client && ent->r.client->muted & 1 ) return; if( trap_Cmd_Argc() < 2 && !arg0 ) return; text[0] = 0; if( arg0 ) { Q_strncatz( text, trap_Cmd_Argv( 0 ), sizeof( text ) ); Q_strncatz( text, " ", sizeof( text ) ); Q_strncatz( text, trap_Cmd_Args(), sizeof( text ) ); } else { p = trap_Cmd_Args(); if( *p == '"' ) { if( p[strlen( p )-1] == '"' ) p[strlen( p )-1] = 0; p++; } Q_strncatz( text, p, sizeof( text ) ); } // don't let text be too long for malicious reasons if( strlen( text ) > 150 ) text[150] = 0; G_ChatMsg( NULL, ent, false, "%s", text ); }
void G_BOTvsay_f( edict_t *ent, const char *msg, bool team ) { edict_t *event = NULL; g_vsays_t *vsay; const char *text = NULL; if( !( ent->r.svflags & SVF_FAKECLIENT ) ) return; if( ent->r.client && ( ent->r.client->muted & 2 ) ) return; for( vsay = g_vsays; vsay->name; vsay++ ) { if( !Q_stricmp( msg, vsay->name ) ) { event = G_SpawnEvent( EV_VSAY, vsay->id, NULL ); text = vsay->message; break; } } if( event && text ) { event->r.svflags |= SVF_BROADCAST; // force sending even when not in PVS event->s.ownerNum = ent->s.number; if( team ) { event->s.team = ent->s.team; event->r.svflags |= SVF_ONLYTEAM; // send only to clients with the same ->s.team value } if( team ) G_Say_Team( ent, va( "(v) %s", text ), false ); else G_ChatMsg( NULL, ent, false, "(v) %s", text ); } }
/* * G_vsay_f */ static void G_vsay_f( edict_t *ent, bool team ) { edict_t *event = NULL; g_vsays_t *vsay; const char *text = NULL; char *msg = trap_Cmd_Argv( 1 ); if( ent->r.client && ent->r.client->muted & 2 ) return; if( ( !GS_TeamBasedGametype() || GS_InvidualGameType() ) && ent->s.team != TEAM_SPECTATOR ) team = false; if( !( ent->r.svflags & SVF_FAKECLIENT ) ) { // ignore flood checks on bots if( ent->r.client->level.last_vsay > game.realtime - 500 ) return; // ignore silently vsays in that come in rapid succession ent->r.client->level.last_vsay = game.realtime; if( CheckFlood( ent, false ) ) return; } for( vsay = g_vsays; vsay->name; vsay++ ) { if( !Q_stricmp( msg, vsay->name ) ) { event = G_SpawnEvent( EV_VSAY, vsay->id, NULL ); text = vsay->message; break; } } if( event && text ) { char saystring[256]; event->r.svflags |= SVF_BROADCAST; // force sending even when not in PVS event->s.ownerNum = ent->s.number; if( team ) { event->s.team = ent->s.team; event->r.svflags |= SVF_ONLYTEAM; // send only to clients with the same ->s.team value } if( trap_Cmd_Argc() > 2 ) { int i; saystring[0] = 0; for( i = 2; i < trap_Cmd_Argc(); i++ ) { Q_strncatz( saystring, trap_Cmd_Argv( i ), sizeof( saystring ) ); Q_strncatz( saystring, " ", sizeof( saystring ) ); } text = saystring; } if( team ) G_Say_Team( ent, va( "(v) %s", text ), false ); else G_ChatMsg( NULL, ent, false, "(v) %s", text ); return; } // unknown token, print help { char string[MAX_STRING_CHARS]; // print information string[0] = 0; if( msg && msg[0] != '\0' ) Q_strncatz( string, va( "%sUnknown vsay token%s \"%s\"\n", S_COLOR_YELLOW, S_COLOR_WHITE, msg ), sizeof( string ) ); Q_strncatz( string, va( "%svsays:%s\n", S_COLOR_YELLOW, S_COLOR_WHITE ), sizeof( string ) ); for( vsay = g_vsays; vsay->name; vsay++ ) { if( strlen( vsay->name ) + strlen( string ) < sizeof( string ) - 6 ) { Q_strncatz( string, va( "%s ", vsay->name ), sizeof( string ) ); } } Q_strncatz( string, "\n", sizeof( string ) ); G_PrintMsg( ent, string ); } }
void G_Say_Team( edict_t *who, char *msg, bool checkflood ) { char outmsg[256]; char buf[256]; char *p; char current_color[3]; if( who->s.team != TEAM_SPECTATOR && ( !GS_TeamBasedGametype() || GS_InvidualGameType() ) ) { Cmd_Say_f( who, false, true ); return; } if( checkflood ) { if( CheckFlood( who, true ) ) return; } if( *msg == '\"' ) { msg[strlen( msg ) - 1] = 0; msg++; } if( who->s.team == TEAM_SPECTATOR ) { // if speccing, also check for non-team flood if( checkflood ) { if( CheckFlood( who, false ) ) return; } G_ChatMsg( NULL, who, true, "%s", msg ); return; } #ifdef AUTHED_SAY if( sv_mm_enable->integer && who->r.client && who->r.client->mm_session <= 0 ) { // unauthed players are only allowed to chat to public at non play-time // they are allowed to team-chat at any time if( GS_MatchState() == MATCH_STATE_PLAYTIME ) { G_PrintMsg( who, "%s", S_COLOR_YELLOW "You must authenticate to be able to chat with other players during the match.\n"); return; } } #endif Q_strncpyz( current_color, S_COLOR_WHITE, sizeof( current_color ) ); memset( outmsg, 0, sizeof( outmsg ) ); UpdatePoint( who ); for( p = outmsg; *msg && (size_t)( p - outmsg ) < sizeof( outmsg ) - 3; msg++ ) { if( *msg == '%' ) { buf[0] = 0; switch( *++msg ) { case 'l': Say_Team_Location( who, buf, sizeof( buf ), current_color ); break; case 'a': Say_Team_Armor( who, buf, sizeof( buf ), current_color ); break; case 'h': Say_Team_Health( who, buf, sizeof( buf ), current_color ); break; case 'b': Say_Team_Best_Weapons( who, buf, sizeof( buf ), current_color ); break; case 'w': Say_Team_Current_Weapon( who, buf, sizeof( buf ), current_color ); break; case 'x': Say_Team_Point( who, buf, sizeof( buf ), current_color ); break; case 'y': Say_Team_Point_Location( who, buf, sizeof( buf ), current_color ); break; case 'X': Say_Team_Pickup( who, buf, sizeof( buf ), current_color ); break; case 'Y': Say_Team_Pickup_Location( who, buf, sizeof( buf ), current_color ); break; case 'd': Say_Team_Drop( who, buf, sizeof( buf ), current_color ); break; case 'D': Say_Team_Drop_Location( who, buf, sizeof( buf ), current_color ); break; case '%': *p++ = *msg; break; default: // Maybe add a warning here? *p++ = '%'; *p++ = *msg; break; } if( strlen( buf ) + ( p - outmsg ) < sizeof( outmsg ) - 3 ) { Q_strncatz( outmsg, buf, sizeof( outmsg ) ); p += strlen( buf ); } } else if( *msg == '^' ) { *p++ = *msg++; *p++ = *msg; Q_strncpyz( current_color, p-2, sizeof( current_color ) ); } else { *p++ = *msg; } } *p = 0; G_ChatMsg( NULL, who, true, "%s", outmsg ); }
/* * Cmd_ConsoleSay_f */ static void Cmd_ConsoleSay_f( void ) { G_ChatMsg( NULL, NULL, false, "%s", trap_Cmd_Args() ); }
void G_Say_Team( edict_t *who, char *msg, bool checkflood ) { char outmsg[256]; char buf[256]; char *p; char current_color[3]; if( who->s.team != TEAM_SPECTATOR && ( !GS_TeamBasedGametype() || GS_InvidualGameType() ) ) { Cmd_Say_f( who, false, true ); return; } if( checkflood ) { if( CheckFlood( who, true ) ) return; } if( *msg == '\"' ) { msg[strlen( msg ) - 1] = 0; msg++; } if( who->s.team == TEAM_SPECTATOR ) { // if speccing, also check for non-team flood if( checkflood ) { if( CheckFlood( who, false ) ) return; } G_ChatMsg( NULL, who, true, "%s", msg ); return; } Q_strncpyz( current_color, S_COLOR_WHITE, sizeof( current_color ) ); memset( outmsg, 0, sizeof( outmsg ) ); UpdatePoint( who ); for( p = outmsg; *msg && (size_t)( p - outmsg ) < sizeof( outmsg ) - 3; msg++ ) { if( *msg == '%' ) { buf[0] = 0; switch( *++msg ) { case 'l': Say_Team_Location( who, buf, sizeof( buf ), current_color ); break; case 'a': Say_Team_Armor( who, buf, sizeof( buf ), current_color ); break; case 'h': Say_Team_Health( who, buf, sizeof( buf ), current_color ); break; case 'b': Say_Team_Best_Weapons( who, buf, sizeof( buf ), current_color ); break; case 'w': Say_Team_Current_Weapon( who, buf, sizeof( buf ), current_color ); break; case 'x': Say_Team_Point( who, buf, sizeof( buf ), current_color ); break; case 'y': Say_Team_Point_Location( who, buf, sizeof( buf ), current_color ); break; case 'X': Say_Team_Pickup( who, buf, sizeof( buf ), current_color ); break; case 'Y': Say_Team_Pickup_Location( who, buf, sizeof( buf ), current_color ); break; case 'd': Say_Team_Drop( who, buf, sizeof( buf ), current_color ); break; case 'D': Say_Team_Drop_Location( who, buf, sizeof( buf ), current_color ); break; case '%': *p++ = *msg; break; default: // Maybe add a warning here? *p++ = '%'; *p++ = *msg; break; } if( strlen( buf ) + ( p - outmsg ) < sizeof( outmsg ) - 3 ) { Q_strncatz( outmsg, buf, sizeof( outmsg ) ); p += strlen( buf ); } } else if( *msg == '^' ) { *p++ = *msg++; *p++ = *msg; Q_strncpyz( current_color, p-2, sizeof( current_color ) ); } else { *p++ = *msg; } } *p = 0; G_ChatMsg( NULL, who, true, "%s", outmsg ); }