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 ); }
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 ); }