diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cgame/cg_servercmds.c | 7 | ||||
| -rw-r--r-- | src/game/bg_public.h | 6 | ||||
| -rw-r--r-- | src/game/g_active.c | 2 | ||||
| -rw-r--r-- | src/game/g_client.c | 10 | ||||
| -rw-r--r-- | src/game/g_cmds.c | 160 | ||||
| -rw-r--r-- | src/game/g_combat.c | 8 | ||||
| -rw-r--r-- | src/game/g_local.h | 24 | ||||
| -rw-r--r-- | src/game/g_main.c | 57 | ||||
| -rw-r--r-- | src/game/g_svcmds.c | 4 | ||||
| -rw-r--r-- | src/game/g_target.c | 4 | ||||
| -rw-r--r-- | src/game/g_team.c | 4 | ||||
| -rw-r--r-- | src/game/g_utils.c | 204 | ||||
| -rw-r--r-- | src/game/g_weapon.c | 2 | ||||
| -rw-r--r-- | src/server/server.h | 21 | ||||
| -rw-r--r-- | src/server/sv_client.c | 1 | ||||
| -rw-r--r-- | src/server/sv_init.c | 1 | ||||
| -rw-r--r-- | src/server/sv_main.c | 219 | 
17 files changed, 363 insertions, 371 deletions
diff --git a/src/cgame/cg_servercmds.c b/src/cgame/cg_servercmds.c index 7b7a7b74..b0fcc89b 100644 --- a/src/cgame/cg_servercmds.c +++ b/src/cgame/cg_servercmds.c @@ -152,9 +152,6 @@ 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, @@ -276,10 +273,6 @@ static void CG_ConfigStringModified( void )      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, diff --git a/src/game/bg_public.h b/src/game/bg_public.h index b7e1411e..2b723421 100644 --- a/src/game/bg_public.h +++ b/src/game/bg_public.h @@ -32,8 +32,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA  #define DEFAULT_GRAVITY         800 -#define SCORE_NOT_PRESENT       -9999 // for the CS_SCORES[12] when only one player is present -  #define VOTE_TIME               30000 // 30 seconds before vote times out  #define MINS_Z                  -24 @@ -51,8 +49,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA  #define CS_MESSAGE          3   // from the map worldspawn's message field  #define CS_MOTD             4   // g_motd string for server message of the day  #define CS_WARMUP           5   // server time when the match will be restarted -#define CS_SCORES1          6 -#define CS_SCORES2          7 +// 6 UNUSED +// 7 UNUSED  #define CS_VOTE_TIME        8  #define CS_VOTE_STRING      9  #define CS_VOTE_YES         10 diff --git a/src/game/g_active.c b/src/game/g_active.c index 9c8f8a1c..d78d4b98 100644 --- a/src/game/g_active.c +++ b/src/game/g_active.c @@ -447,7 +447,7 @@ qboolean ClientInactivityTimer( gclient_t *client )      if( level.time > client->inactivityTime - 10000 && !client->inactivityWarning )      {        client->inactivityWarning = qtrue; -      G_SendCommandFromServer( client - level.clients, "cp \"Ten seconds until inactivity drop!\n\"" ); +      trap_SendServerCommand( client - level.clients, "cp \"Ten seconds until inactivity drop!\n\"" );      }    } diff --git a/src/game/g_client.c b/src/game/g_client.c index 4fb7d37e..f0b33e03 100644 --- a/src/game/g_client.c +++ b/src/game/g_client.c @@ -995,7 +995,7 @@ void ClientUserinfoChanged( int clientNum )    {      if( strcmp( oldname, client->pers.netname ) )      { -      G_SendCommandFromServer( -1, va( "print \"%s" S_COLOR_WHITE " renamed to %s\n\"", oldname, +      trap_SendServerCommand( -1, va( "print \"%s" S_COLOR_WHITE " renamed to %s\n\"", oldname,          client->pers.netname ) );      }    } @@ -1164,7 +1164,7 @@ char *ClientConnect( int clientNum, qboolean firstTime, qboolean isBot )    // don't do the "xxx connected" messages if they were caried over from previous level    if( firstTime ) -    G_SendCommandFromServer( -1, va( "print \"%s" S_COLOR_WHITE " connected\n\"", client->pers.netname ) ); +    trap_SendServerCommand( -1, va( "print \"%s" S_COLOR_WHITE " connected\n\"", client->pers.netname ) );    // count current clients and rank for scoreboard    CalculateRanks( ); @@ -1216,12 +1216,10 @@ void ClientBegin( int clientNum )    ClientSpawn( ent, NULL, NULL, NULL ); -  G_InitCommandQueue( clientNum ); - -  G_SendCommandFromServer( -1, va( "print \"%s" S_COLOR_WHITE " entered the game\n\"", client->pers.netname ) ); +  trap_SendServerCommand( -1, va( "print \"%s" S_COLOR_WHITE " entered the game\n\"", client->pers.netname ) );    // request the clients PTR code -  G_SendCommandFromServer( ent - g_entities, "ptrcrequest" ); +  trap_SendServerCommand( ent - g_entities, "ptrcrequest" );    G_LogPrintf( "ClientBegin: %i\n", clientNum ); diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index f5e78069..ecb6ad39 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -74,7 +74,7 @@ int G_ClientNumberFromString( gentity_t *to, char *s )      if( idnum < 0 || idnum >= level.maxclients )      { -      G_SendCommandFromServer( to - g_entities, va( "print \"Bad client slot: %i\n\"", idnum ) ); +      trap_SendServerCommand( to - g_entities, va( "print \"Bad client slot: %i\n\"", idnum ) );        return -1;      } @@ -82,7 +82,7 @@ int G_ClientNumberFromString( gentity_t *to, char *s )      if( cl->pers.connected != CON_CONNECTED )      { -      G_SendCommandFromServer( to - g_entities, va( "print \"Client %i is not active\n\"", idnum ) ); +      trap_SendServerCommand( to - g_entities, va( "print \"Client %i is not active\n\"", idnum ) );        return -1;      } @@ -103,7 +103,7 @@ int G_ClientNumberFromString( gentity_t *to, char *s )        return idnum;    } -  G_SendCommandFromServer( to - g_entities, va( "print \"User %s is not on the server\n\"", s ) ); +  trap_SendServerCommand( to - g_entities, va( "print \"User %s is not on the server\n\"", s ) );    return -1;  } @@ -177,7 +177,7 @@ void ScoreboardMessage( gentity_t *ent )      stringlength += j;    } -  G_SendCommandFromServer( ent-g_entities, va( "scores %i %i %i%s", i, +  trap_SendServerCommand( ent-g_entities, va( "scores %i %i %i%s", i,      level.alienKills, level.humanKills, string ) );  } @@ -205,13 +205,13 @@ qboolean CheatsOk( gentity_t *ent )  {    if( !g_cheats.integer )    { -    G_SendCommandFromServer( ent-g_entities, va( "print \"Cheats are not enabled on this server\n\"" ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"Cheats are not enabled on this server\n\"" ) );      return qfalse;    }    if( ent->health <= 0 )    { -    G_SendCommandFromServer( ent-g_entities, va( "print \"You must be alive to use this command\n\"" ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"You must be alive to use this command\n\"" ) );      return qfalse;    } @@ -325,7 +325,7 @@ void Cmd_God_f( gentity_t *ent )    else      msg = "godmode ON\n"; -  G_SendCommandFromServer( ent - g_entities, va( "print \"%s\"", msg ) ); +  trap_SendServerCommand( ent - g_entities, va( "print \"%s\"", msg ) );  } @@ -352,7 +352,7 @@ void Cmd_Notarget_f( gentity_t *ent )    else      msg = "notarget ON\n"; -  G_SendCommandFromServer( ent - g_entities, va( "print \"%s\"", msg ) ); +  trap_SendServerCommand( ent - g_entities, va( "print \"%s\"", msg ) );  } @@ -377,7 +377,7 @@ void Cmd_Noclip_f( gentity_t *ent )    ent->client->noclip = !ent->client->noclip; -  G_SendCommandFromServer( ent - g_entities, va( "print \"%s\"", msg ) ); +  trap_SendServerCommand( ent - g_entities, va( "print \"%s\"", msg ) );  } @@ -397,7 +397,7 @@ void Cmd_LevelShot_f( gentity_t *ent )      return;    BeginIntermission( ); -  G_SendCommandFromServer( ent - g_entities, "clientLevelShot" ); +  trap_SendServerCommand( ent - g_entities, "clientLevelShot" );  }  /* @@ -418,7 +418,7 @@ void Cmd_Kill_f( gentity_t *ent )    if( ent->client->ps.stats[ STAT_STATE ] & SS_HOVELING )    { -    G_SendCommandFromServer( ent-g_entities, "print \"Leave the hovel first (use your destroy key)\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Leave the hovel first (use your destroy key)\n\"" );      return;    } @@ -435,12 +435,12 @@ void Cmd_Kill_f( gentity_t *ent )    {      if( ent->suicideTime == 0 )      { -      G_SendCommandFromServer( ent-g_entities, "print \"You will suicide in 20 seconds\n\"" ); +      trap_SendServerCommand( ent-g_entities, "print \"You will suicide in 20 seconds\n\"" );        ent->suicideTime = level.time + 20000;      }      else if( ent->suicideTime > level.time )      { -      G_SendCommandFromServer( ent-g_entities, "print \"Suicide cancelled\n\"" ); +      trap_SendServerCommand( ent-g_entities, "print \"Suicide cancelled\n\"" );        ent->suicideTime = 0;      }    } @@ -492,7 +492,7 @@ void Cmd_Team_f( gentity_t *ent )    if( !strlen( s ) )    { -    G_SendCommandFromServer( ent-g_entities, va("print \"team: %i\n\"", ent->client->pers.teamSelection ) ); +    trap_SendServerCommand( ent-g_entities, va("print \"team: %i\n\"", ent->client->pers.teamSelection ) );      return;    } @@ -529,16 +529,16 @@ void Cmd_Team_f( gentity_t *ent )    }    else    { -    G_SendCommandFromServer( ent-g_entities, va( "print \"Unknown team: %s\n\"", s ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"Unknown team: %s\n\"", s ) );      return;    }    G_ChangeTeam( ent, team );    if( team == PTE_ALIENS ) -    G_SendCommandFromServer( -1, va( "print \"%s" S_COLOR_WHITE " joined the aliens\n\"", ent->client->pers.netname ) ); +    trap_SendServerCommand( -1, va( "print \"%s" S_COLOR_WHITE " joined the aliens\n\"", ent->client->pers.netname ) );    else if( team == PTE_HUMANS ) -    G_SendCommandFromServer( -1, va( "print \"%s" S_COLOR_WHITE " joined the humans\n\"", ent->client->pers.netname ) ); +    trap_SendServerCommand( -1, va( "print \"%s" S_COLOR_WHITE " joined the humans\n\"", ent->client->pers.netname ) );  } @@ -564,7 +564,7 @@ static void G_SayTo( gentity_t *ent, gentity_t *other, int mode, int color, cons    if( mode == SAY_TEAM && !OnSameTeam( ent, other ) )      return; -  G_SendCommandFromServer( other-g_entities, va( "%s \"%s%c%c%s\"", +  trap_SendServerCommand( other-g_entities, va( "%s \"%s%c%c%s\"",      mode == SAY_TEAM ? "tchat" : "chat",      name, Q_COLOR_ESCAPE, color, message ) );  } @@ -698,7 +698,7 @@ Cmd_Where_f  */  void Cmd_Where_f( gentity_t *ent )  { -  G_SendCommandFromServer( ent-g_entities, va( "print \"%s\n\"", vtos( ent->s.origin ) ) ); +  trap_SendServerCommand( ent-g_entities, va( "print \"%s\n\"", vtos( ent->s.origin ) ) );  }  /* @@ -714,25 +714,25 @@ void Cmd_CallVote_f( gentity_t *ent )    if( !g_allowVote.integer )    { -    G_SendCommandFromServer( ent-g_entities, "print \"Voting not allowed here\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Voting not allowed here\n\"" );      return;    }    if( level.voteTime )    { -    G_SendCommandFromServer( ent-g_entities, "print \"A vote is already in progress\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"A vote is already in progress\n\"" );      return;    }    if( ent->client->pers.voteCount >= MAX_VOTE_COUNT )    { -    G_SendCommandFromServer( ent-g_entities, "print \"You have called the maximum number of votes\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"You have called the maximum number of votes\n\"" );      return;    }    if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_NONE )    { -    G_SendCommandFromServer( ent-g_entities, "print \"Not allowed to call a vote as spectator\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Not allowed to call a vote as spectator\n\"" );      return;    } @@ -742,7 +742,7 @@ void Cmd_CallVote_f( gentity_t *ent )    if( strchr( arg1, ';' ) || strchr( arg2, ';' ) )    { -    G_SendCommandFromServer( ent-g_entities, "print \"Invalid vote string\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Invalid vote string\n\"" );      return;    } @@ -754,8 +754,8 @@ void Cmd_CallVote_f( gentity_t *ent )    else if( !Q_stricmp( arg1, "timelimit" ) ) { }    else    { -    G_SendCommandFromServer( ent-g_entities, "print \"Invalid vote string\n\"" ); -    G_SendCommandFromServer( ent-g_entities, "print \"Vote commands are: map_restart, nextmap, map <mapname>, " +    trap_SendServerCommand( ent-g_entities, "print \"Invalid vote string\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Vote commands are: map_restart, nextmap, map <mapname>, "                                              "kick <player>, clientkick <clientnum>, "                                              "timelimit <time>\n\"" );      return; @@ -791,7 +791,7 @@ void Cmd_CallVote_f( gentity_t *ent )      if( !*s )      { -      G_SendCommandFromServer( ent-g_entities, "print \"nextmap not set\n\"" ); +      trap_SendServerCommand( ent-g_entities, "print \"nextmap not set\n\"" );        return;      } @@ -804,7 +804,7 @@ void Cmd_CallVote_f( gentity_t *ent )      Com_sprintf( level.voteDisplayString, sizeof( level.voteDisplayString ), "%s", level.voteString );    } -  G_SendCommandFromServer( -1, va( "print \"%s called a vote\n\"", ent->client->pers.netname ) ); +  trap_SendServerCommand( -1, va( "print \"%s called a vote\n\"", ent->client->pers.netname ) );    // start the voting, the caller autoamtically votes yes    level.voteTime = level.time; @@ -833,23 +833,23 @@ void Cmd_Vote_f( gentity_t *ent )    if( !level.voteTime )    { -    G_SendCommandFromServer( ent-g_entities, "print \"No vote in progress\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"No vote in progress\n\"" );      return;    }    if( ent->client->ps.eFlags & EF_VOTED )    { -    G_SendCommandFromServer( ent-g_entities, "print \"Vote already cast\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Vote already cast\n\"" );      return;    }    if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_NONE )    { -    G_SendCommandFromServer( ent-g_entities, "print \"Not allowed to vote as spectator\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Not allowed to vote as spectator\n\"" );      return;    } -  G_SendCommandFromServer( ent-g_entities, "print \"Vote cast\n\"" ); +  trap_SendServerCommand( ent-g_entities, "print \"Vote cast\n\"" );    ent->client->ps.eFlags |= EF_VOTED; @@ -892,25 +892,25 @@ void Cmd_CallTeamVote_f( gentity_t *ent )    if( !g_allowVote.integer )    { -    G_SendCommandFromServer( ent-g_entities, "print \"Voting not allowed here\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Voting not allowed here\n\"" );      return;    }    if( level.teamVoteTime[ cs_offset ] )    { -    G_SendCommandFromServer( ent-g_entities, "print \"A team vote is already in progress\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"A team vote is already in progress\n\"" );      return;    }    if( ent->client->pers.teamVoteCount >= MAX_VOTE_COUNT )    { -    G_SendCommandFromServer( ent-g_entities, "print \"You have called the maximum number of team votes\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"You have called the maximum number of team votes\n\"" );      return;    }    if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_NONE )    { -    G_SendCommandFromServer( ent-g_entities, "print \"Not allowed to call a vote as spectator\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Not allowed to call a vote as spectator\n\"" );      return;    } @@ -920,7 +920,7 @@ void Cmd_CallTeamVote_f( gentity_t *ent )    if( strchr( arg1, ';' ) || strchr( arg2, ';' ) )    { -    G_SendCommandFromServer( ent-g_entities, "print \"Invalid team vote string\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Invalid team vote string\n\"" );      return;    } @@ -948,14 +948,14 @@ void Cmd_CallTeamVote_f( gentity_t *ent )      if( i >= level.maxclients )      { -      G_SendCommandFromServer( ent-g_entities, va( "print \"%s is not a valid player on your team\n\"", arg2 ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"%s is not a valid player on your team\n\"", arg2 ) );        return;      }    }    else    { -    G_SendCommandFromServer( ent-g_entities, "print \"Invalid vote string\n\"" ); -    G_SendCommandFromServer( ent-g_entities, "print \"Team vote commands are: teamkick <player>\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Invalid vote string\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Team vote commands are: teamkick <player>\n\"" );      return;    } @@ -968,7 +968,7 @@ void Cmd_CallTeamVote_f( gentity_t *ent )        continue;      if( level.clients[ i ].ps.stats[ STAT_PTEAM ] == team ) -      G_SendCommandFromServer( i, va("print \"%s called a team vote\n\"", ent->client->pers.netname ) ); +      trap_SendServerCommand( i, va("print \"%s called a team vote\n\"", ent->client->pers.netname ) );    }    // start the voting, the caller autoamtically votes yes @@ -1011,23 +1011,23 @@ void Cmd_TeamVote_f( gentity_t *ent )    if( !level.teamVoteTime[ cs_offset ] )    { -    G_SendCommandFromServer( ent-g_entities, "print \"No team vote in progress\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"No team vote in progress\n\"" );      return;    }    if( ent->client->ps.eFlags & EF_TEAMVOTED )    { -    G_SendCommandFromServer( ent-g_entities, "print \"Team vote already cast\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Team vote already cast\n\"" );      return;    }    if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_NONE )    { -    G_SendCommandFromServer( ent-g_entities, "print \"Not allowed to vote as spectator\n\"" ); +    trap_SendServerCommand( ent-g_entities, "print \"Not allowed to vote as spectator\n\"" );      return;    } -  G_SendCommandFromServer( ent-g_entities, "print \"Team vote cast\n\"" ); +  trap_SendServerCommand( ent-g_entities, "print \"Team vote cast\n\"" );    ent->client->ps.eFlags |= EF_TEAMVOTED; @@ -1062,13 +1062,13 @@ void Cmd_SetViewpos_f( gentity_t *ent )    if( !g_cheats.integer )    { -    G_SendCommandFromServer( ent-g_entities, va( "print \"Cheats are not enabled on this server\n\"" ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"Cheats are not enabled on this server\n\"" ) );      return;    }    if( trap_Argc( ) != 5 )    { -    G_SendCommandFromServer( ent-g_entities, va( "print \"usage: setviewpos x y z yaw\n\"" ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"usage: setviewpos x y z yaw\n\"" ) );      return;    } @@ -1170,7 +1170,7 @@ void Cmd_Class_f( gentity_t *ent )              currentClass == PCL_ALIEN_BUILDER0_UPG ) &&            ent->client->ps.stats[ STAT_MISC ] > 0 )        { -        G_SendCommandFromServer( ent-g_entities, va( "print \"Cannot evolve until build timer expires\n\"" ) ); +        trap_SendServerCommand( ent-g_entities, va( "print \"Cannot evolve until build timer expires\n\"" ) );          return;        } @@ -1179,7 +1179,7 @@ void Cmd_Class_f( gentity_t *ent )        if( ent->client->pers.classSelection == PCL_NONE )        { -        G_SendCommandFromServer( ent-g_entities, va( "print \"Unknown class\n\"" ) ); +        trap_SendServerCommand( ent-g_entities, va( "print \"Unknown class\n\"" ) );          return;        } @@ -1237,7 +1237,7 @@ void Cmd_Class_f( gentity_t *ent )          else          {            ent->client->pers.classSelection = PCL_NONE; -          G_SendCommandFromServer( ent-g_entities, +          trap_SendServerCommand( ent-g_entities,                 va( "print \"You cannot evolve from your current class\n\"" ) );            return;          } @@ -1269,11 +1269,11 @@ void Cmd_Class_f( gentity_t *ent )          }          ent->client->pers.classSelection = PCL_NONE; -        G_SendCommandFromServer( ent-g_entities, va( "print \"You cannot spawn as this class\n\"" ) ); +        trap_SendServerCommand( ent-g_entities, va( "print \"You cannot spawn as this class\n\"" ) );        }        else        { -        G_SendCommandFromServer( ent-g_entities, va( "print \"Unknown class\n\"" ) ); +        trap_SendServerCommand( ent-g_entities, va( "print \"Unknown class\n\"" ) );          return;        }      } @@ -1283,7 +1283,7 @@ void Cmd_Class_f( gentity_t *ent )      //humans cannot use this command whilst alive      if( ent->client->pers.classSelection != PCL_NONE )      { -      G_SendCommandFromServer( ent-g_entities, va( "print \"You must be dead to use the class command\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"You must be dead to use the class command\n\"" ) );        return;      } @@ -1301,7 +1301,7 @@ void Cmd_Class_f( gentity_t *ent )      else      {        ent->client->pers.classSelection = PCL_NONE; -      G_SendCommandFromServer( ent-g_entities, va( "print \"Unknown starting item\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"Unknown starting item\n\"" ) );        return;      } @@ -1313,7 +1313,7 @@ void Cmd_Class_f( gentity_t *ent )      ent->client->pers.classSelection = PCL_NONE;      ent->client->sess.sessionTeam = TEAM_FREE;      ClientSpawn( ent, NULL, NULL, NULL ); -    G_SendCommandFromServer( ent-g_entities, va( "print \"Join a team first\n\"" ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"Join a team first\n\"" ) );    }  } @@ -1391,7 +1391,7 @@ void Cmd_ActivateItem_f( gentity_t *ent )    else if( weapon != WP_NONE && BG_InventoryContainsWeapon( weapon, ent->client->ps.stats ) )      G_ForceWeaponChange( ent, weapon );    else -    G_SendCommandFromServer( ent-g_entities, va( "print \"You don't have the %s\n\"", s ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"You don't have the %s\n\"", s ) );  } @@ -1419,7 +1419,7 @@ void Cmd_DeActivateItem_f( gentity_t *ent )    if( BG_InventoryContainsUpgrade( upgrade, ent->client->ps.stats ) )      BG_DeactivateUpgrade( upgrade, ent->client->ps.stats );    else -    G_SendCommandFromServer( ent-g_entities, va( "print \"You don't have the %s\n\"", s ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"You don't have the %s\n\"", s ) );  } @@ -1476,7 +1476,7 @@ void Cmd_ToggleItem_f( gentity_t *ent )        BG_ActivateUpgrade( upgrade, ent->client->ps.stats );    }    else -    G_SendCommandFromServer( ent-g_entities, va( "print \"You don't have the %s\n\"", s ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"You don't have the %s\n\"", s ) );  }  /* @@ -1523,7 +1523,7 @@ void Cmd_Buy_f( gentity_t *ent )      if( ( !G_BuildableRange( ent->client->ps.origin, 100, BA_H_REACTOR ) &&          !G_BuildableRange( ent->client->ps.origin, 100, BA_H_REPEATER ) ) )      { -      G_SendCommandFromServer( ent-g_entities, va( "print \"You must be near a reactor or repeater\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"You must be near a reactor or repeater\n\"" ) );        return;      }    } @@ -1532,7 +1532,7 @@ void Cmd_Buy_f( gentity_t *ent )      //no armoury nearby      if( !G_BuildableRange( ent->client->ps.origin, 100, BA_H_ARMOURY ) )      { -      G_SendCommandFromServer( ent-g_entities, va( "print \"You must be near a powered armoury\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"You must be near a powered armoury\n\"" ) );        return;      }    } @@ -1563,21 +1563,21 @@ void Cmd_Buy_f( gentity_t *ent )      if( BG_FindTeamForWeapon( weapon ) != WUT_HUMANS )      {        //shouldn't need a fancy dialog -      G_SendCommandFromServer( ent-g_entities, va( "print \"You can't buy alien items\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy alien items\n\"" ) );        return;      }      //are we /allowed/ to buy this?      if( !BG_FindPurchasableForWeapon( weapon ) )      { -      G_SendCommandFromServer( ent-g_entities, va( "print \"You can't buy this item\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy this item\n\"" ) );        return;      }      //are we /allowed/ to buy this?      if( !BG_FindStagesForWeapon( weapon, g_humanStage.integer ) || !BG_WeaponIsAllowed( weapon ) )      { -      G_SendCommandFromServer( ent-g_entities, va( "print \"You can't buy this item\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy this item\n\"" ) );        return;      } @@ -1626,21 +1626,21 @@ void Cmd_Buy_f( gentity_t *ent )      if( BG_FindTeamForUpgrade( upgrade ) != WUT_HUMANS )      {        //shouldn't need a fancy dialog -      G_SendCommandFromServer( ent-g_entities, va( "print \"You can't buy alien items\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy alien items\n\"" ) );        return;      }      //are we /allowed/ to buy this?      if( !BG_FindPurchasableForUpgrade( upgrade ) )      { -      G_SendCommandFromServer( ent-g_entities, va( "print \"You can't buy this item\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy this item\n\"" ) );        return;      }      //are we /allowed/ to buy this?      if( !BG_FindStagesForUpgrade( upgrade, g_humanStage.integer ) || !BG_UpgradeIsAllowed( upgrade ) )      { -      G_SendCommandFromServer( ent-g_entities, va( "print \"You can't buy this item\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy this item\n\"" ) );        return;      } @@ -1660,7 +1660,7 @@ void Cmd_Buy_f( gentity_t *ent )    }    else    { -    G_SendCommandFromServer( ent-g_entities, va( "print \"Unknown item\n\"" ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"Unknown item\n\"" ) );    }    if( trap_Argc( ) >= 2 ) @@ -1697,7 +1697,7 @@ void Cmd_Sell_f( gentity_t *ent )    //no armoury nearby    if( !G_BuildableRange( ent->client->ps.origin, 100, BA_H_ARMOURY ) )    { -    G_SendCommandFromServer( ent-g_entities, va( "print \"You must be near a powered armoury\n\"" ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"You must be near a powered armoury\n\"" ) );      return;    } @@ -1709,7 +1709,7 @@ void Cmd_Sell_f( gentity_t *ent )      //are we /allowed/ to sell this?      if( !BG_FindPurchasableForWeapon( weapon ) )      { -      G_SendCommandFromServer( ent-g_entities, va( "print \"You can't sell this weapon\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"You can't sell this weapon\n\"" ) );        return;      } @@ -1720,7 +1720,7 @@ void Cmd_Sell_f( gentity_t *ent )        if( ( weapon == WP_HBUILD || weapon == WP_HBUILD2 ) &&            ent->client->ps.stats[ STAT_MISC ] > 0 )        { -        G_SendCommandFromServer( ent-g_entities, va( "print \"Cannot sell until build timer expires\n\"" ) ); +        trap_SendServerCommand( ent-g_entities, va( "print \"Cannot sell until build timer expires\n\"" ) );          return;        } @@ -1739,7 +1739,7 @@ void Cmd_Sell_f( gentity_t *ent )      //are we /allowed/ to sell this?      if( !BG_FindPurchasableForUpgrade( upgrade ) )      { -      G_SendCommandFromServer( ent-g_entities, va( "print \"You can't sell this item\n\"" ) ); +      trap_SendServerCommand( ent-g_entities, va( "print \"You can't sell this item\n\"" ) );        return;      }      //remove upgrade if carried @@ -1762,7 +1762,7 @@ void Cmd_Sell_f( gentity_t *ent )        if( ( i == WP_HBUILD || i == WP_HBUILD2 ) &&            ent->client->ps.stats[ STAT_MISC ] > 0 )        { -        G_SendCommandFromServer( ent-g_entities, va( "print \"Cannot sell until build timer expires\n\"" ) ); +        trap_SendServerCommand( ent-g_entities, va( "print \"Cannot sell until build timer expires\n\"" ) );          continue;        } @@ -1812,7 +1812,7 @@ void Cmd_Sell_f( gentity_t *ent )      }    }    else -    G_SendCommandFromServer( ent-g_entities, va( "print \"Unknown item\n\"" ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"Unknown item\n\"" ) );    if( trap_Argc( ) >= 2 )    { @@ -1907,7 +1907,7 @@ void Cmd_Build_f( gentity_t *ent )      }    }    else -    G_SendCommandFromServer( ent-g_entities, va( "print \"Cannot build this item\n\"" ) ); +    trap_SendServerCommand( ent-g_entities, va( "print \"Cannot build this item\n\"" ) );  } @@ -2120,7 +2120,7 @@ void Cmd_PTRCVerify_f( gentity_t *ent )      // valid code      if( connection->clientTeam != PTE_NONE ) -      G_SendCommandFromServer( ent->client->ps.clientNum, "ptrcconfirm" ); +      trap_SendServerCommand( ent->client->ps.clientNum, "ptrcconfirm" );      // restore mapping      ent->client->pers.connection = connection; @@ -2132,7 +2132,7 @@ void Cmd_PTRCVerify_f( gentity_t *ent )      if( connection )      { -      G_SendCommandFromServer( ent->client->ps.clientNum, +      trap_SendServerCommand( ent->client->ps.clientNum,          va( "ptrcissue %d", connection->ptrCode ) );      }    } @@ -2162,7 +2162,7 @@ void Cmd_PTRCRestore_f( gentity_t *ent )    {      if( ent->client->pers.joinedATeam )      { -      G_SendCommandFromServer( ent - g_entities, +      trap_SendServerCommand( ent - g_entities,          "print \"You cannot use a PTR code after joining a team\n\"" );      }      else @@ -2183,7 +2183,7 @@ void Cmd_PTRCRestore_f( gentity_t *ent )    }    else    { -    G_SendCommandFromServer( ent - g_entities, +    trap_SendServerCommand( ent - g_entities,        va( "print \"\"%d\" is not a valid PTR code\n\"", code ) );    }  } @@ -2201,7 +2201,7 @@ void Cmd_Test_f( gentity_t *ent )  /*  ent->client->ps.stats[ STAT_STATE ] |= SS_POISONCLOUDED;    ent->client->lastPoisonCloudedTime = level.time;    ent->client->lastPoisonCloudedClient = ent; -  G_SendCommandFromServer( ent->client->ps.clientNum, "poisoncloud" );*/ +  trap_SendServerCommand( ent->client->ps.clientNum, "poisoncloud" );*/  /*  ent->client->ps.stats[ STAT_STATE ] |= SS_POISONED;    ent->client->lastPoisonTime = level.time; @@ -2314,5 +2314,5 @@ void ClientCommand( int clientNum )    else if( Q_stricmp( cmd, "test" ) == 0 )      Cmd_Test_f( ent );    else -    G_SendCommandFromServer( clientNum, va( "print \"unknown cmd %s\n\"", cmd ) ); +    trap_SendServerCommand( clientNum, va( "print \"unknown cmd %s\n\"", cmd ) );  } diff --git a/src/game/g_combat.c b/src/game/g_combat.c index 7e38f119..6d8e5c1c 100644 --- a/src/game/g_combat.c +++ b/src/game/g_combat.c @@ -1022,6 +1022,14 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,          return;      } +		// If target is buildable on the same team as the attacking client +		if( targ->s.eType == ET_BUILDABLE && attacker->client && +				targ->biteam == attacker->client->pers.teamSelection ) +		{ +			if( !g_friendlyBuildableFire.integer ) +				return; +		} +      // check for godmode      if ( targ->flags & FL_GODMODE )        return; diff --git a/src/game/g_local.h b/src/game/g_local.h index 82f294b0..874afeee 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -717,30 +717,7 @@ void        AddRemap(const char *oldShader, const char *newShader, float timeOff  const char  *BuildShaderStateConfig( void ); -#define MAX_QUEUE_COMMANDS  64 //should be MAX_RELIABLE_COMMANDS/server.h - -typedef struct commandQueueElement_s -{ -  qboolean                      used; -  struct commandQueueElement_s  *next; -  char                          command[ MAX_TOKEN_CHARS ]; -} commandQueueElement_t; - -typedef struct commandQueue_s -{ -  int                   nextCommandTime; //next time that the queue can be popped - -  int                   numElements; -  commandQueueElement_t *front; -  commandQueueElement_t *back; - -  commandQueueElement_t pool[ MAX_QUEUE_COMMANDS ]; -} commandQueue_t; -  qboolean    G_ClientIsLagging( gclient_t *client ); -void        G_ProcessCommandQueues( void ); -void        G_SendCommandFromServer( int clientNum, const char *cmd ); -void        G_InitCommandQueue( int clientNum );  void        G_TriggerMenu( int clientNum, dynMenu_t menu );  void        G_CloseMenus( int clientNum ); @@ -1034,6 +1011,7 @@ extern  vmCvar_t  g_minCommandPeriod;  extern  vmCvar_t  g_timelimit;  extern  vmCvar_t  g_suddenDeathTime;  extern  vmCvar_t  g_friendlyFire; +extern  vmCvar_t  g_friendlyBuildableFire;  extern  vmCvar_t  g_password;  extern  vmCvar_t  g_needpass;  extern  vmCvar_t  g_gravity; diff --git a/src/game/g_main.c b/src/game/g_main.c index 06241b80..b07afc75 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -44,6 +44,7 @@ vmCvar_t  g_timelimit;  vmCvar_t  g_suddenDeathTime;  vmCvar_t  g_capturelimit;  vmCvar_t  g_friendlyFire; +vmCvar_t  g_friendlyBuildableFire;  vmCvar_t  g_password;  vmCvar_t  g_needpass;  vmCvar_t  g_maxclients; @@ -129,6 +130,7 @@ static cvarTable_t   gameCvarTable[ ] =    { &g_synchronousClients, "g_synchronousClients", "0", CVAR_SYSTEMINFO, 0, qfalse  },    { &g_friendlyFire, "g_friendlyFire", "0", CVAR_ARCHIVE, 0, qtrue  }, +  { &g_friendlyBuildableFire, "g_friendlyBuildableFire", "0", CVAR_ARCHIVE, 0, qtrue  },    { &g_teamAutoJoin, "g_teamAutoJoin", "0", CVAR_ARCHIVE  },    { &g_teamForceBalance, "g_teamForceBalance", "0", CVAR_ARCHIVE  }, @@ -413,7 +415,7 @@ void G_UpdateCvars( void )          cv->modificationCount = cv->vmCvar->modificationCount;          if( cv->trackChange ) -          G_SendCommandFromServer( -1, va( "print \"Server: %s changed to %s\n\"", +          trap_SendServerCommand( -1, va( "print \"Server: %s changed to %s\n\"",              cv->cvarName, cv->vmCvar->string ) );          if( cv->teamShader ) @@ -971,12 +973,10 @@ void G_CalculateBuildPoints( void )      level.alienBuildPoints = 0;    } -  trap_SetConfigstring( CS_BUILDPOINTS, -                        va( "%d %d %d %d %d", level.alienBuildPoints, -                                              localATP, -                                              level.humanBuildPoints, -                                              localHTP, -                                              level.humanBuildPointsPowered ) ); +  trap_SetConfigstring( CS_BUILDPOINTS, va( "%d %d %d %d %d", +        level.alienBuildPoints, localATP, +        level.humanBuildPoints, localHTP, +        level.humanBuildPointsPowered ) );    //may as well pump the stages here too    { @@ -1211,26 +1211,6 @@ void CalculateRanks( void )      score = newScore;    } -  // set the CS_SCORES1/2 configstrings, which will be visible to everyone -  if( level.numConnectedClients == 0 ) -  { -    trap_SetConfigstring( CS_SCORES1, va( "%i", SCORE_NOT_PRESENT ) ); -    trap_SetConfigstring( CS_SCORES2, va( "%i", SCORE_NOT_PRESENT ) ); -  } -  else if( level.numConnectedClients == 1 ) -  { -    trap_SetConfigstring( CS_SCORES1, va( "%i", -          level.clients[ level.sortedClients[ 0 ] ].ps.persistant[ PERS_SCORE ] ) ); -    trap_SetConfigstring( CS_SCORES2, va( "%i", SCORE_NOT_PRESENT ) ); -  } -  else -  { -    trap_SetConfigstring( CS_SCORES1, va( "%i", -          level.clients[ level.sortedClients[ 0 ] ].ps.persistant[ PERS_SCORE ] ) ); -    trap_SetConfigstring( CS_SCORES2, va( "%i", -          level.clients[ level.sortedClients[ 1 ] ].ps.persistant[ PERS_SCORE ] ) ); -  } -    // see if it is time to end the level    CheckExitRules( ); @@ -1737,7 +1717,7 @@ void CheckExitRules( void )      if( level.time - level.startTime >= g_timelimit.integer * 60000 )      {        level.lastWin = PTE_NONE; -      G_SendCommandFromServer( -1, "print \"Timelimit hit\n\"" ); +      trap_SendServerCommand( -1, "print \"Timelimit hit\n\"" );        LogExit( "Timelimit hit." );        return;      } @@ -1750,7 +1730,7 @@ void CheckExitRules( void )    {      //humans win      level.lastWin = PTE_HUMANS; -    G_SendCommandFromServer( -1, "print \"Humans win\n\""); +    trap_SendServerCommand( -1, "print \"Humans win\n\"");      LogExit( "Humans win." );    }    else if( level.uncondAlienWin || @@ -1760,7 +1740,7 @@ void CheckExitRules( void )    {      //aliens win      level.lastWin = PTE_ALIENS; -    G_SendCommandFromServer( -1, "print \"Aliens win\n\""); +    trap_SendServerCommand( -1, "print \"Aliens win\n\"");      LogExit( "Aliens win." );    }  } @@ -1805,13 +1785,13 @@ void CheckVote( void )      if( level.voteYes > level.voteNo )      {        // execute the command, then remove the vote -      G_SendCommandFromServer( -1, "print \"Vote passed\n\"" ); +      trap_SendServerCommand( -1, "print \"Vote passed\n\"" );        level.voteExecuteTime = level.time + 3000;      }      else      {        // same behavior as a timeout -      G_SendCommandFromServer( -1, "print \"Vote failed\n\"" ); +      trap_SendServerCommand( -1, "print \"Vote failed\n\"" );      }    }    else @@ -1819,13 +1799,13 @@ void CheckVote( void )      if( level.voteYes > level.numConnectedClients / 2 )      {        // execute the command, then remove the vote -      G_SendCommandFromServer( -1, "print \"Vote passed\n\"" ); +      trap_SendServerCommand( -1, "print \"Vote passed\n\"" );        level.voteExecuteTime = level.time + 3000;      }      else if( level.voteNo >= level.numConnectedClients / 2 )      {        // same behavior as a timeout -      G_SendCommandFromServer( -1, "print \"Vote failed\n\"" ); +      trap_SendServerCommand( -1, "print \"Vote failed\n\"" );      }      else      { @@ -1860,21 +1840,21 @@ void CheckTeamVote( int team )    if( level.time - level.teamVoteTime[ cs_offset ] >= VOTE_TIME )    { -    G_SendCommandFromServer( -1, "print \"Team vote failed\n\"" ); +    trap_SendServerCommand( -1, "print \"Team vote failed\n\"" );    }    else    {      if( level.teamVoteYes[ cs_offset ] > level.numteamVotingClients[ cs_offset ] / 2 )      {        // execute the command, then remove the vote -      G_SendCommandFromServer( -1, "print \"Team vote passed\n\"" ); +      trap_SendServerCommand( -1, "print \"Team vote passed\n\"" );        //        trap_SendConsoleCommand( EXEC_APPEND, va( "%s\n", level.teamVoteString[ cs_offset ] ) );      }      else if( level.teamVoteNo[ cs_offset ] >= level.numteamVotingClients[ cs_offset ] / 2 )      {        // same behavior as a timeout -      G_SendCommandFromServer( -1, "print \"Team vote failed\n\"" ); +      trap_SendServerCommand( -1, "print \"Team vote failed\n\"" );      }      else      { @@ -2090,9 +2070,6 @@ void G_RunFrame( int levelTime )    G_CalculateAvgPlayers( );    G_UpdateZaps( msec ); -  //send any pending commands -  G_ProcessCommandQueues( ); -    // see if it is time to end the level    CheckExitRules( ); diff --git a/src/game/g_svcmds.c b/src/game/g_svcmds.c index 367953d8..ca093c8e 100644 --- a/src/game/g_svcmds.c +++ b/src/game/g_svcmds.c @@ -574,12 +574,12 @@ qboolean  ConsoleCommand( void )    {      if( Q_stricmp( cmd, "say" ) == 0 )      { -      G_SendCommandFromServer( -1, va( "print \"server: %s\n\"", ConcatArgs( 1 ) ) ); +      trap_SendServerCommand( -1, va( "print \"server: %s\n\"", ConcatArgs( 1 ) ) );        return qtrue;      }      // everything else will also be printed as a say command -    G_SendCommandFromServer( -1, va( "print \"server: %s\n\"", ConcatArgs( 0 ) ) ); +    trap_SendServerCommand( -1, va( "print \"server: %s\n\"", ConcatArgs( 0 ) ) );      return qtrue;    } diff --git a/src/game/g_target.c b/src/game/g_target.c index 60a090b6..1a32ce77 100644 --- a/src/game/g_target.c +++ b/src/game/g_target.c @@ -85,7 +85,7 @@ void Use_Target_Print( gentity_t *ent, gentity_t *other, gentity_t *activator )  {    if( activator->client && ( ent->spawnflags & 4 ) )    { -    G_SendCommandFromServer( activator-g_entities, va( "cp \"%s\"", ent->message ) ); +    trap_SendServerCommand( activator-g_entities, va( "cp \"%s\"", ent->message ) );      return;    } @@ -99,7 +99,7 @@ void Use_Target_Print( gentity_t *ent, gentity_t *other, gentity_t *activator )      return;    } -  G_SendCommandFromServer( -1, va("cp \"%s\"", ent->message ) ); +  trap_SendServerCommand( -1, va("cp \"%s\"", ent->message ) );  }  void SP_target_print( gentity_t *ent ) diff --git a/src/game/g_team.c b/src/game/g_team.c index 2f65d816..881ed35a 100644 --- a/src/game/g_team.c +++ b/src/game/g_team.c @@ -41,7 +41,7 @@ void QDECL PrintMsg( gentity_t *ent, const char *fmt, ... )    while( ( p = strchr( msg, '"' ) ) != NULL )      *p = '\''; -  G_SendCommandFromServer( ( ( ent == NULL ) ? -1 : ent-g_entities ), va( "print \"%s\"", msg ) ); +  trap_SendServerCommand( ( ( ent == NULL ) ? -1 : ent-g_entities ), va( "print \"%s\"", msg ) );  } @@ -211,7 +211,7 @@ void TeamplayInfoMessage( gentity_t *ent )      }    } -  G_SendCommandFromServer( ent - g_entities, va( "tinfo %i %s", cnt, string ) ); +  trap_SendServerCommand( ent - g_entities, va( "tinfo %i %s", cnt, string ) );  }  void CheckTeamStatus( void ) diff --git a/src/game/g_utils.c b/src/game/g_utils.c index 78c50a1a..9caaba76 100644 --- a/src/game/g_utils.c +++ b/src/game/g_utils.c @@ -163,7 +163,7 @@ void G_TeamCommand( pTeam_t team, char *cmd )      if( level.clients[ i ].pers.connected == CON_CONNECTED )      {        if( level.clients[ i ].ps.stats[ STAT_PTEAM ] == team ) -        G_SendCommandFromServer( i, va( "%s", cmd ) ); +        trap_SendServerCommand( i, va( "%s", cmd ) );      }    }  } @@ -709,204 +709,6 @@ qboolean G_ClientIsLagging( gclient_t *client )    return qfalse; //is a non-existant client lagging? woooo zen  } - -static commandQueue_t queuedCommands[ MAX_CLIENTS ]; - -/* -=============== -G_PopCommandQueue - -Return the front of a command queue -Must use immediately or copy to a buffer -=============== -*/ -static const char *G_PopCommandQueue( commandQueue_t *cq ) -{ -  if( cq->front ) -  { -    commandQueueElement_t *cqe = cq->front; - -    cq->front = cqe->next; - -    // last element in the queue -    if( cq->front == NULL ) -      cq->back = NULL; - -    cq->nextCommandTime = level.time + g_minCommandPeriod.integer; -    cqe->used = qfalse; - -    return cqe->command; -  } -  else -    return NULL; -} - -/* -=============== -G_PushCommandQueue - -Put a command on a command queue -=============== -*/ -static void G_PushCommandQueue( commandQueue_t *cq, const char *cmd ) -{ -  int i; - -  for( i = 0; i < MAX_QUEUE_COMMANDS; i++ ) -  { -    commandQueueElement_t *cqe = &cq->pool[ i ]; - -    if( !cqe->used ) -    { -      cqe->used = qtrue; -      cqe->next = NULL; -      Q_strncpyz( cqe->command, cmd, MAX_TOKEN_CHARS ); - -      if( cq->back ) -      { -        cq->back->next = cqe; -        cq->back = cqe; -      } -      else -      { -        cq->front = cqe; -        cq->back = cqe; -      } - -      return; -    } -  } - -  //drop the command -} - -/* -=============== -G_PrintCommandQueue -=============== -*/ -#if 0 //quiet compiler -static void G_PrintCommandQueue( commandQueue_t *cq ) -{ -  commandQueueElement_t *cqe; - -  if( cq->front ) -  { -    cqe = cq->front; - -    do -    { -      G_Printf( "->\"%s\"", cqe->command ); -    } while( ( cqe = cqe->next ) ); - -    G_Printf( "\n" ); -  } -} -#endif - -/* -=============== -G_ReadyToDequeue -=============== -*/ -static qboolean G_ReadyToDequeue( commandQueue_t *cq ) -{ -  if( !cq ) -    return qfalse; - -  return cq->front && cq->nextCommandTime <= level.time; -} - -/* -=============== -G_ProcessCommandQueues - -Check for any outstanding commands to be sent -=============== -*/ -void G_ProcessCommandQueues( void ) -{ -  int i; - -  for( i = 0; i < MAX_CLIENTS; i++ ) -  { -    gclient_t       *cl = &level.clients[ i ]; -    commandQueue_t  *cq = &queuedCommands[ i ]; - -    if( !G_ClientIsLagging( cl ) && G_ReadyToDequeue( cq ) ) -    { -      const char *command = G_PopCommandQueue( cq ); - -      if( command ) -        trap_SendServerCommand( i, command ); -    } -  } -} - -/* -=============== -G_InitCommandQueue -=============== -*/ -void G_InitCommandQueue( int clientNum ) -{ -  int             i; -  commandQueue_t  *cq = &queuedCommands[ clientNum ]; - -  if( clientNum >= 0 && clientNum < MAX_CLIENTS ) -  { -    cq->front = cq->back = NULL; -    cq->nextCommandTime = 0; - -    for( i = 0; i < MAX_QUEUE_COMMANDS; i++ ) -    { -      commandQueueElement_t *cqe = &cq->pool[ i ]; - -      cqe->used = qfalse; -    } -  } -} - -/* -=============== -G_SendCommandFromServer - -Sends a command to a client -=============== -*/ -void G_SendCommandFromServer( int clientNum, const char *cmd ) -{ -  commandQueue_t  *cq = &queuedCommands[ clientNum ]; - -  if( clientNum < 0 ) -    cq = NULL; - -  if( strlen( cmd ) > 1022 ) -  { -    G_LogPrintf( "G_SendCommandFromServer( %d, ... ) length exceeds 1022.\n", clientNum ); -    G_LogPrintf( "cmd [%s]\n", cmd ); -    return; -  } - -  if( cq ) -  { -    gclient_t *cl = &level.clients[ clientNum ]; - -    if( cq->nextCommandTime > level.time || G_ClientIsLagging( cl ) ) -    { -      //can't send yet, so queue the command up -      G_PushCommandQueue( cq, cmd ); -    } -    else -    { -      cq->nextCommandTime = level.time + g_minCommandPeriod.integer; -      trap_SendServerCommand( clientNum, cmd ); -    } -  } -  else //no queue exists for this client -    trap_SendServerCommand( clientNum, cmd ); -} -  //============================================================================== @@ -1017,7 +819,7 @@ void G_TriggerMenu( int clientNum, dynMenu_t menu )    char buffer[ 32 ];    Com_sprintf( buffer, 32, "servermenu %d", menu ); -  G_SendCommandFromServer( clientNum, buffer ); +  trap_SendServerCommand( clientNum, buffer );  } @@ -1033,7 +835,7 @@ void G_CloseMenus( int clientNum )    char buffer[ 32 ];    Com_sprintf( buffer, 32, "serverclosemenus" ); -  G_SendCommandFromServer( clientNum, buffer ); +  trap_SendServerCommand( clientNum, buffer );  } diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c index 11cc4f6a..ed7dea10 100644 --- a/src/game/g_weapon.c +++ b/src/game/g_weapon.c @@ -951,7 +951,7 @@ void poisonCloud( gentity_t *ent )          humanPlayer->client->ps.stats[ STAT_STATE ] |= SS_POISONCLOUDED;          humanPlayer->client->lastPoisonCloudedTime = level.time;          humanPlayer->client->lastPoisonCloudedClient = ent; -        G_SendCommandFromServer( humanPlayer->client->ps.clientNum, "poisoncloud" ); +        trap_SendServerCommand( humanPlayer->client->ps.clientNum, "poisoncloud" );        }      }    } diff --git a/src/server/server.h b/src/server/server.h index 8eb43550..bd37c262 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -171,6 +171,26 @@ typedef struct client_s {  	int				oldServerTime;  } client_t; +typedef struct commandQueueElement_s +{ +	qboolean											used; +	struct commandQueueElement_s	*next; +	char													command[ MAX_TOKEN_CHARS ]; +} commandQueueElement_t; + +typedef struct commandQueue_s +{ +	int									 nextCommandTime; //next time that the queue can be popped + +	int									 numElements; +	commandQueueElement_t *front; +	commandQueueElement_t *back; + +	commandQueueElement_t pool[ MAX_RELIABLE_COMMANDS ]; +} commandQueue_t; + +void SV_InitCommandQueue( int clientNum ); +  //============================================================================= @@ -244,6 +264,7 @@ extern	cvar_t	*sv_minPing;  extern	cvar_t	*sv_maxPing;  extern	cvar_t	*sv_pure;  extern	cvar_t	*sv_lanForceRate; +extern	cvar_t	*sv_dequeuePeriod;  //=========================================================== diff --git a/src/server/sv_client.c b/src/server/sv_client.c index 0272fab0..ffab3bfc 100644 --- a/src/server/sv_client.c +++ b/src/server/sv_client.c @@ -487,6 +487,7 @@ void SV_ClientEnterWorld( client_t *client, usercmd_t *cmd ) {  	ent = SV_GentityNum( clientNum );  	ent->s.number = clientNum;  	client->gentity = ent; +	SV_InitCommandQueue( clientNum );  	client->deltaMessage = -1;  	client->nextSnapshotTime = svs.time;	// generate a snapshot immediately diff --git a/src/server/sv_init.c b/src/server/sv_init.c index 251dfcac..c30b1228 100644 --- a/src/server/sv_init.c +++ b/src/server/sv_init.c @@ -610,6 +610,7 @@ void SV_Init (void) {  	sv_killserver = Cvar_Get ("sv_killserver", "0", 0);  	sv_mapChecksum = Cvar_Get ("sv_mapChecksum", "", CVAR_ROM);  	sv_lanForceRate = Cvar_Get ("sv_lanForceRate", "1", CVAR_ARCHIVE ); +	sv_dequeuePeriod = Cvar_Get ("sv_dequeuePeriod", "500", CVAR_ARCHIVE );  	// initialize bot cvars so they are listed and can be set before loading the botlib  	SV_BotInitCvars(); diff --git a/src/server/sv_main.c b/src/server/sv_main.c index f6d5a7c4..ba9bf2c6 100644 --- a/src/server/sv_main.c +++ b/src/server/sv_main.c @@ -50,6 +50,7 @@ cvar_t	*sv_minPing;  cvar_t	*sv_maxPing;  cvar_t	*sv_pure;  cvar_t	*sv_lanForceRate; // dedicated 1 (LAN) server forces local client rates to 99999 (bug #491) +cvar_t	*sv_dequeuePeriod;  /*  ============================================================================= @@ -150,6 +151,218 @@ void SV_AddServerCommand( client_t *client, const char *cmd ) {  	Q_strncpyz( client->reliableCommands[ index ], cmd, sizeof( client->reliableCommands[ index ] ) );  } +/* +============= +SV_ClientIsLagging +============= +*/ +qboolean SV_ClientIsLagging( client_t *client ) +{ +	if( client ) +	{ +		if( client->ping >= 999 ) +			return qtrue; +		else +			return qfalse; +	} + +	return qfalse; //is a non-existant client lagging? woooo zen +} + + +static commandQueue_t queuedCommands[ MAX_CLIENTS ]; + +/* +=============== +SV_PopCommandQueue + +Return the front of a command queue +Must use immediately or copy to a buffer +=============== +*/ +static const char *SV_PopCommandQueue( commandQueue_t *cq ) +{ +	if( cq->front ) +	{ +		commandQueueElement_t *cqe = cq->front; + +		cq->front = cqe->next; + +		// last element in the queue +		if( cq->front == NULL ) +			cq->back = NULL; + +		cq->nextCommandTime = svs.time + sv_dequeuePeriod->integer; +		cqe->used = qfalse; + +		return cqe->command; +	} +	else +		return NULL; +} + +/* +=============== +SV_PushCommandQueue + +Put a command on a command queue +=============== +*/ +static qboolean SV_PushCommandQueue( commandQueue_t *cq, const char *cmd ) +{ +	int i; + +	for( i = 0; i < MAX_RELIABLE_COMMANDS; i++ ) +	{ +		commandQueueElement_t *cqe = &cq->pool[ i ]; + +		if( !cqe->used ) +		{ +			cqe->used = qtrue; +			cqe->next = NULL; +			Q_strncpyz( cqe->command, cmd, MAX_TOKEN_CHARS ); + +			if( cq->back ) +			{ +				cq->back->next = cqe; +				cq->back = cqe; +			} +			else +			{ +				cq->front = cqe; +				cq->back = cqe; +			} + +			return qtrue; +		} +	} + +	// The queue is full, so the command cannot be queued up. +	// Consequently, the command must be dropped -- meaning it +	// is no longer reliable. +	return qfalse; +} + +/* +=============== +SV_PrintCommandQueue +=============== +*/ +#if 0 //quiet compiler +static void SV_PrintCommandQueue( commandQueue_t *cq ) +{ +	commandQueueElement_t *cqe; + +	if( cq->front ) +	{ +		cqe = cq->front; + +		do +		{ +			Com_Printf( "->\"%s\"", cqe->command ); +		} while( ( cqe = cqe->next ) ); + +		Com_Printf( "\n" ); +	} +} +#endif + +/* +=============== +SV_ReadyToDequeue +=============== +*/ +static qboolean SV_ReadyToDequeue( commandQueue_t *cq ) +{ +	if( !cq ) +		return qfalse; + +	return cq->front && cq->nextCommandTime <= svs.time; +} + +/* +=============== +SV_ProcessCommandQueues + +Check for any outstanding commands to be sent +=============== +*/ +void SV_ProcessCommandQueues( void ) +{ +	int i; + +	for( i = 0; i < MAX_CLIENTS; i++ ) +	{ +		client_t				*cl = &svs.clients[ i ]; +		commandQueue_t	*cq = &queuedCommands[ i ]; + +		if( !SV_ClientIsLagging( cl ) && SV_ReadyToDequeue( cq ) ) +		{ +			const char *command = SV_PopCommandQueue( cq ); + +			if( command ) +				SV_AddServerCommand( cl, command ); +		} +	} +} + +/* +=============== +SV_InitCommandQueue +=============== +*/ +void SV_InitCommandQueue( int clientNum ) +{ +	int						 i; +	commandQueue_t	*cq = &queuedCommands[ clientNum ]; + +	if( clientNum >= 0 && clientNum < MAX_CLIENTS ) +	{ +		cq->front = cq->back = NULL; +		cq->nextCommandTime = 0; + +		for( i = 0; i < MAX_RELIABLE_COMMANDS; i++ ) +		{ +			commandQueueElement_t *cqe = &cq->pool[ i ]; + +			cqe->used = qfalse; +		} +	} +} + +/* +=============== +SV_EnqueueServerCommand + +Sends a command to a client +=============== +*/ +void SV_EnqueueServerCommand( int clientNum, const char *cmd ) +{ +	commandQueue_t	*cq = &queuedCommands[ clientNum ]; +	client_t				*cl = &svs.clients[ clientNum ]; + +	if( clientNum < 0 ) +		cq = NULL; + +	if( cq ) +	{ +		if( cq->nextCommandTime > svs.time || SV_ClientIsLagging( cl ) ) +		{ +			//can't send yet, so queue the command up +			if( !SV_PushCommandQueue( cq, cmd ) ) +				SV_DropClient( cl, +						va( "Failed to enqueue reliable server command (%s)", cmd ) ); +		} +		else +		{ +			cq->nextCommandTime = svs.time + sv_dequeuePeriod->integer; +			SV_AddServerCommand( cl, cmd ); +		} +	} +	else //no queue exists for this client +		SV_AddServerCommand( cl, cmd ); +}  /*  ================= @@ -179,7 +392,7 @@ void QDECL SV_SendServerCommand(client_t *cl, const char *fmt, ...) {  	}  	if ( cl != NULL ) { -		SV_AddServerCommand( cl, (char *)message ); +		SV_EnqueueServerCommand( cl - svs.clients, (char *)message );  		return;  	} @@ -193,7 +406,7 @@ void QDECL SV_SendServerCommand(client_t *cl, const char *fmt, ...) {  		if ( client->state < CS_PRIMED ) {  			continue;  		} -		SV_AddServerCommand( client, (char *)message ); +		SV_EnqueueServerCommand( client - svs.clients, (char *)message );  	}  } @@ -871,6 +1084,8 @@ void SV_Frame( int msec ) {  		VM_Call (gvm, GAME_RUN_FRAME, sv.time);  	} +	SV_ProcessCommandQueues( ); +  	if ( com_speeds->integer ) {  		time_game = Sys_Milliseconds () - startTime;  	}  | 
