diff --git a/dlls/coop.cpp b/dlls/coop.cpp index b28e7c8e..e0680b2e 100644 --- a/dlls/coop.cpp +++ b/dlls/coop.cpp @@ -10,6 +10,96 @@ GlobalMenu g_GlobalMenu; struct SavedCoords g_SavedCoords, s_SavedCoords; +static float msglimittime1, msglimittime2; + + +void UTIL_CoopPlayerMessage( CBaseEntity *pPlayer, int channel, float time, unsigned int color1, unsigned int color2, float x, float y, const char *format, ... ) +{ + if( !pPlayer ) + return; + + hudtextparms_t params; + params.x = x, params.y = y; + params.fadeinTime = params.fadeoutTime = .5f; + params.holdTime = time; + params.r1 = (color1 >> 24) & 0xFF, params.g1 = (color1 >> 16) & 0xFF, params.b1 = (color1 >> 8) & 0xFF, params.a1 = color1 & 0xFF; + params.r2 = (color2 >> 24) & 0xFF, params.g2 = (color2 >> 16) & 0xFF, params.b2 = (color2 >> 8) & 0xFF, params.a2 = color2 & 0xFF; + params.channel = channel; + va_list argptr; + char string[256]; + + va_start( argptr, format ); + int len = vsnprintf( string, 256, format, argptr ); + va_end( argptr ); + string[len] = 0; + char *pstr = string; + + // set line breaks + for( int i = 0; *pstr; pstr++,i++ ) + { + if( *pstr == '\n' ) + i = 0; + if( i >= 79 ) + *pstr = '\n', i = 0; + } + + UTIL_HudMessage( pPlayer, params, string ); +} + +void UTIL_CoopHudMessage( int channel, float time, unsigned int color1, unsigned int color2, float x, float y, const char *format, ... ) +{ + if( gpGlobals->time < msglimittime1 ) + return; + msglimittime1 = gpGlobals->time + 0.4; + + hudtextparms_t params; + params.x = x, params.y = y; + params.fadeinTime = params.fadeoutTime = .5f; + params.holdTime = time; + params.r1 = (color1 >> 24) & 0xFF, params.g1 = (color1 >> 16) & 0xFF, params.b1 = (color1 >> 8) & 0xFF, params.a1 = color1 & 0xFF; + params.r2 = (color2 >> 24) & 0xFF, params.g2 = (color2 >> 16) & 0xFF, params.b2 = (color2 >> 8) & 0xFF, params.a2 = color2 & 0xFF; + params.channel = channel; + va_list argptr; + char string[256]; + + va_start( argptr, format ); + int len = vsnprintf( string, 256, format, argptr ); + va_end( argptr ); + string[len] = 0; + char *pstr = string; + + // set line breaks + for( int i = 0; *pstr; pstr++,i++ ) + { + if( *pstr == '\n' ) + i = 0; + if( i >= 79 ) + *pstr = '\n', i = 0; + } + + UTIL_HudMessageAll( params, string ); +} + +void UTIL_CoopPrintMessage( const char *format, ... ) +{ + if( gpGlobals->time < msglimittime2 ) + return; + msglimittime2 = gpGlobals->time + 0.4; + + va_list argptr; + char string[256]; + + va_start( argptr, format ); + int len = vsnprintf( string, 256, format, argptr ); + va_end( argptr ); + string[len] = 0; + + MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print + WRITE_BYTE( 3 ); // PRINT_CHAT + WRITE_STRING( string ); + MESSAGE_END(); +} + void UTIL_CleanSpawnPoint( Vector origin, float dist ) { @@ -196,6 +286,7 @@ void UTIL_CoopClearData( void ) SavedCoords l_SavedCoords = {0}; g_SavedCoords = l_SavedCoords; memset( &g_checkpoints, 0, sizeof( g_checkpoints ) ); + msglimittime1 = msglimittime2 = 0; } bool g_fPause; @@ -257,10 +348,7 @@ void GlobalMenu::Process( CBasePlayer *pPlayer, int imenu ) return; } m_iConfirm++; - MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print - WRITE_BYTE( 3 ); // PRINT_CHAT - WRITE_STRING( UTIL_VarArgs( "%s^7 confirmed map change\n", ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected")); - MESSAGE_END(); + UTIL_CoopPrintMessage( "%s^7 confirmed map change\n", UTIL_CoopPlayerName( pPlayer )); } if( imenu == 2 ) // cancel @@ -277,10 +365,7 @@ void GlobalMenu::Process( CBasePlayer *pPlayer, int imenu ) } break; case 2: // vote by request - MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print - WRITE_BYTE( 3 ); // PRINT_CHAT - WRITE_STRING( UTIL_VarArgs( "%s^7 selected ^3%s\n", ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected", maps[imenu - 1] )); - MESSAGE_END(); + UTIL_CoopPrintMessage( "%s^7 selected ^3%s\n", UTIL_CoopPlayerName( pPlayer ), maps[imenu - 1] ); if( imenu < m_iConfirm ) { @@ -347,10 +432,8 @@ void GlobalMenu::ConfirmMenu( CBasePlayer *pPlayer, CBaseEntity *trigger, const "Cancel", "BAN" }; - MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print - WRITE_BYTE( 3 ); // PRINT_CHAT - WRITE_STRING( UTIL_VarArgs( "%s^7 wants to change map ^1BACKWARDS\n", ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected")); - MESSAGE_END(); + + UTIL_CoopPrintMessage( "%s^7 wants to change map ^1BACK to %s\n", UTIL_CoopPlayerName( pPlayer ), mapname ); ShowGlobalMenu(UTIL_VarArgs("Confirm changing map BACK TO %s?", mapname), ARRAYSIZE(menu), menu); } @@ -381,15 +464,14 @@ void UTIL_CoopCheckpointMenu( CBasePlayer *pPlayer ) void UTIL_CoopNewCheckpoint( entvars_t *pevPlayer ) { + if( !pevPlayer->netname ) + return; memmove( &g_checkpoints[1], &g_checkpoints[0], sizeof ( g_checkpoints[0] ) * 3 ); g_checkpoints[0].time = gpGlobals->time; snprintf( g_checkpoints[0].str, 31, "%5s %d", STRING( pevPlayer->netname ), (int)( gpGlobals->time / 60 ) ); g_checkpoints[0].origin = pevPlayer->origin; g_checkpoints[0].angles = pevPlayer->angles; - MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print - WRITE_BYTE( 3 ); // PRINT_CHAT - WRITE_STRING( "New checkpoint availiable\n" ); - MESSAGE_END(); + UTIL_CoopPrintMessage( "New checkpoint by %s!\n", STRING( pevPlayer->netname ) ); } @@ -408,7 +490,7 @@ void UTIL_CoopVoteMenu( CBasePlayer *pPlayer ) } if( count < 4 ) { - ClientPrint( pPlayer->pev, HUD_PRINTCENTER, "Need at least 4 players to vote changelevel!\n" ); + UTIL_CoopPlayerMessage( pPlayer, 0, 5, 0xFFFFFFFF, 0xFFFFFFFF, -1, -1, "Need at least 4 players to vote changelevel!\n"); return; } g_GlobalMenu.VoteMenu(pPlayer); diff --git a/dlls/coop_util.h b/dlls/coop_util.h index 0be906c8..df290b29 100644 --- a/dlls/coop_util.h +++ b/dlls/coop_util.h @@ -71,6 +71,11 @@ Vector UTIL_FixupSpawnPoint(Vector spawn); void UTIL_CoopActivateChangeLevel( CBaseEntity *pTrigger ); void UTIL_CoopClearData( void ); void UTIL_CoopApplyData( void ); +void UTIL_CoopPrintMessage( const char *format, ... ); +void UTIL_CoopHudMessage( int channel, float time, unsigned int color1, unsigned int color2, float x, float y, const char *format, ... ); +void UTIL_CoopPlayerMessage( CBaseEntity *pPlayer, int channel, float time, unsigned int color1, unsigned int color2, float x, float y, const char *format, ... ); + + #ifdef PLAYER_H void UTIL_CoopKickPlayer(CBaseEntity *pPlayer); bool UTIL_CoopIsBadPlayer( CBaseEntity *plr ); diff --git a/dlls/triggers.cpp b/dlls/triggers.cpp index f45702f2..fa0c71c8 100644 --- a/dlls/triggers.cpp +++ b/dlls/triggers.cpp @@ -1526,10 +1526,7 @@ void GlobalMenu::VoteMenu( CBasePlayer *pPlayer ) m_iConfirm = i; m_iVoteCount = 0; m_pPlayer = pPlayer; - MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print - WRITE_BYTE( 3 ); // PRINT_CHAT - WRITE_STRING( UTIL_VarArgs( "%s^7 opened vote menu\n", ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected")); - MESSAGE_END(); + UTIL_CoopPrintMessage( "%s^7 opened vote menu\n", UTIL_CoopPlayerName( pPlayer ) ); ShowGlobalMenu(UTIL_VarArgs("%s requested to force change map", UTIL_CoopPlayerName( pPlayer ) ), i, maps); } @@ -1616,7 +1613,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator ) if( !strcmp( m_szMapName, mp_coop_disabledmap.string ) ) { - UTIL_HudMessageAll( params, UTIL_VarArgs( "MAP %S IS DISABLED", m_szMapName ) ); + UTIL_CoopPlayerMessage( pActivator, 0, 5, 0xFF000FF, 0xFFFF00FF, -1, -1, "MAP %S IS DISABLED", m_szMapName ); return; } // forget touch by some fool @@ -1687,16 +1684,13 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator ) if( pActivator && pActivator->IsPlayer() && m_flRepeatTimer - gpGlobals->time < -1 ) { CBasePlayer *pPlayer = (CBasePlayer*)pActivator; - MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print - WRITE_BYTE( 3 ); // PRINT_CHAT - WRITE_STRING( UTIL_VarArgs( "%s^7 trying activate changelevel too soon\n", ( pPlayer->pev->netname && STRING( pPlayer->pev->netname )[0] != 0 ) ? STRING( pPlayer->pev->netname ) : "unconnected")); - MESSAGE_END(); + UTIL_CoopPrintMessage("%s^7 trying activate changelevel too soon\n", UTIL_CoopPlayerName( pPlayer )); UTIL_CleanSpawnPoint( pPlayer->pev->origin, 50 ); m_flRepeatTimer = gpGlobals->time; pPlayer->m_iLocalConfirm = -2; } - UTIL_HudMessageAll( params, "Cannot change level: Not enough players!\nWait 30 sec before you may changelevel!" ); + UTIL_CoopHudMessage( 1, 5, 0xFF0000FF, 0xFF0000FF, 0, 0.7, "Cannot change level: Not enough players!\nWait 30 sec before you may changelevel!" ); return; } @@ -1706,9 +1700,10 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator ) i = 1; if( i ) - UTIL_HudMessageAll( params, UTIL_VarArgs( "%s touched end of map\nnext is %s %s, %d to go\n", - ( pActivator->pev->netname && STRING( pActivator->pev->netname )[0] != 0 ) ? STRING( pActivator->pev->netname ) : "unconnected", - st_szNextMap, st_szNextSpot, i ) ); + UTIL_CoopHudMessage( 1, 7, 0x00FFFFFF, 0xFF00FFFF, 0, 0, + "%s touched end of map\nnext is %s %s, %d to go\n", + UTIL_CoopPlayerName( pActivator ), + st_szNextMap, st_szNextSpot, i ); if( count2 ) { pev->rendercolor.x = count1 * 255 / count2; @@ -1807,10 +1802,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator ) } else ALERT( at_console, "Player is in the transition volume %s, changing level now\n", m_szLandmarkName ); - MESSAGE_BEGIN( MSG_ALL, 8, NULL ); // svc_print - WRITE_BYTE( 3 ); // PRINT_CHAT - WRITE_STRING( UTIL_VarArgs( "%s^7 activated changelevel, spawncheck is %d\n", UTIL_CoopPlayerName( pPlayer ), (int)!m_fSkipSpawnCheck ) ); - MESSAGE_END(); + UTIL_CoopPrintMessage( "%s^7 activated changelevel, spawncheck is %d\n", UTIL_CoopPlayerName( pPlayer ), (int)!m_fSkipSpawnCheck ); // This object will get removed in the call to CHANGE_LEVEL, copy the params into "safe" memory strcpy( st_szNextMap, m_szMapName );