summaryrefslogtreecommitdiff
path: root/mod/src/cgame/cg_servercmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'mod/src/cgame/cg_servercmds.c')
-rw-r--r--mod/src/cgame/cg_servercmds.c1130
1 files changed, 0 insertions, 1130 deletions
diff --git a/mod/src/cgame/cg_servercmds.c b/mod/src/cgame/cg_servercmds.c
deleted file mode 100644
index 71fbaac9..00000000
--- a/mod/src/cgame/cg_servercmds.c
+++ /dev/null
@@ -1,1130 +0,0 @@
-// Copyright (C) 1999-2000 Id Software, Inc.
-//
-// cg_servercmds.c -- reliably sequenced text commands sent by the server
-// these are processed at snapshot transition time, so there will definately
-// be a valid snapshot this frame
-
-/*
- * Portions Copyright (C) 2000-2001 Tim Angus
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the OSML - Open Source Modification License v1.0 as
- * described in the file COPYING which is distributed with this source
- * code.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#include "cg_local.h"
-
-/*
-=================
-CG_ParseScores
-
-=================
-*/
-static void CG_ParseScores( void )
-{
- int i;
-
- cg.numScores = atoi( CG_Argv( 1 ) );
-
- if( cg.numScores > MAX_CLIENTS )
- cg.numScores = MAX_CLIENTS;
-
- cg.teamScores[ 0 ] = atoi( CG_Argv( 2 ) );
- cg.teamScores[ 1 ] = atoi( CG_Argv( 3 ) );
-
- memset( cg.scores, 0, sizeof( cg.scores ) );
-
- if( cg_debugRandom.integer )
- CG_Printf( "cg.numScores: %d\n", cg.numScores );
-
- for( i = 0; i < cg.numScores; i++ )
- {
- //
- cg.scores[ i ].client = atoi( CG_Argv( i * 6 + 4 ) );
- cg.scores[ i ].score = atoi( CG_Argv( i * 6 + 5 ) );
- cg.scores[ i ].ping = atoi( CG_Argv( i * 6 + 6 ) );
- cg.scores[ i ].time = atoi( CG_Argv( i * 6 + 7 ) );
- cg.scores[ i ].weapon = atoi( CG_Argv( i * 6 + 8 ) );
- cg.scores[ i ].upgrade = atoi( CG_Argv( i * 6 + 9 ) );
-
- if( cg.scores[ i ].client < 0 || cg.scores[ i ].client >= MAX_CLIENTS )
- cg.scores[ i ].client = 0;
-
- cgs.clientinfo[ cg.scores[ i ].client ].score = cg.scores[ i ].score;
- cgs.clientinfo[ cg.scores[ i ].client ].powerups = 0;
-
- cg.scores[ i ].team = cgs.clientinfo[ cg.scores[ i ].client ].team;
- }
-}
-
-/*
-=================
-CG_ParseTeamInfo
-
-=================
-*/
-static void CG_ParseTeamInfo( void )
-{
- int i;
- int client;
-
- numSortedTeamPlayers = atoi( CG_Argv( 1 ) );
-
- for( i = 0; i < numSortedTeamPlayers; i++ )
- {
- client = atoi( CG_Argv( i * 6 + 2 ) );
-
- sortedTeamPlayers[ i ] = client;
-
- cgs.clientinfo[ client ].location = atoi( CG_Argv( i * 6 + 3 ) );
- cgs.clientinfo[ client ].health = atoi( CG_Argv( i * 6 + 4 ) );
- cgs.clientinfo[ client ].armor = atoi( CG_Argv( i * 6 + 5 ) );
- cgs.clientinfo[ client ].curWeapon = atoi( CG_Argv( i * 6 + 6 ) );
- cgs.clientinfo[ client ].powerups = atoi( CG_Argv( i * 6 + 7 ) );
- }
-}
-
-
-/*
-================
-CG_ParseServerinfo
-
-This is called explicitly when the gamestate is first received,
-and whenever the server updates any serverinfo flagged cvars
-================
-*/
-void CG_ParseServerinfo( void )
-{
- const char *info;
- char *mapname;
-
- info = CG_ConfigString( CS_SERVERINFO );
- cgs.dmflags = atoi( Info_ValueForKey( info, "dmflags" ) );
- cgs.teamflags = atoi( Info_ValueForKey( info, "teamflags" ) );
- cgs.timelimit = atoi( Info_ValueForKey( info, "timelimit" ) );
- cgs.maxclients = atoi( Info_ValueForKey( info, "sv_maxclients" ) );
- mapname = Info_ValueForKey( info, "mapname" );
- Com_sprintf( cgs.mapname, sizeof( cgs.mapname ), "maps/%s.bsp", mapname );
-}
-
-/*
-==================
-CG_ParseWarmup
-==================
-*/
-static void CG_ParseWarmup( void )
-{
- const char *info;
- int warmup;
-
- info = CG_ConfigString( CS_WARMUP );
-
- warmup = atoi( info );
- cg.warmupCount = -1;
-
- if( warmup == 0 && cg.warmup )
- {
- }
-
- cg.warmup = warmup;
-}
-
-/*
-================
-CG_SetConfigValues
-
-Called on load to set the initial values from configure strings
-================
-*/
-void CG_SetConfigValues( void )
-{
- cgs.scores1 = atoi( CG_ConfigString( CS_SCORES1 ) );
- cgs.scores2 = atoi( CG_ConfigString( CS_SCORES2 ) );
-
- sscanf( CG_ConfigString( CS_BUILDPOINTS ),
- "%d %d %d %d %d", &cgs.alienBuildPoints,
- &cgs.alienBuildPointsTotal,
- &cgs.humanBuildPoints,
- &cgs.humanBuildPointsTotal,
- &cgs.humanBuildPointsPowered );
-
- sscanf( CG_ConfigString( CS_STAGES ), "%d %d %d %d %d %d", &cgs.alienStage, &cgs.humanStage,
- &cgs.alienKills, &cgs.humanKills, &cgs.alienNextStageThreshold, &cgs.humanNextStageThreshold );
- sscanf( CG_ConfigString( CS_SPAWNS ), "%d %d", &cgs.numAlienSpawns, &cgs.numHumanSpawns );
-
- cgs.levelStartTime = atoi( CG_ConfigString( CS_LEVEL_START_TIME ) );
- cg.warmup = atoi( CG_ConfigString( CS_WARMUP ) );
-}
-
-
-/*
-=====================
-CG_ShaderStateChanged
-=====================
-*/
-void CG_ShaderStateChanged( void )
-{
- char originalShader[ MAX_QPATH ];
- char newShader[ MAX_QPATH ];
- char timeOffset[ 16 ];
- const char *o;
- char *n, *t;
-
- o = CG_ConfigString( CS_SHADERSTATE );
-
- while( o && *o )
- {
- n = strstr( o, "=" );
-
- if( n && *n )
- {
- strncpy( originalShader, o, n - o );
- originalShader[ n - o ] = 0;
- n++;
- t = strstr( n, ":" );
-
- if( t && *t )
- {
- strncpy( newShader, n, t - n );
- newShader[ t - n ] = 0;
- }
- else
- break;
-
- t++;
- o = strstr( t, "@" );
-
- if( o )
- {
- strncpy( timeOffset, t, o - t );
- timeOffset[ o - t ] = 0;
- o++;
- trap_R_RemapShader( originalShader, newShader, timeOffset );
- }
- }
- else
- break;
- }
-}
-
-/*
-================
-CG_AnnounceAlienStageTransistion
-================
-*/
-static void CG_AnnounceAlienStageTransistion( stage_t from, stage_t to )
-{
- if( cg.predictedPlayerState.stats[ STAT_PTEAM ] != PTE_ALIENS )
- return;
-
- trap_S_StartLocalSound( cgs.media.alienStageTransition, CHAN_ANNOUNCER );
- CG_CenterPrint( "We have evolved!", 200, GIANTCHAR_WIDTH * 4 );
-}
-
-/*
-================
-CG_AnnounceHumanStageTransistion
-================
-*/
-static void CG_AnnounceHumanStageTransistion( stage_t from, stage_t to )
-{
- if( cg.predictedPlayerState.stats[ STAT_PTEAM ] != PTE_HUMANS )
- return;
-
- trap_S_StartLocalSound( cgs.media.humanStageTransition, CHAN_ANNOUNCER );
- CG_CenterPrint( "Reinforcements have arrived!", 200, GIANTCHAR_WIDTH * 4 );
-}
-
-/*
-================
-CG_ConfigStringModified
-
-================
-*/
-static void CG_ConfigStringModified( void )
-{
- const char *str;
- int num;
-
- num = atoi( CG_Argv( 1 ) );
-
- // get the gamestate from the client system, which will have the
- // new configstring already integrated
- trap_GetGameState( &cgs.gameState );
-
- // look up the individual string that was modified
- str = CG_ConfigString( num );
-
- // do something with it if necessary
- if( num == CS_MUSIC )
- CG_StartMusic( );
- else if( num == CS_SERVERINFO )
- CG_ParseServerinfo( );
- else if( num == CS_WARMUP )
- CG_ParseWarmup( );
- else if( num == CS_SCORES1 )
- cgs.scores1 = atoi( str );
- else if( num == CS_SCORES2 )
- cgs.scores2 = atoi( str );
- else if( num == CS_BUILDPOINTS )
- sscanf( str, "%d %d %d %d %d", &cgs.alienBuildPoints,
- &cgs.alienBuildPointsTotal,
- &cgs.humanBuildPoints,
- &cgs.humanBuildPointsTotal,
- &cgs.humanBuildPointsPowered );
- else if( num == CS_STAGES )
- {
- stage_t oldAlienStage = cgs.alienStage;
- stage_t oldHumanStage = cgs.humanStage;
-
- sscanf( str, "%d %d %d %d %d %d",
- &cgs.alienStage, &cgs.humanStage,
- &cgs.alienKills, &cgs.humanKills,
- &cgs.alienNextStageThreshold, &cgs.humanNextStageThreshold );
-
- if( cgs.alienStage != oldAlienStage )
- CG_AnnounceAlienStageTransistion( oldAlienStage, cgs.alienStage );
-
- if( cgs.humanStage != oldHumanStage )
- CG_AnnounceHumanStageTransistion( oldHumanStage, cgs.humanStage );
- }
- else if( num == CS_SPAWNS )
- sscanf( str, "%d %d", &cgs.numAlienSpawns, &cgs.numHumanSpawns );
- else if( num == CS_LEVEL_START_TIME )
- cgs.levelStartTime = atoi( str );
- else if( num == CS_VOTE_TIME )
- {
- cgs.voteTime = atoi( str );
- cgs.voteModified = qtrue;
-
- if( cgs.voteTime )
- trap_Cvar_Set( "ui_voteActive", "1" );
- else
- trap_Cvar_Set( "ui_voteActive", "0" );
- }
- else if( num == CS_VOTE_YES )
- {
- cgs.voteYes = atoi( str );
- cgs.voteModified = qtrue;
- }
- else if( num == CS_VOTE_NO )
- {
- cgs.voteNo = atoi( str );
- cgs.voteModified = qtrue;
- }
- else if( num == CS_VOTE_STRING )
- Q_strncpyz( cgs.voteString, str, sizeof( cgs.voteString ) );
- else if( num >= CS_TEAMVOTE_TIME && num <= CS_TEAMVOTE_TIME + 1 )
- {
- int cs_offset = num - CS_TEAMVOTE_TIME;
-
- cgs.teamVoteTime[ cs_offset ] = atoi( str );
- cgs.teamVoteModified[ cs_offset ] = qtrue;
-
- if( cs_offset == 0 )
- {
- if( cgs.teamVoteTime[ cs_offset ] )
- trap_Cvar_Set( "ui_humanTeamVoteActive", "1" );
- else
- trap_Cvar_Set( "ui_humanTeamVoteActive", "0" );
- }
- else if( cs_offset == 1 )
- {
- if( cgs.teamVoteTime[ cs_offset ] )
- trap_Cvar_Set( "ui_alienTeamVoteActive", "1" );
- else
- trap_Cvar_Set( "ui_alienTeamVoteActive", "0" );
- }
- }
- else if( num >= CS_TEAMVOTE_YES && num <= CS_TEAMVOTE_YES + 1 )
- {
- cgs.teamVoteYes[ num - CS_TEAMVOTE_YES ] = atoi( str );
- cgs.teamVoteModified[ num - CS_TEAMVOTE_YES ] = qtrue;
- }
- else if( num >= CS_TEAMVOTE_NO && num <= CS_TEAMVOTE_NO + 1 )
- {
- cgs.teamVoteNo[ num - CS_TEAMVOTE_NO ] = atoi( str );
- cgs.teamVoteModified[ num - CS_TEAMVOTE_NO ] = qtrue;
- }
- else if( num >= CS_TEAMVOTE_STRING && num <= CS_TEAMVOTE_STRING + 1 )
- Q_strncpyz( cgs.teamVoteString[ num - CS_TEAMVOTE_STRING ], str, sizeof( cgs.teamVoteString ) );
- else if( num == CS_INTERMISSION )
- cg.intermissionStarted = atoi( str );
- else if( num >= CS_MODELS && num < CS_MODELS+MAX_MODELS )
- cgs.gameModels[ num - CS_MODELS ] = trap_R_RegisterModel( str );
- else if( num >= CS_SHADERS && num < CS_SHADERS+MAX_SHADERS )
- cgs.gameShaders[ num - CS_SHADERS ] = trap_R_RegisterShader( str );
- else if( num >= CS_PARTICLE_SYSTEMS && num < CS_PARTICLE_SYSTEMS+MAX_GAME_PARTICLE_SYSTEMS )
- cgs.gameParticleSystems[ num - CS_PARTICLE_SYSTEMS ] = CG_RegisterParticleSystem( (char *)str );
- else if( num >= CS_SOUNDS && num < CS_SOUNDS+MAX_SOUNDS )
- {
- if( str[ 0 ] != '*' )
- { // player specific sounds don't register here
- cgs.gameSounds[ num - CS_SOUNDS ] = trap_S_RegisterSound( str, qfalse );
- }
- }
- else if( num >= CS_PLAYERS && num < CS_PLAYERS+MAX_CLIENTS )
- {
- CG_NewClientInfo( num - CS_PLAYERS );
- CG_BuildSpectatorString( );
- }
- else if( num == CS_FLAGSTATUS )
- {
- }
- else if( num == CS_SHADERSTATE )
- {
- CG_ShaderStateChanged( );
- }
-}
-
-
-/*
-=======================
-CG_AddToTeamChat
-
-=======================
-*/
-static void CG_AddToTeamChat( const char *str )
-{
- int len;
- char *p, *ls;
- int lastcolor;
- int chatHeight;
-
- if( cg_teamChatHeight.integer < TEAMCHAT_HEIGHT )
- chatHeight = cg_teamChatHeight.integer;
- else
- chatHeight = TEAMCHAT_HEIGHT;
-
- if( chatHeight <= 0 || cg_teamChatTime.integer <= 0 )
- {
- // team chat disabled, dump into normal chat
- cgs.teamChatPos = cgs.teamLastChatPos = 0;
- return;
- }
-
- len = 0;
-
- p = cgs.teamChatMsgs[cgs.teamChatPos % chatHeight];
- *p = 0;
-
- lastcolor = '7';
-
- ls = NULL;
- while( *str )
- {
- if( len > TEAMCHAT_WIDTH - 1 )
- {
- if( ls )
- {
- str -= ( p - ls );
- str++;
- p -= ( p - ls );
- }
-
- *p = 0;
-
- cgs.teamChatMsgTimes[ cgs.teamChatPos % chatHeight ] = cg.time;
-
- cgs.teamChatPos++;
- p = cgs.teamChatMsgs[ cgs.teamChatPos % chatHeight ];
- *p = 0;
- *p++ = Q_COLOR_ESCAPE;
- *p++ = lastcolor;
- len = 0;
- ls = NULL;
- }
-
- if( Q_IsColorString( str ) )
- {
- *p++ = *str++;
- lastcolor = *str;
- *p++ = *str++;
- continue;
- }
-
- if( *str == ' ' )
- ls = p;
-
- *p++ = *str++;
- len++;
- }
- *p = 0;
-
- cgs.teamChatMsgTimes[ cgs.teamChatPos % chatHeight ] = cg.time;
- cgs.teamChatPos++;
-
- if( cgs.teamChatPos - cgs.teamLastChatPos > chatHeight )
- cgs.teamLastChatPos = cgs.teamChatPos - chatHeight;
-}
-
-
-
-/*
-===============
-CG_MapRestart
-
-The server has issued a map_restart, so the next snapshot
-is completely new and should not be interpolated to.
-
-A tournement restart will clear everything, but doesn't
-require a reload of all the media
-===============
-*/
-static void CG_MapRestart( void )
-{
- if( cg_showmiss.integer )
- CG_Printf( "CG_MapRestart\n" );
-
- CG_InitMarkPolys( );
-
- // make sure the "3 frags left" warnings play again
- cg.fraglimitWarnings = 0;
-
- cg.timelimitWarnings = 0;
-
- cg.intermissionStarted = qfalse;
-
- cgs.voteTime = 0;
-
- cg.mapRestart = qtrue;
-
- CG_StartMusic( );
-
- trap_S_ClearLoopingSounds( qtrue );
-
- // we really should clear more parts of cg here and stop sounds
-
- // play the "fight" sound if this is a restart without warmup
- if( cg.warmup == 0 )
- CG_CenterPrint( "FIGHT!", 120, GIANTCHAR_WIDTH * 2 );
-
- trap_Cvar_Set( "cg_thirdPerson", "0" );
-}
-
-/*
-=================
-CG_RemoveChatEscapeChar
-=================
-*/
-static void CG_RemoveChatEscapeChar( char *text )
-{
- int i, l;
-
- l = 0;
- for( i = 0; text[ i ]; i++ )
- {
- if( text[ i ] == '\x19' )
- continue;
-
- text[ l++ ] = text[ i ];
- }
-
- text[ l ] = '\0';
-}
-
-/*
-===============
-CG_SetUIVars
-
-Set some cvars used by the UI
-===============
-*/
-static void CG_SetUIVars( void )
-{
- int i;
- char carriageCvar[ MAX_TOKEN_CHARS ];
-
- *carriageCvar = 0;
-
- //determine what the player is carrying
- for( i = WP_NONE + 1; i < WP_NUM_WEAPONS; i++ )
- {
- if( BG_InventoryContainsWeapon( i, cg.snap->ps.stats ) &&
- BG_FindPurchasableForWeapon( i ) )
- strcat( carriageCvar, va( "W%d ", i ) );
- }
- for( i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++ )
- {
- if( BG_InventoryContainsUpgrade( i, cg.snap->ps.stats ) &&
- BG_FindPurchasableForUpgrade( i ) )
- strcat( carriageCvar, va( "U%d ", i ) );
- }
- strcat( carriageCvar, "$" );
-
- trap_Cvar_Set( "ui_carriage", carriageCvar );
-
- trap_Cvar_Set( "ui_stages", va( "%d %d", cgs.alienStage, cgs.humanStage ) );
-}
-
-
-/*
-==============
-CG_Menu
-==============
-*/
-void CG_Menu( int menu )
-{
- CG_SetUIVars( );
-
- switch( menu )
- {
- case MN_TEAM: trap_SendConsoleCommand( "menu tremulous_teamselect\n" ); break;
- case MN_A_CLASS: trap_SendConsoleCommand( "menu tremulous_alienclass\n" ); break;
- case MN_H_SPAWN: trap_SendConsoleCommand( "menu tremulous_humanitem\n" ); break;
- case MN_A_BUILD: trap_SendConsoleCommand( "menu tremulous_alienbuild\n" ); break;
- case MN_H_BUILD: trap_SendConsoleCommand( "menu tremulous_humanbuild\n" ); break;
- case MN_H_ARMOURY: trap_SendConsoleCommand( "menu tremulous_humanarmoury\n" ); break;
-
- case MN_A_TEAMFULL:
- trap_Cvar_Set( "ui_dialog", "The alien team has too many players. Please wait until "
- "slots become available or join the human team." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- break;
-
- case MN_H_TEAMFULL:
- trap_Cvar_Set( "ui_dialog", "The human team has too many players. Please wait until "
- "slots become available or join the alien team." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- break;
-
- case MN_H_NOROOM:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There is no room to build here. Move until the buildable turns "
- "translucent green indicating a valid build location." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "There is no room to build here\n" );
-
- break;
-
- case MN_H_NOPOWER:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There is no power remaining. Free up power by destroying existing "
- "buildable objects." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "There is no power remaining\n" );
-
- break;
-
- case MN_H_NOTPOWERED:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "This buildable is not powered. Build a Reactor and/or Repeater in "
- "order to power it." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "This buildable is not powered\n" );
-
- break;
-
- case MN_H_NORMAL:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "Cannot build on this surface. The surface is too steep or unsuitable "
- "to build on. Please choose another site for this structure." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "Cannot build on this surface\n" );
-
- break;
-
- case MN_H_REACTOR:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There can only be one Reactor. Destroy the existing one if you "
- "wish to move it." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "There can only be one Reactor\n" );
-
- break;
-
- case MN_H_REPEATER:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There is no power here. If available, a Repeater may be used to "
- "transmit power to this location." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "There is no power here\n" );
-
- break;
-
- case MN_H_NODCC:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There is no Defense Computer. A Defense Computer is needed to build "
- "this." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "There is no Defense Computer\n" );
-
- break;
-
- case MN_H_TNODEWARN:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "WARNING: This Telenode will not be powered. Build near a power "
- "structure to prevent seeing this message again." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "This Telenode will not be powered\n" );
-
- break;
-
- case MN_H_RPTWARN:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "WARNING: This Repeater will not be powered as there is no parent "
- "Reactor providing power. Build a Reactor." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "This Repeater will not be powered\n" );
-
- break;
-
- case MN_H_RPTWARN2:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "This area already has power. A Repeater is not required here." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "This area already has power\n" );
-
- break;
-
- case MN_H_NOSLOTS:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "You have no room to carry this. Please sell any conflicting "
- "upgrades before purchasing this item." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "You have no room to carry this\n" );
-
- break;
-
- case MN_H_NOFUNDS:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "Insufficient funds. You do not have enough credits to perform this "
- "action." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "Insufficient funds\n" );
-
- break;
-
- case MN_H_ITEMHELD:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "You already hold this item. It is not possible to carry multiple items "
- "of the same type." );
- trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
- }
- else
- CG_Printf( "You already hold this item\n" );
-
- break;
-
-
- //===============================
-
-
- case MN_A_NOROOM:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There is no room to build here. Move until the structure turns "
- "translucent green indicating a valid build location." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "There is no room to build here\n" );
-
- break;
-
- case MN_A_NOCREEP:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There is no creep here. You must build near existing Eggs or "
- "the Overmind. Alien structures will not support themselves." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "There is no creep here\n" );
-
- break;
-
- case MN_A_NOOVMND:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There is no Overmind. An Overmind must be built to control "
- "the structure you tried to place" );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "There is no Overmind\n" );
-
- break;
-
- case MN_A_OVERMIND:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There can only be one Overmind. Destroy the existing one if you "
- "wish to move it." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "There can only be one Overmind\n" );
-
- break;
-
- case MN_A_HOVEL:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There can only be one Hovel. Destroy the existing one if you "
- "wish to move it." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "There can only be one Hovel\n" );
-
- break;
-
- case MN_A_NOASSERT:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "The Overmind cannot control any more structures. Destroy existing "
- "structures to build more." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "The Overmind cannot control any more structures\n" );
-
- break;
-
- case MN_A_SPWNWARN:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "WARNING: This spawn will not be controlled by an Overmind. "
- "Build an Overmind to prevent seeing this message again." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "This spawn will not be controlled by an Overmind\n" );
-
- break;
-
- case MN_A_NORMAL:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "Cannot build on this surface. This surface is too steep or unsuitable "
- "to build on. Please choose another site for this structure." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "Cannot build on this surface\n" );
-
- break;
-
- case MN_A_NOEROOM:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There is no room to evolve here. Move away from walls or other "
- "nearby objects and try again." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "There is no room to evolve here\n" );
-
- break;
-
- case MN_A_TOOCLOSE:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "This location is too close to the enemy to evolve. "
- "Move away until you are no longer aware of the enemy's "
- "presence and try again." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "This location is too close to the enemy to evolve\n" );
-
- break;
-
- case MN_A_NOOVMND_EVOLVE:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "There is no Overmind. An Overmind must be built to allow "
- "you to upgrade." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "There is no Overmind\n" );
-
- break;
-
- case MN_A_HOVEL_OCCUPIED:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "This Hovel is occupied by another builder. Please find or build "
- "another." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "This Hovel is occupied by another builder\n" );
-
- break;
-
- case MN_A_HOVEL_BLOCKED:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "The exit to this Hovel is currently blocked. Please wait until it "
- "becomes clear then try again." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "The exit to this Hovel is currently blocked\n" );
-
- break;
-
- case MN_A_HOVEL_EXIT:
- if( !cg_disableWarningDialogs.integer )
- {
- trap_Cvar_Set( "ui_dialog", "The exit to this Hovel would always be blocked. Please choose "
- "a more suitable location." );
- trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
- }
- else
- CG_Printf( "The exit to this Hovel would always be blocked\n" );
-
- break;
-
- case MN_A_INFEST:
- trap_Cvar_Set( "ui_currentClass", va( "%d %d", cg.snap->ps.stats[ STAT_PCLASS ],
- cg.snap->ps.persistant[ PERS_CREDIT ] ) );
- trap_SendConsoleCommand( "menu tremulous_alienupgrade\n" );
- break;
-
- default:
- Com_Printf( "cgame: debug: no such menu %d\n", menu );
- }
-}
-
-/*
-=================
-CG_ServerCommand
-
-The string has been tokenized and can be retrieved with
-Cmd_Argc() / Cmd_Argv()
-=================
-*/
-static void CG_ServerCommand( void )
-{
- const char *cmd;
- char text[ MAX_SAY_TEXT ];
-
- cmd = CG_Argv( 0 );
-
- if( !cmd[ 0 ] )
- {
- // server claimed the command
- return;
- }
-
- if( !strcmp( cmd, "cp" ) )
- {
- CG_CenterPrint( CG_Argv( 1 ), SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH );
- return;
- }
-
- if( !strcmp( cmd, "cs" ) )
- {
- CG_ConfigStringModified( );
- return;
- }
-
- if( !strcmp( cmd, "print" ) )
- {
- CG_Printf( "%s", CG_Argv( 1 ) );
- return;
- }
-
- if( !strcmp( cmd, "chat" ) )
- {
- if( !cg_teamChatsOnly.integer )
- {
- trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND );
- Q_strncpyz( text, CG_Argv( 1 ), MAX_SAY_TEXT );
- CG_RemoveChatEscapeChar( text );
- CG_Printf( "%s\n", text );
- }
-
- return;
- }
-
- if( !strcmp( cmd, "tchat" ) )
- {
- trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND );
- Q_strncpyz( text, CG_Argv( 1 ), MAX_SAY_TEXT );
- CG_RemoveChatEscapeChar( text );
- CG_AddToTeamChat( text );
- CG_Printf( "%s\n", text );
- return;
- }
-
- if( !strcmp( cmd, "scores" ) )
- {
- CG_ParseScores( );
- return;
- }
-
- if( !strcmp( cmd, "tinfo" ) )
- {
- CG_ParseTeamInfo( );
- return;
- }
-
- if( !strcmp( cmd, "map_restart" ) )
- {
- CG_MapRestart( );
- return;
- }
-
- if( Q_stricmp( cmd, "remapShader" ) == 0 )
- {
- if( trap_Argc( ) == 4 )
- trap_R_RemapShader( CG_Argv( 1 ), CG_Argv( 2 ), CG_Argv( 3 ) );
- }
-
- // clientLevelShot is sent before taking a special screenshot for
- // the menu system during development
- if( !strcmp( cmd, "clientLevelShot" ) )
- {
- cg.levelShot = qtrue;
- return;
- }
-
- //enable G_Printfs from the server to appear in the TA console
- if( !strcmp( cmd, "gprintf" ) )
- {
- if( trap_Argc( ) == 2 )
- CG_TAUIConsole( CG_Argv( 1 ) );
-
- return;
- }
-
- //the server has triggered a menu
- if( !strcmp( cmd, "servermenu" ) )
- {
- if( trap_Argc( ) == 2 && !cg.demoPlayback )
- CG_Menu( atoi( CG_Argv( 1 ) ) );
-
- return;
- }
-
- //the server thinks this client should close all menus
- if( !strcmp( cmd, "serverclosemenus" ) )
- {
- trap_SendConsoleCommand( "closemenus\n" );
- return;
- }
-
- //poison cloud effect needs to be reliable
- if( !strcmp( cmd, "poisoncloud" ) )
- {
- cg.poisonedTime = cg.time;
-
- if( CG_IsParticleSystemValid( &cg.poisonCloudPS ) )
- {
- cg.poisonCloudPS = CG_SpawnNewParticleSystem( cgs.media.poisonCloudPS );
- CG_SetAttachmentCent( &cg.poisonCloudPS->attachment, &cg.predictedPlayerEntity );
- CG_AttachToCent( &cg.poisonCloudPS->attachment );
- }
-
- return;
- }
-
- if( !strcmp( cmd, "weaponswitch" ) )
- {
- CG_Printf( "client weaponswitch\n" );
- if( trap_Argc( ) == 2 )
- {
- cg.weaponSelect = atoi( CG_Argv( 1 ) );
- cg.weaponSelectTime = cg.time;
- }
-
- return;
- }
-
- // server requests a ptrc
- if( !strcmp( cmd, "ptrcrequest" ) )
- {
- int code = CG_ReadPTRCode( );
-
- trap_SendClientCommand( va( "ptrcverify %d", code ) );
- return;
- }
-
- // server issues a ptrc
- if( !strcmp( cmd, "ptrcissue" ) )
- {
- if( trap_Argc( ) == 2 )
- {
- int code = atoi( CG_Argv( 1 ) );
-
- CG_WritePTRCode( code );
- }
-
- return;
- }
-
- // reply to ptrcverify
- if( !strcmp( cmd, "ptrcconfirm" ) )
- {
- trap_SendConsoleCommand( "menu ptrc_popmenu\n" );
-
- return;
- }
-
- CG_Printf( "Unknown client game command: %s\n", cmd );
-}
-
-
-/*
-====================
-CG_ExecuteNewServerCommands
-
-Execute all of the server commands that were received along
-with this this snapshot.
-====================
-*/
-void CG_ExecuteNewServerCommands( int latestSequence )
-{
- while( cgs.serverCommandSequence < latestSequence )
- {
- if( trap_GetServerCommand( ++cgs.serverCommandSequence ) )
- CG_ServerCommand( );
- }
-}