summaryrefslogtreecommitdiff
path: root/src/sv_user.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sv_user.c')
-rw-r--r--src/sv_user.c1087
1 files changed, 562 insertions, 525 deletions
diff --git a/src/sv_user.c b/src/sv_user.c
index c2d09a0..480d0f1 100644
--- a/src/sv_user.c
+++ b/src/sv_user.c
@@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
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.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
@@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "sv_local.h"
#if USE_FPS
-static void align_key_frames( void );
+static void align_key_frames(void);
#endif
/*
@@ -43,117 +43,122 @@ to the clients -- only the fields that differ from the
baseline will be transmitted
================
*/
-static void create_baselines( void ) {
+static void create_baselines(void)
+{
int i;
edict_t *ent;
entity_state_t *base, **chunk;
// clear baselines from previous level
- for( i = 0; i < SV_BASELINES_CHUNKS; i++ ) {
+ for (i = 0; i < SV_BASELINES_CHUNKS; i++) {
base = sv_client->baselines[i];
- if( !base ) {
+ if (!base) {
continue;
- }
- memset( base, 0, sizeof( *base ) * SV_BASELINES_PER_CHUNK );
+ }
+ memset(base, 0, sizeof(*base) * SV_BASELINES_PER_CHUNK);
}
- for( i = 1; i < sv_client->pool->num_edicts; i++ ) {
- ent = EDICT_POOL( sv_client, i );
+ for (i = 1; i < sv_client->pool->num_edicts; i++) {
+ ent = EDICT_POOL(sv_client, i);
- if( ( g_features->integer & GMF_PROPERINUSE ) && !ent->inuse ) {
+ if ((g_features->integer & GMF_PROPERINUSE) && !ent->inuse) {
continue;
}
- if( !ES_INUSE( &ent->s ) ) {
+ if (!ES_INUSE(&ent->s)) {
continue;
}
ent->s.number = i;
chunk = &sv_client->baselines[i >> SV_BASELINES_SHIFT];
- if( *chunk == NULL ) {
- *chunk = SV_Mallocz( sizeof( *base ) * SV_BASELINES_PER_CHUNK );
+ if (*chunk == NULL) {
+ *chunk = SV_Mallocz(sizeof(*base) * SV_BASELINES_PER_CHUNK);
}
- base = *chunk + ( i & SV_BASELINES_MASK );
+ base = *chunk + (i & SV_BASELINES_MASK);
*base = ent->s;
- if( sv_client->esFlags & MSG_ES_LONGSOLID ) {
+ if (sv_client->esFlags & MSG_ES_LONGSOLID) {
base->solid = sv.entities[i].solid32;
}
}
}
-static void write_plain_configstrings( void ) {
+static void write_plain_configstrings(void)
+{
int i;
char *string;
size_t length;
// write a packet full of data
string = sv_client->configstrings;
- for( i = 0; i < MAX_CONFIGSTRINGS; i++, string += MAX_QPATH ) {
- if( !string[0] ) {
+ for (i = 0; i < MAX_CONFIGSTRINGS; i++, string += MAX_QPATH) {
+ if (!string[0]) {
continue;
}
- length = strlen( string );
- if( length > MAX_QPATH ) {
+ length = strlen(string);
+ if (length > MAX_QPATH) {
length = MAX_QPATH;
}
// check if this configstring will overflow
- if( msg_write.cursize + length + 64 > sv_client->netchan->maxpacketlen ) {
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ if (msg_write.cursize + length + 64 > sv_client->netchan->maxpacketlen) {
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
}
- MSG_WriteByte( svc_configstring );
- MSG_WriteShort( i );
- MSG_WriteData( string, length );
- MSG_WriteByte( 0 );
+ MSG_WriteByte(svc_configstring);
+ MSG_WriteShort(i);
+ MSG_WriteData(string, length);
+ MSG_WriteByte(0);
}
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
}
-static void write_baseline( entity_state_t *base ) {
+static void write_baseline(entity_state_t *base)
+{
msgEsFlags_t flags = sv_client->esFlags | MSG_ES_FORCE;
- if( Q2PRO_SHORTANGLES( sv_client, base->number ) ) {
+ if (Q2PRO_SHORTANGLES(sv_client, base->number)) {
flags |= MSG_ES_SHORTANGLES;
}
- MSG_WriteDeltaEntity( NULL, base, flags );
+ MSG_WriteDeltaEntity(NULL, base, flags);
}
-static void write_plain_baselines( void ) {
+static void write_plain_baselines(void)
+{
int i, j;
entity_state_t *base;
// write a packet full of data
- for( i = 0; i < SV_BASELINES_CHUNKS; i++ ) {
+ for (i = 0; i < SV_BASELINES_CHUNKS; i++) {
base = sv_client->baselines[i];
- if( !base ) {
+ if (!base) {
continue;
}
- for( j = 0; j < SV_BASELINES_PER_CHUNK; j++ ) {
- if( base->number ) {
+ for (j = 0; j < SV_BASELINES_PER_CHUNK; j++) {
+ if (base->number) {
// check if this baseline will overflow
- if( msg_write.cursize + 64 > sv_client->netchan->maxpacketlen ) {
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ if (msg_write.cursize + 64 > sv_client->netchan->maxpacketlen) {
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
}
- MSG_WriteByte( svc_spawnbaseline );
- write_baseline( base );
+ MSG_WriteByte(svc_spawnbaseline);
+ write_baseline(base);
}
base++;
}
}
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
}
#if USE_ZLIB
-static void write_compressed_gamestate( void ) {
+static void write_compressed_gamestate(void)
+{
sizebuf_t *buf = &sv_client->netchan->message;
entity_state_t *base;
int i, j;
@@ -161,187 +166,192 @@ static void write_compressed_gamestate( void ) {
uint8_t *patch;
char *string;
- MSG_WriteByte( svc_gamestate );
+ MSG_WriteByte(svc_gamestate);
// write configstrings
string = sv_client->configstrings;
- for( i = 0; i < MAX_CONFIGSTRINGS; i++, string += MAX_QPATH ) {
- if( !string[0] ) {
+ for (i = 0; i < MAX_CONFIGSTRINGS; i++, string += MAX_QPATH) {
+ if (!string[0]) {
continue;
}
- length = strlen( string );
- if( length > MAX_QPATH ) {
+ length = strlen(string);
+ if (length > MAX_QPATH) {
length = MAX_QPATH;
}
- MSG_WriteShort( i );
- MSG_WriteData( string, length );
- MSG_WriteByte( 0 );
+ MSG_WriteShort(i);
+ MSG_WriteData(string, length);
+ MSG_WriteByte(0);
}
- MSG_WriteShort( MAX_CONFIGSTRINGS ); // end of configstrings
+ MSG_WriteShort(MAX_CONFIGSTRINGS); // end of configstrings
// write baselines
- for( i = 0; i < SV_BASELINES_CHUNKS; i++ ) {
+ for (i = 0; i < SV_BASELINES_CHUNKS; i++) {
base = sv_client->baselines[i];
- if( !base ) {
+ if (!base) {
continue;
}
- for( j = 0; j < SV_BASELINES_PER_CHUNK; j++ ) {
- if( base->number ) {
- write_baseline( base );
+ for (j = 0; j < SV_BASELINES_PER_CHUNK; j++) {
+ if (base->number) {
+ write_baseline(base);
}
base++;
}
}
- MSG_WriteShort( 0 ); // end of baselines
+ MSG_WriteShort(0); // end of baselines
- SZ_WriteByte( buf, svc_zpacket );
- patch = SZ_GetSpace( buf, 2 );
- SZ_WriteShort( buf, msg_write.cursize );
+ SZ_WriteByte(buf, svc_zpacket);
+ patch = SZ_GetSpace(buf, 2);
+ SZ_WriteShort(buf, msg_write.cursize);
- deflateReset( &svs.z );
+ deflateReset(&svs.z);
svs.z.next_in = msg_write.data;
- svs.z.avail_in = ( uInt )msg_write.cursize;
+ svs.z.avail_in = (uInt)msg_write.cursize;
svs.z.next_out = buf->data + buf->cursize;
- svs.z.avail_out = ( uInt )( buf->maxsize - buf->cursize );
- SZ_Clear( &msg_write );
+ svs.z.avail_out = (uInt)(buf->maxsize - buf->cursize);
+ SZ_Clear(&msg_write);
- if( deflate( &svs.z, Z_FINISH ) != Z_STREAM_END ) {
- SV_DropClient( sv_client, "deflate() failed on gamestate" );
+ if (deflate(&svs.z, Z_FINISH) != Z_STREAM_END) {
+ SV_DropClient(sv_client, "deflate() failed on gamestate");
return;
}
- SV_DPrintf( 0, "%s: comp: %lu into %lu\n",
- sv_client->name, svs.z.total_in, svs.z.total_out );
+ SV_DPrintf(0, "%s: comp: %lu into %lu\n",
+ sv_client->name, svs.z.total_in, svs.z.total_out);
patch[0] = svs.z.total_out & 255;
- patch[1] = ( svs.z.total_out >> 8 ) & 255;
+ patch[1] = (svs.z.total_out >> 8) & 255;
buf->cursize += svs.z.total_out;
}
-static inline int z_flush( byte *buffer ) {
+static inline int z_flush(byte *buffer)
+{
int ret;
- ret = deflate( &svs.z, Z_FINISH );
- if( ret != Z_STREAM_END ) {
+ ret = deflate(&svs.z, Z_FINISH);
+ if (ret != Z_STREAM_END) {
return ret;
}
- SV_DPrintf( 0, "%s: comp: %lu into %lu\n",
- sv_client->name, svs.z.total_in, svs.z.total_out );
+ SV_DPrintf(0, "%s: comp: %lu into %lu\n",
+ sv_client->name, svs.z.total_in, svs.z.total_out);
+
+ MSG_WriteByte(svc_zpacket);
+ MSG_WriteShort(svs.z.total_out);
+ MSG_WriteShort(svs.z.total_in);
+ MSG_WriteData(buffer, svs.z.total_out);
- MSG_WriteByte( svc_zpacket );
- MSG_WriteShort( svs.z.total_out );
- MSG_WriteShort( svs.z.total_in );
- MSG_WriteData( buffer, svs.z.total_out );
-
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
return ret;
}
-static inline void z_reset( byte *buffer ) {
- deflateReset( &svs.z );
+static inline void z_reset(byte *buffer)
+{
+ deflateReset(&svs.z);
svs.z.next_out = buffer;
- svs.z.avail_out = ( uInt )( sv_client->netchan->maxpacketlen - 5 );
+ svs.z.avail_out = (uInt)(sv_client->netchan->maxpacketlen - 5);
}
-static void write_compressed_configstrings( void ) {
+static void write_compressed_configstrings(void)
+{
int i;
size_t length;
byte buffer[MAX_PACKETLEN_WRITABLE];
char *string;
- z_reset( buffer );
+ z_reset(buffer);
// write a packet full of data
string = sv_client->configstrings;
- for( i = 0; i < MAX_CONFIGSTRINGS; i++, string += MAX_QPATH ) {
- if( !string[0] ) {
+ for (i = 0; i < MAX_CONFIGSTRINGS; i++, string += MAX_QPATH) {
+ if (!string[0]) {
continue;
}
- length = strlen( string );
- if( length > MAX_QPATH ) {
+ length = strlen(string);
+ if (length > MAX_QPATH) {
length = MAX_QPATH;
}
// check if this configstring will overflow
- if( svs.z.avail_out < length + 32 ) {
+ if (svs.z.avail_out < length + 32) {
// then flush compressed data
- if( z_flush( buffer ) != Z_STREAM_END ) {
+ if (z_flush(buffer) != Z_STREAM_END) {
goto fail;
}
- z_reset( buffer );
+ z_reset(buffer);
}
- MSG_WriteByte( svc_configstring );
- MSG_WriteShort( i );
- MSG_WriteData( string, length );
- MSG_WriteByte( 0 );
+ MSG_WriteByte(svc_configstring);
+ MSG_WriteShort(i);
+ MSG_WriteData(string, length);
+ MSG_WriteByte(0);
svs.z.next_in = msg_write.data;
- svs.z.avail_in = ( uInt )msg_write.cursize;
- SZ_Clear( &msg_write );
+ svs.z.avail_in = (uInt)msg_write.cursize;
+ SZ_Clear(&msg_write);
- if( deflate( &svs.z, Z_SYNC_FLUSH ) != Z_OK ) {
+ if (deflate(&svs.z, Z_SYNC_FLUSH) != Z_OK) {
goto fail;
}
}
// finally flush all remaining compressed data
- if( z_flush( buffer ) != Z_STREAM_END ) {
+ if (z_flush(buffer) != Z_STREAM_END) {
fail:
- SV_DropClient( sv_client, "deflate() failed on configstrings" );
+ SV_DropClient(sv_client, "deflate() failed on configstrings");
}
}
#endif // USE_ZLIB
-static void stuff_cmds( list_t *list ) {
+static void stuff_cmds(list_t *list)
+{
stuffcmd_t *stuff;
- LIST_FOR_EACH( stuffcmd_t, stuff, list, entry ) {
- MSG_WriteByte( svc_stufftext );
- MSG_WriteData( stuff->string, stuff->len );
- MSG_WriteByte( '\n' );
- MSG_WriteByte( 0 );
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ LIST_FOR_EACH(stuffcmd_t, stuff, list, entry) {
+ MSG_WriteByte(svc_stufftext);
+ MSG_WriteData(stuff->string, stuff->len);
+ MSG_WriteByte('\n');
+ MSG_WriteByte(0);
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
}
}
-static void stuff_junk( void ) {
+static void stuff_junk(void)
+{
static const char junkchars[] =
"!~#``&'()*`+,-./~01~2`3`4~5`67`89:~<=`>?@~ab~c"
"d`ef~j~k~lm`no~pq`rst`uv`w``x`yz[`\\]^_`|~";
char junk[8][16];
int i, j, k;
- for( i = 0; i < 8; i++ ) {
- for( j = 0; j < 15; j++ ) {
- k = rand_byte() % ( sizeof( junkchars ) - 1 );
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < 15; j++) {
+ k = rand_byte() % (sizeof(junkchars) - 1);
junk[i][j] = junkchars[k];
}
junk[i][15] = 0;
}
- strcpy( sv_client->reconnect_var, junk[2] );
- strcpy( sv_client->reconnect_val, junk[3] );
+ strcpy(sv_client->reconnect_var, junk[2]);
+ strcpy(sv_client->reconnect_val, junk[3]);
- SV_ClientCommand( sv_client, "set %s set\n", junk[0] );
- SV_ClientCommand( sv_client, "$%s %s connect\n", junk[0], junk[1] );
- if( rand_byte() & 1 ) {
- SV_ClientCommand( sv_client, "$%s %s %s\n", junk[0], junk[2], junk[3] );
- SV_ClientCommand( sv_client, "$%s %s %s\n", junk[0], junk[4],
- sv_force_reconnect->string );
- SV_ClientCommand( sv_client, "$%s %s %s\n", junk[0], junk[5], junk[6] );
+ SV_ClientCommand(sv_client, "set %s set\n", junk[0]);
+ SV_ClientCommand(sv_client, "$%s %s connect\n", junk[0], junk[1]);
+ if (rand_byte() & 1) {
+ SV_ClientCommand(sv_client, "$%s %s %s\n", junk[0], junk[2], junk[3]);
+ SV_ClientCommand(sv_client, "$%s %s %s\n", junk[0], junk[4],
+ sv_force_reconnect->string);
+ SV_ClientCommand(sv_client, "$%s %s %s\n", junk[0], junk[5], junk[6]);
} else {
- SV_ClientCommand( sv_client, "$%s %s %s\n", junk[0], junk[4],
- sv_force_reconnect->string );
- SV_ClientCommand( sv_client, "$%s %s %s\n", junk[0], junk[5], junk[6] );
- SV_ClientCommand( sv_client, "$%s %s %s\n", junk[0], junk[2], junk[3] );
+ SV_ClientCommand(sv_client, "$%s %s %s\n", junk[0], junk[4],
+ sv_force_reconnect->string);
+ SV_ClientCommand(sv_client, "$%s %s %s\n", junk[0], junk[5], junk[6]);
+ SV_ClientCommand(sv_client, "$%s %s %s\n", junk[0], junk[2], junk[3]);
}
- SV_ClientCommand( sv_client, "$%s %s \"\"\n", junk[0], junk[0] );
- SV_ClientCommand( sv_client, "$%s $%s\n", junk[1], junk[4] );
+ SV_ClientCommand(sv_client, "$%s %s \"\"\n", junk[0], junk[0]);
+ SV_ClientCommand(sv_client, "$%s $%s\n", junk[1], junk[4]);
}
/*
@@ -352,101 +362,101 @@ Sends the first message from the server to a connected client.
This will be sent on the initial connection and upon each server load.
================
*/
-void SV_New_f( void ) {
+void SV_New_f(void)
+{
clstate_t oldstate;
- Com_DPrintf( "New() from %s\n", sv_client->name );
+ Com_DPrintf("New() from %s\n", sv_client->name);
oldstate = sv_client->state;
- if( sv_client->state < cs_connected ) {
- Com_DPrintf( "Going from cs_assigned to cs_connected for %s\n",
- sv_client->name );
+ if (sv_client->state < cs_connected) {
+ Com_DPrintf("Going from cs_assigned to cs_connected for %s\n",
+ sv_client->name);
sv_client->state = cs_connected;
sv_client->lastmessage = svs.realtime; // don't timeout
- time( &sv_client->connect_time );
- } else if( sv_client->state > cs_connected ) {
- Com_DPrintf( "New not valid -- already primed\n" );
+ time(&sv_client->connect_time);
+ } else if (sv_client->state > cs_connected) {
+ Com_DPrintf("New not valid -- already primed\n");
return;
}
// stuff some junk, drop them and expect them to be back soon
- if( sv_force_reconnect->string[0] && !sv_client->reconnect_var[0] &&
- !NET_IsLocalAddress( &sv_client->netchan->remote_address ) )
- {
+ if (sv_force_reconnect->string[0] && !sv_client->reconnect_var[0] &&
+ !NET_IsLocalAddress(&sv_client->netchan->remote_address)) {
stuff_junk();
- SV_DropClient( sv_client, NULL );
+ SV_DropClient(sv_client, NULL);
return;
}
- SV_ClientCommand( sv_client, "\n" );
+ SV_ClientCommand(sv_client, "\n");
//
// serverdata needs to go over for all types of servers
// to make sure the protocol is right, and to set the gamedir
//
-
+
// create baselines for this client
create_baselines();
// send the serverdata
- MSG_WriteByte( svc_serverdata );
- MSG_WriteLong( sv_client->protocol );
- MSG_WriteLong( sv_client->spawncount );
- MSG_WriteByte( 0 ); // no attract loop
- MSG_WriteString( sv_client->gamedir );
- MSG_WriteShort( sv_client->slot );
- MSG_WriteString( &sv_client->configstrings[CS_NAME*MAX_QPATH] );
+ MSG_WriteByte(svc_serverdata);
+ MSG_WriteLong(sv_client->protocol);
+ MSG_WriteLong(sv_client->spawncount);
+ MSG_WriteByte(0); // no attract loop
+ MSG_WriteString(sv_client->gamedir);
+ MSG_WriteShort(sv_client->slot);
+ MSG_WriteString(&sv_client->configstrings[CS_NAME * MAX_QPATH]);
// send protocol specific stuff
- switch( sv_client->protocol ) {
+ switch (sv_client->protocol) {
case PROTOCOL_VERSION_R1Q2:
- MSG_WriteByte( 0 ); // not enhanced
- MSG_WriteShort( sv_client->version );
- MSG_WriteByte( 0 ); // no advanced deltas
- MSG_WriteByte( sv_client->pmp.strafehack );
+ MSG_WriteByte(0); // not enhanced
+ MSG_WriteShort(sv_client->version);
+ MSG_WriteByte(0); // no advanced deltas
+ MSG_WriteByte(sv_client->pmp.strafehack);
break;
case PROTOCOL_VERSION_Q2PRO:
- MSG_WriteShort( sv_client->version );
- MSG_WriteByte( 2 ); // used to be GT_DEATHMATCH
- MSG_WriteByte( sv_client->pmp.strafehack );
- MSG_WriteByte( sv_client->pmp.qwmode );
- if( sv_client->version >= PROTOCOL_VERSION_Q2PRO_WATERJUMP_HACK ) {
- MSG_WriteByte( sv_client->pmp.waterhack );
+ MSG_WriteShort(sv_client->version);
+ MSG_WriteByte(2); // used to be GT_DEATHMATCH
+ MSG_WriteByte(sv_client->pmp.strafehack);
+ MSG_WriteByte(sv_client->pmp.qwmode);
+ if (sv_client->version >= PROTOCOL_VERSION_Q2PRO_WATERJUMP_HACK) {
+ MSG_WriteByte(sv_client->pmp.waterhack);
}
break;
default:
break;
}
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
- SV_ClientCommand( sv_client, "\n" );
+ SV_ClientCommand(sv_client, "\n");
// send version string request
- if( oldstate == cs_assigned ) {
- SV_ClientCommand( sv_client, "cmd \177c version $version\n"
+ if (oldstate == cs_assigned) {
+ SV_ClientCommand(sv_client, "cmd \177c version $version\n"
#if USE_AC_SERVER
- "cmd \177c actoken $actoken\n"
+ "cmd \177c actoken $actoken\n"
#endif
- );
- stuff_cmds( &sv_cmdlist_connect );
+ );
+ stuff_cmds(&sv_cmdlist_connect);
}
// send reconnect var request
- if( sv_force_reconnect->string[0] && !sv_client->reconnected ) {
- SV_ClientCommand( sv_client, "cmd \177c connect $%s\n",
- sv_client->reconnect_var );
+ if (sv_force_reconnect->string[0] && !sv_client->reconnected) {
+ SV_ClientCommand(sv_client, "cmd \177c connect $%s\n",
+ sv_client->reconnect_var);
}
- Com_DPrintf( "Going from cs_connected to cs_primed for %s\n",
- sv_client->name );
+ Com_DPrintf("Going from cs_connected to cs_primed for %s\n",
+ sv_client->name);
sv_client->state = cs_primed;
- memset( &sv_client->lastcmd, 0, sizeof( sv_client->lastcmd ) );
+ memset(&sv_client->lastcmd, 0, sizeof(sv_client->lastcmd));
#if USE_ZLIB
- if( sv_client->has_zlib ) {
- if( sv_client->netchan->type == NETCHAN_NEW ) {
+ if (sv_client->has_zlib) {
+ if (sv_client->netchan->type == NETCHAN_NEW) {
write_compressed_gamestate();
} else {
// FIXME: Z_SYNC_FLUSH is not efficient for baselines
@@ -461,7 +471,7 @@ void SV_New_f( void ) {
}
// send next command
- SV_ClientCommand( sv_client, "precache %i\n", sv_client->spawncount );
+ SV_ClientCommand(sv_client, "precache %i\n", sv_client->spawncount);
}
/*
@@ -469,38 +479,39 @@ void SV_New_f( void ) {
SV_Begin_f
==================
*/
-void SV_Begin_f( void ) {
- Com_DPrintf( "Begin() from %s\n", sv_client->name );
+void SV_Begin_f(void)
+{
+ Com_DPrintf("Begin() from %s\n", sv_client->name);
// handle the case of a level changing while a client was connecting
- if( sv_client->state < cs_primed ) {
- Com_DPrintf( "Begin not valid -- not yet primed\n" );
+ if (sv_client->state < cs_primed) {
+ Com_DPrintf("Begin not valid -- not yet primed\n");
SV_New_f();
return;
}
- if( sv_client->state > cs_primed ) {
- Com_DPrintf( "Begin not valid -- already spawned\n" );
+ if (sv_client->state > cs_primed) {
+ Com_DPrintf("Begin not valid -- already spawned\n");
return;
}
- if( !sv_client->versionString ) {
- SV_DropClient( sv_client, "!failed version probe" );
+ if (!sv_client->versionString) {
+ SV_DropClient(sv_client, "!failed version probe");
return;
}
- if( sv_force_reconnect->string[0] && !sv_client->reconnected ) {
- SV_DropClient( sv_client, "!failed to reconnect" );
+ if (sv_force_reconnect->string[0] && !sv_client->reconnected) {
+ SV_DropClient(sv_client, "!failed to reconnect");
return;
}
#if USE_AC_SERVER
- if( !AC_ClientBegin( sv_client ) ) {
+ if (!AC_ClientBegin(sv_client)) {
return;
}
#endif
- Com_DPrintf( "Going from cs_primed to cs_spawned for %s\n",
- sv_client->name );
+ Com_DPrintf("Going from cs_primed to cs_spawned for %s\n",
+ sv_client->name);
sv_client->state = cs_spawned;
sv_client->send_delta = 0;
sv_client->commandMsec = 1800;
@@ -510,13 +521,13 @@ void SV_Begin_f( void ) {
align_key_frames();
#endif
- stuff_cmds( &sv_cmdlist_begin );
-
+ stuff_cmds(&sv_cmdlist_begin);
+
// call the game begin function
- ge->ClientBegin( sv_player );
+ ge->ClientBegin(sv_player);
#if USE_AC_SERVER
- AC_ClientAnnounce( sv_client );
+ AC_ClientAnnounce(sv_client);
#endif
}
@@ -524,13 +535,14 @@ void SV_Begin_f( void ) {
#define MAX_DOWNLOAD_CHUNK 1024
-void SV_CloseDownload( client_t *client ) {
- if( client->download ) {
- Z_Free( client->download );
+void SV_CloseDownload(client_t *client)
+{
+ if (client->download) {
+ Z_Free(client->download);
client->download = NULL;
}
- if( client->downloadname ) {
- Z_Free( client->downloadname );
+ if (client->downloadname) {
+ Z_Free(client->downloadname);
client->downloadname = NULL;
}
client->downloadsize = 0;
@@ -542,38 +554,39 @@ void SV_CloseDownload( client_t *client ) {
SV_NextDownload_f
==================
*/
-static void SV_NextDownload_f( void ) {
+static void SV_NextDownload_f(void)
+{
int r;
int percent;
int size;
- if ( !sv_client->download )
+ if (!sv_client->download)
return;
r = sv_client->downloadsize - sv_client->downloadcount;
- if ( r > MAX_DOWNLOAD_CHUNK )
+ if (r > MAX_DOWNLOAD_CHUNK)
r = MAX_DOWNLOAD_CHUNK;
- MSG_WriteByte( svc_download );
- MSG_WriteShort( r );
+ MSG_WriteByte(svc_download);
+ MSG_WriteShort(r);
sv_client->downloadcount += r;
size = sv_client->downloadsize;
- if( !size )
+ if (!size)
size = 1;
- percent = sv_client->downloadcount*100/size;
- MSG_WriteByte( percent );
- MSG_WriteData( sv_client->download + sv_client->downloadcount - r, r );
+ percent = sv_client->downloadcount * 100 / size;
+ MSG_WriteByte(percent);
+ MSG_WriteData(sv_client->download + sv_client->downloadcount - r, r);
- if( sv_client->downloadcount == sv_client->downloadsize ) {
- SV_CloseDownload( sv_client );
+ if (sv_client->downloadcount == sv_client->downloadsize) {
+ SV_CloseDownload(sv_client);
#if USE_FPS
- if( sv_client->state == cs_spawned )
+ if (sv_client->state == cs_spawned)
align_key_frames();
#endif
}
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
}
/*
@@ -581,7 +594,8 @@ static void SV_NextDownload_f( void ) {
SV_BeginDownload_f
==================
*/
-static void SV_BeginDownload_f( void ) {
+static void SV_BeginDownload_f(void)
+{
char name[MAX_QPATH];
byte *download;
ssize_t downloadsize, maxdownloadsize, result;
@@ -591,170 +605,170 @@ static void SV_BeginDownload_f( void ) {
unsigned flags;
qhandle_t f;
- len = Cmd_ArgvBuffer( 1, name, sizeof( name ) );
- if( len >= MAX_QPATH ) {
+ len = Cmd_ArgvBuffer(1, name, sizeof(name));
+ if (len >= MAX_QPATH) {
goto fail1;
}
// hack for 'status' command
- if( !strcmp( name, "http" ) ) {
+ if (!strcmp(name, "http")) {
sv_client->http_download = qtrue;
return;
}
- len = FS_NormalizePath( name, name );
+ len = FS_NormalizePath(name, name);
- if( Cmd_Argc() > 2 )
- offset = atoi( Cmd_Argv( 2 ) ); // downloaded offset
+ if (Cmd_Argc() > 2)
+ offset = atoi(Cmd_Argv(2)); // downloaded offset
// hacked by zoid to allow more conrol over download
// first off, no .. or global allow check
- if( !allow_download->integer
+ if (!allow_download->integer
// check for empty paths
|| !len
// check for illegal negative offsets
|| offset < 0
// don't allow anything with .. path
- || strstr( name, ".." )
+ || strstr(name, "..")
// leading dots, slashes, etc are no good
- || !Q_ispath( name[0] )
+ || !Q_ispath(name[0])
// trailing dots, slashes, etc are no good
- || !Q_ispath( name[ len - 1 ] )
- // MUST be in a subdirectory
- || !strchr( name, '/' ) )
- {
- Com_DPrintf( "Refusing download of %s to %s\n", name, sv_client->name );
+ || !Q_ispath(name[len - 1])
+ // MUST be in a subdirectory
+ || !strchr(name, '/')) {
+ Com_DPrintf("Refusing download of %s to %s\n", name, sv_client->name);
goto fail1;
}
- if( FS_pathcmpn( name, CONST_STR_LEN( "players/" ) ) == 0 ) {
+ if (FS_pathcmpn(name, CONST_STR_LEN("players/")) == 0) {
allow = allow_download_players;
- } else if( FS_pathcmpn( name, CONST_STR_LEN( "models/" ) ) == 0 ||
- FS_pathcmpn( name, CONST_STR_LEN( "sprites/" ) ) == 0 )
- {
+ } else if (FS_pathcmpn(name, CONST_STR_LEN("models/")) == 0 ||
+ FS_pathcmpn(name, CONST_STR_LEN("sprites/")) == 0) {
allow = allow_download_models;
- } else if( FS_pathcmpn( name, CONST_STR_LEN( "sound/" ) ) == 0 ) {
+ } else if (FS_pathcmpn(name, CONST_STR_LEN("sound/")) == 0) {
allow = allow_download_sounds;
- } else if( FS_pathcmpn( name, CONST_STR_LEN( "maps/" ) ) == 0 ) {
+ } else if (FS_pathcmpn(name, CONST_STR_LEN("maps/")) == 0) {
allow = allow_download_maps;
- } else if( FS_pathcmpn( name, CONST_STR_LEN( "textures/" ) ) == 0 ||
- FS_pathcmpn( name, CONST_STR_LEN( "env/" ) ) == 0 )
- {
+ } else if (FS_pathcmpn(name, CONST_STR_LEN("textures/")) == 0 ||
+ FS_pathcmpn(name, CONST_STR_LEN("env/")) == 0) {
allow = allow_download_textures;
- } else if( FS_pathcmpn( name, CONST_STR_LEN( "pics/" ) ) == 0 ) {
+ } else if (FS_pathcmpn(name, CONST_STR_LEN("pics/")) == 0) {
allow = allow_download_pics;
} else {
allow = allow_download_others;
}
- if( !allow->integer ) {
- Com_DPrintf( "Refusing download of %s to %s\n", name, sv_client->name );
+ if (!allow->integer) {
+ Com_DPrintf("Refusing download of %s to %s\n", name, sv_client->name);
goto fail1;
}
- if( sv_client->download ) {
- Com_DPrintf( "Closing existing download for %s (should not happen)\n", sv_client->name );
- SV_CloseDownload( sv_client );
+ if (sv_client->download) {
+ Com_DPrintf("Closing existing download for %s (should not happen)\n", sv_client->name);
+ SV_CloseDownload(sv_client);
}
flags = FS_MODE_READ;
// special check for maps, if it came from a pak file, don't allow
// download ZOID
- if( allow == allow_download_maps && allow->integer < 2 ) {
+ if (allow == allow_download_maps && allow->integer < 2) {
flags |= FS_TYPE_REAL;
}
- downloadsize = FS_FOpenFile( name, &f, flags );
- if( !f ) {
- Com_DPrintf( "Couldn't download %s to %s\n", name, sv_client->name );
+ downloadsize = FS_FOpenFile(name, &f, flags);
+ if (!f) {
+ Com_DPrintf("Couldn't download %s to %s\n", name, sv_client->name);
goto fail1;
}
maxdownloadsize = MAX_LOADFILE;
-// if( sv_max_download_size->integer ) {
-// maxdownloadsize = Cvar_ClampInteger( sv_max_download_size, 1, MAX_LOADFILE );
-// }
+#if 0
+ if (sv_max_download_size->integer) {
+ maxdownloadsize = Cvar_ClampInteger(sv_max_download_size, 1, MAX_LOADFILE);
+ }
+#endif
- if( downloadsize > maxdownloadsize ) {
- Com_DPrintf( "Refusing oversize download of %s to %s\n", name, sv_client->name );
+ if (downloadsize > maxdownloadsize) {
+ Com_DPrintf("Refusing oversize download of %s to %s\n", name, sv_client->name);
goto fail2;
}
- if( offset > downloadsize ) {
- Com_DPrintf( "Refusing download, %s has wrong version of %s (%d > %d)\n",
- sv_client->name, name, offset, (int)downloadsize );
- SV_ClientPrintf( sv_client, PRINT_HIGH, "File size differs from server.\n"
- "Please delete the corresponding .tmp file from your system.\n" );
+ if (offset > downloadsize) {
+ Com_DPrintf("Refusing download, %s has wrong version of %s (%d > %d)\n",
+ sv_client->name, name, offset, (int)downloadsize);
+ SV_ClientPrintf(sv_client, PRINT_HIGH, "File size differs from server.\n"
+ "Please delete the corresponding .tmp file from your system.\n");
goto fail2;
}
- if( offset == downloadsize ) {
- Com_DPrintf( "Refusing download, %s already has %s (%d bytes)\n",
- sv_client->name, name, offset );
- FS_FCloseFile( f );
- MSG_WriteByte( svc_download );
- MSG_WriteShort( 0 );
- MSG_WriteByte( 100 );
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ if (offset == downloadsize) {
+ Com_DPrintf("Refusing download, %s already has %s (%d bytes)\n",
+ sv_client->name, name, offset);
+ FS_FCloseFile(f);
+ MSG_WriteByte(svc_download);
+ MSG_WriteShort(0);
+ MSG_WriteByte(100);
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
return;
}
- download = SV_Malloc( downloadsize );
- result = FS_Read( download, downloadsize, f );
- if( result != downloadsize ) {
- Com_DPrintf( "Couldn't download %s to %s\n", name, sv_client->name );
+ download = SV_Malloc(downloadsize);
+ result = FS_Read(download, downloadsize, f);
+ if (result != downloadsize) {
+ Com_DPrintf("Couldn't download %s to %s\n", name, sv_client->name);
goto fail3;
}
- FS_FCloseFile( f );
+ FS_FCloseFile(f);
sv_client->download = download;
sv_client->downloadsize = downloadsize;
sv_client->downloadcount = offset;
- sv_client->downloadname = SV_CopyString( name );
+ sv_client->downloadname = SV_CopyString(name);
- Com_DPrintf( "Downloading %s to %s\n", name, sv_client->name );
+ Com_DPrintf("Downloading %s to %s\n", name, sv_client->name);
SV_NextDownload_f();
return;
fail3:
- Z_Free( download );
+ Z_Free(download);
fail2:
- FS_FCloseFile( f );
+ FS_FCloseFile(f);
fail1:
- MSG_WriteByte( svc_download );
- MSG_WriteShort( -1 );
- MSG_WriteByte( 0 );
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ MSG_WriteByte(svc_download);
+ MSG_WriteShort(-1);
+ MSG_WriteByte(0);
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
}
-static void SV_StopDownload_f( void ) {
+static void SV_StopDownload_f(void)
+{
int size, percent;
- if( !sv_client->download ) {
+ if (!sv_client->download) {
return;
}
size = sv_client->downloadsize;
- if( !size ) {
+ if (!size) {
percent = 0;
} else {
- percent = sv_client->downloadcount*100/size;
+ percent = sv_client->downloadcount * 100 / size;
}
- MSG_WriteByte( svc_download );
- MSG_WriteShort( -1 );
- MSG_WriteByte( percent );
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ MSG_WriteByte(svc_download);
+ MSG_WriteShort(-1);
+ MSG_WriteByte(percent);
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
- Com_DPrintf( "Download of %s to %s stopped by user request\n",
- sv_client->downloadname, sv_client->name );
- SV_CloseDownload( sv_client );
+ Com_DPrintf("Download of %s to %s stopped by user request\n",
+ sv_client->downloadname, sv_client->name);
+ SV_CloseDownload(sv_client);
#if USE_FPS
- if( sv_client->state == cs_spawned )
+ if (sv_client->state == cs_spawned)
align_key_frames();
#endif
}
@@ -762,128 +776,138 @@ static void SV_StopDownload_f( void ) {
//============================================================================
// the client is going to disconnect, so remove the connection immediately
-static void SV_Disconnect_f( void ) {
- SV_DropClient( sv_client, "!?disconnected" );
- SV_RemoveClient( sv_client ); // don't bother with zombie state
+static void SV_Disconnect_f(void)
+{
+ SV_DropClient(sv_client, "!?disconnected");
+ SV_RemoveClient(sv_client); // don't bother with zombie state
}
// dumps the serverinfo info string
-static void SV_ShowServerInfo_f( void ) {
+static void SV_ShowServerInfo_f(void)
+{
char serverinfo[MAX_INFO_STRING];
- Cvar_BitInfo( serverinfo, CVAR_SERVERINFO );
+ Cvar_BitInfo(serverinfo, CVAR_SERVERINFO);
- SV_BeginRedirect( RD_CLIENT );
- Info_Print( serverinfo );
+ SV_BeginRedirect(RD_CLIENT);
+ Info_Print(serverinfo);
Com_EndRedirect();
}
// dumps misc protocol info
-static void SV_ShowMiscInfo_f( void ) {
- SV_BeginRedirect( RD_CLIENT );
+static void SV_ShowMiscInfo_f(void)
+{
+ SV_BeginRedirect(RD_CLIENT);
SV_PrintMiscInfo();
Com_EndRedirect();
}
-static void SV_NoGameData_f( void ) {
+static void SV_NoGameData_f(void)
+{
sv_client->nodata ^= 1;
#if USE_FPS
- if( sv_client->state == cs_spawned )
+ if (sv_client->state == cs_spawned)
align_key_frames();
#endif
}
-static void SV_Lag_f( void ) {
+static void SV_Lag_f(void)
+{
client_t *cl;
- if( Cmd_Argc() > 1 ) {
- SV_BeginRedirect( RD_CLIENT );
- cl = SV_GetPlayer( Cmd_Argv( 1 ), qtrue );
+ if (Cmd_Argc() > 1) {
+ SV_BeginRedirect(RD_CLIENT);
+ cl = SV_GetPlayer(Cmd_Argv(1), qtrue);
Com_EndRedirect();
- if( !cl ) {
+ if (!cl) {
return;
}
} else {
cl = sv_client;
}
- SV_ClientPrintf( sv_client, PRINT_HIGH,
- "Lag stats for: %s\n"
- "RTT (min/avg/max): %d/%d/%d ms\n"
- "Server to client PL: %.2f%% (approx)\n"
- "Client to server PL: %.2f%%\n",
- cl->name, cl->min_ping, AVG_PING( cl ), cl->max_ping,
- PL_S2C( cl ), PL_C2S( cl ) );
+ SV_ClientPrintf(sv_client, PRINT_HIGH,
+ "Lag stats for: %s\n"
+ "RTT (min/avg/max): %d/%d/%d ms\n"
+ "Server to client PL: %.2f%% (approx)\n"
+ "Client to server PL: %.2f%%\n",
+ cl->name, cl->min_ping, AVG_PING(cl), cl->max_ping,
+ PL_S2C(cl), PL_C2S(cl));
}
#if USE_PACKETDUP
-static void SV_PacketdupHack_f( void ) {
+static void SV_PacketdupHack_f(void)
+{
int numdups = sv_client->numpackets - 1;
- if( Cmd_Argc() > 1 ) {
- numdups = atoi( Cmd_Argv( 1 ) );
- if( numdups < 0 || numdups > sv_packetdup_hack->integer ) {
- SV_ClientPrintf( sv_client, PRINT_HIGH,
- "Packetdup of %d is not allowed on this server.\n", numdups );
+ if (Cmd_Argc() > 1) {
+ numdups = atoi(Cmd_Argv(1));
+ if (numdups < 0 || numdups > sv_packetdup_hack->integer) {
+ SV_ClientPrintf(sv_client, PRINT_HIGH,
+ "Packetdup of %d is not allowed on this server.\n", numdups);
return;
}
sv_client->numpackets = numdups + 1;
}
- SV_ClientPrintf( sv_client, PRINT_HIGH,
- "Server is sending %d duplicate packet%s to you.\n",
- numdups, numdups == 1 ? "" : "s" );
+ SV_ClientPrintf(sv_client, PRINT_HIGH,
+ "Server is sending %d duplicate packet%s to you.\n",
+ numdups, numdups == 1 ? "" : "s");
}
#endif
-static void SV_CvarResult_f( void ) {
+static void SV_CvarResult_f(void)
+{
char *c, *v;
- c = Cmd_Argv( 1 );
- if( !strcmp( c, "version" ) ) {
- if( !sv_client->versionString ) {
- v = Cmd_RawArgsFrom( 2 );
- if( Com_IsDedicated() ) {
- Com_Printf( "%s[%s]: %s\n", sv_client->name,
- NET_AdrToString( &sv_client->netchan->remote_address ), v );
+ c = Cmd_Argv(1);
+ if (!strcmp(c, "version")) {
+ if (!sv_client->versionString) {
+ v = Cmd_RawArgsFrom(2);
+ if (Com_IsDedicated()) {
+ Com_Printf("%s[%s]: %s\n", sv_client->name,
+ NET_AdrToString(&sv_client->netchan->remote_address), v);
}
- sv_client->versionString = SV_CopyString( v );
+ sv_client->versionString = SV_CopyString(v);
}
- } else if( !strcmp( c, "connect" ) ) {
- if( sv_client->reconnect_var[0] ) {
- v = Cmd_Argv( 2 );
- if( !strcmp( v, sv_client->reconnect_val ) ) {
+ } else if (!strcmp(c, "connect")) {
+ if (sv_client->reconnect_var[0]) {
+ v = Cmd_Argv(2);
+ if (!strcmp(v, sv_client->reconnect_val)) {
sv_client->reconnected = qtrue;
}
}
}
#if USE_AC_SERVER
- else if( !strcmp( c, "actoken" ) ) {
- AC_ClientToken( sv_client, Cmd_Argv( 2 ) );
+ else if (!strcmp(c, "actoken")) {
+ AC_ClientToken(sv_client, Cmd_Argv(2));
}
#endif
}
#if USE_AC_SERVER
-static void SV_AC_List_f( void ) {
- SV_BeginRedirect( RD_CLIENT );
+static void SV_AC_List_f(void)
+{
+ SV_BeginRedirect(RD_CLIENT);
AC_List_f();
Com_EndRedirect();
}
-static void SV_AC_Info_f( void ) {
- SV_BeginRedirect( RD_CLIENT );
+static void SV_AC_Info_f(void)
+{
+ SV_BeginRedirect(RD_CLIENT);
AC_Info_f();
Com_EndRedirect();
}
#else
-static void SV_AC_Null_f( void ) {
- SV_ClientPrintf( sv_client, PRINT_HIGH,
- "This server does not support anticheat.\n" );
+static void SV_AC_Null_f(void)
+{
+ SV_ClientPrintf(sv_client, PRINT_HIGH,
+ "This server does not support anticheat.\n");
}
#endif
@@ -897,7 +921,7 @@ static const ucmd_t ucmds[] = {
{ "nextserver", NULL },
{ "disconnect", SV_Disconnect_f },
- // issued by hand at client consoles
+ // issued by hand at client consoles
{ "info", SV_ShowServerInfo_f },
{ "sinfo", SV_ShowMiscInfo_f },
@@ -922,31 +946,32 @@ static const ucmd_t ucmds[] = {
{ NULL, NULL }
};
-static void handle_filtercmd( filtercmd_t *filter ) {
+static void handle_filtercmd(filtercmd_t *filter)
+{
size_t len;
- switch( filter->action ) {
+ switch (filter->action) {
case FA_PRINT:
- MSG_WriteByte( svc_print );
- MSG_WriteByte( PRINT_HIGH );
+ MSG_WriteByte(svc_print);
+ MSG_WriteByte(PRINT_HIGH);
break;
case FA_STUFF:
- MSG_WriteByte( svc_stufftext );
+ MSG_WriteByte(svc_stufftext);
break;
case FA_KICK:
- SV_DropClient( sv_client, filter->comment[0] ?
- filter->comment : "issued banned command" );
+ SV_DropClient(sv_client, filter->comment[0] ?
+ filter->comment : "issued banned command");
// fall through
default:
return;
}
- len = strlen( filter->comment );
- MSG_WriteData( filter->comment, len );
- MSG_WriteByte( '\n' );
- MSG_WriteByte( 0 );
+ len = strlen(filter->comment);
+ MSG_WriteData(filter->comment, len);
+ MSG_WriteByte('\n');
+ MSG_WriteByte(0);
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
}
/*
@@ -954,35 +979,36 @@ static void handle_filtercmd( filtercmd_t *filter ) {
SV_ExecuteUserCommand
==================
*/
-static void SV_ExecuteUserCommand( const char *s ) {
+static void SV_ExecuteUserCommand(const char *s)
+{
const ucmd_t *u;
filtercmd_t *filter;
char *c;
-
- Cmd_TokenizeString( s, qfalse );
+
+ Cmd_TokenizeString(s, qfalse);
sv_player = sv_client->edict;
- c = Cmd_Argv( 0 );
- if( !c[0] ) {
+ c = Cmd_Argv(0);
+ if (!c[0]) {
return;
}
- if( ( u = Com_Find( ucmds, c ) ) != NULL ) {
- if( u->func ) {
+ if ((u = Com_Find(ucmds, c)) != NULL) {
+ if (u->func) {
u->func();
}
return;
}
- if( sv.state < ss_game ) {
+ if (sv.state < ss_game) {
return;
}
- LIST_FOR_EACH( filtercmd_t, filter, &sv_filterlist, entry ) {
- if( !Q_stricmp( filter->string, c ) ) {
- handle_filtercmd( filter );
+ LIST_FOR_EACH(filtercmd_t, filter, &sv_filterlist, entry) {
+ if (!Q_stricmp(filter->string, c)) {
+ handle_filtercmd(filter);
return;
}
}
- ge->ClientCommand( sv_player );
+ ge->ClientCommand(sv_player);
}
/*
@@ -1002,35 +1028,37 @@ static int userinfoUpdateCount;
SV_ClientThink
==================
*/
-static inline void SV_ClientThink( usercmd_t *cmd ) {
+static inline void SV_ClientThink(usercmd_t *cmd)
+{
sv_client->commandMsec -= cmd->msec;
sv_client->numMoves++;
- if( sv_client->commandMsec < 0 && sv_enforcetime->integer ) {
- Com_DPrintf( "commandMsec underflow from %s: %d\n",
- sv_client->name, sv_client->commandMsec );
+ if (sv_client->commandMsec < 0 && sv_enforcetime->integer) {
+ Com_DPrintf("commandMsec underflow from %s: %d\n",
+ sv_client->name, sv_client->commandMsec);
return;
}
- ge->ClientThink( sv_player, cmd );
+ ge->ClientThink(sv_player, cmd);
}
-static void SV_SetLastFrame( int lastframe ) {
+static void SV_SetLastFrame(int lastframe)
+{
client_frame_t *frame;
- if( lastframe > 0 ) {
- if( lastframe >= sv_client->framenum )
+ if (lastframe > 0) {
+ if (lastframe >= sv_client->framenum)
return; // ignore invalid acks
- if( lastframe <= sv_client->lastframe )
+ if (lastframe <= sv_client->lastframe)
return; // ignore duplicate acks
- if( sv_client->framenum - lastframe <= UPDATE_BACKUP ) {
+ if (sv_client->framenum - lastframe <= UPDATE_BACKUP) {
frame = &sv_client->frames[lastframe & UPDATE_MASK];
- if( frame->number == lastframe ) {
+ if (frame->number == lastframe) {
// save time for ping calc
- if( frame->sentTime <= com_eventTime )
+ if (frame->sentTime <= com_eventTime)
frame->latency = com_eventTime - frame->sentTime;
}
}
@@ -1047,66 +1075,66 @@ static void SV_SetLastFrame( int lastframe ) {
SV_OldClientExecuteMove
==================
*/
-static void SV_OldClientExecuteMove( void ) {
+static void SV_OldClientExecuteMove(void)
+{
usercmd_t oldest, oldcmd, newcmd;
int lastframe;
int net_drop;
- if( moveIssued ) {
- SV_DropClient( sv_client, "multiple clc_move commands in packet" );
+ if (moveIssued) {
+ SV_DropClient(sv_client, "multiple clc_move commands in packet");
return; // someone is trying to cheat...
}
moveIssued = qtrue;
- if( sv_client->protocol == PROTOCOL_VERSION_DEFAULT ) {
+ if (sv_client->protocol == PROTOCOL_VERSION_DEFAULT) {
MSG_ReadByte(); // skip over checksum
}
-
+
lastframe = MSG_ReadLong();
// read all cmds
- if( sv_client->protocol == PROTOCOL_VERSION_R1Q2 &&
- sv_client->version >= PROTOCOL_VERSION_R1Q2_UCMD )
- {
- MSG_ReadDeltaUsercmd_Hacked( NULL, &oldest );
- MSG_ReadDeltaUsercmd_Hacked( &oldest, &oldcmd );
- MSG_ReadDeltaUsercmd_Hacked( &oldcmd, &newcmd );
+ if (sv_client->protocol == PROTOCOL_VERSION_R1Q2 &&
+ sv_client->version >= PROTOCOL_VERSION_R1Q2_UCMD) {
+ MSG_ReadDeltaUsercmd_Hacked(NULL, &oldest);
+ MSG_ReadDeltaUsercmd_Hacked(&oldest, &oldcmd);
+ MSG_ReadDeltaUsercmd_Hacked(&oldcmd, &newcmd);
} else {
- MSG_ReadDeltaUsercmd( NULL, &oldest );
- MSG_ReadDeltaUsercmd( &oldest, &oldcmd );
- MSG_ReadDeltaUsercmd( &oldcmd, &newcmd );
+ MSG_ReadDeltaUsercmd(NULL, &oldest);
+ MSG_ReadDeltaUsercmd(&oldest, &oldcmd);
+ MSG_ReadDeltaUsercmd(&oldcmd, &newcmd);
}
- if( sv_client->state != cs_spawned ) {
- SV_SetLastFrame( -1 );
+ if (sv_client->state != cs_spawned) {
+ SV_SetLastFrame(-1);
return;
}
- SV_SetLastFrame( lastframe );
+ SV_SetLastFrame(lastframe);
net_drop = sv_client->netchan->dropped;
- if( net_drop > 2 ) {
+ if (net_drop > 2) {
sv_client->frameflags |= FF_CLIENTPRED;
- }
+ }
- if( net_drop < 20 ) {
+ if (net_drop < 20) {
// run lastcmd multiple times if no backups available
- while( net_drop > 2 ) {
- SV_ClientThink( &sv_client->lastcmd );
+ while (net_drop > 2) {
+ SV_ClientThink(&sv_client->lastcmd);
net_drop--;
}
// run backup cmds
- if( net_drop > 1 )
- SV_ClientThink( &oldest );
- if( net_drop > 0 )
- SV_ClientThink( &oldcmd );
+ if (net_drop > 1)
+ SV_ClientThink(&oldest);
+ if (net_drop > 0)
+ SV_ClientThink(&oldcmd);
}
// run new cmd
- SV_ClientThink( &newcmd );
-
+ SV_ClientThink(&newcmd);
+
sv_client->lastcmd = newcmd;
}
@@ -1115,7 +1143,8 @@ static void SV_OldClientExecuteMove( void ) {
SV_NewClientExecuteMove
==================
*/
-static void SV_NewClientExecuteMove( int c ) {
+static void SV_NewClientExecuteMove(int c)
+{
usercmd_t cmds[MAX_PACKET_FRAMES][MAX_PACKET_USERCMDS];
usercmd_t *lastcmd, *cmd;
int lastframe;
@@ -1123,8 +1152,8 @@ static void SV_NewClientExecuteMove( int c ) {
int i, j, lightlevel;
int net_drop;
- if( moveIssued ) {
- SV_DropClient( sv_client, "multiple clc_move commands in packet" );
+ if (moveIssued) {
+ SV_DropClient(sv_client, "multiple clc_move commands in packet");
return; // someone is trying to cheat...
}
@@ -1133,12 +1162,12 @@ static void SV_NewClientExecuteMove( int c ) {
numDups = c >> SVCMD_BITS;
c &= SVCMD_MASK;
- if( numDups >= MAX_PACKET_FRAMES ) {
- SV_DropClient( sv_client, "too many frames in packet" );
+ if (numDups >= MAX_PACKET_FRAMES) {
+ SV_DropClient(sv_client, "too many frames in packet");
return;
}
- if( c == clc_move_nodelta ) {
+ if (c == clc_move_nodelta) {
lastframe = -1;
} else {
lastframe = MSG_ReadLong();
@@ -1148,56 +1177,56 @@ static void SV_NewClientExecuteMove( int c ) {
// read all cmds
lastcmd = NULL;
- for( i = 0; i <= numDups; i++ ) {
- numCmds[i] = MSG_ReadBits( 5 );
- if( numCmds[i] == -1 ) {
- SV_DropClient( sv_client, "read past end of message" );
+ for (i = 0; i <= numDups; i++) {
+ numCmds[i] = MSG_ReadBits(5);
+ if (numCmds[i] == -1) {
+ SV_DropClient(sv_client, "read past end of message");
return;
}
- if( numCmds[i] >= MAX_PACKET_USERCMDS ) {
- SV_DropClient( sv_client, "too many usercmds in frame" );
+ if (numCmds[i] >= MAX_PACKET_USERCMDS) {
+ SV_DropClient(sv_client, "too many usercmds in frame");
return;
}
- for( j = 0; j < numCmds[i]; j++ ) {
- if( msg_read.readcount > msg_read.cursize ) {
- SV_DropClient( sv_client, "read past end of message" );
+ for (j = 0; j < numCmds[i]; j++) {
+ if (msg_read.readcount > msg_read.cursize) {
+ SV_DropClient(sv_client, "read past end of message");
return;
}
cmd = &cmds[i][j];
- MSG_ReadDeltaUsercmd_Enhanced( lastcmd, cmd, sv_client->version );
+ MSG_ReadDeltaUsercmd_Enhanced(lastcmd, cmd, sv_client->version);
cmd->lightlevel = lightlevel;
lastcmd = cmd;
}
}
- if( sv_client->state != cs_spawned ) {
- SV_SetLastFrame( -1 );
+ if (sv_client->state != cs_spawned) {
+ SV_SetLastFrame(-1);
return;
}
- SV_SetLastFrame( lastframe );
+ SV_SetLastFrame(lastframe);
- if( q_unlikely( !lastcmd ) ) {
+ if (q_unlikely(!lastcmd)) {
return; // should never happen
}
net_drop = sv_client->netchan->dropped;
- if( net_drop > numDups ) {
+ if (net_drop > numDups) {
sv_client->frameflags |= FF_CLIENTPRED;
- }
+ }
- if( net_drop < 20 ) {
+ if (net_drop < 20) {
// run lastcmd multiple times if no backups available
- while( net_drop > numDups ) {
- SV_ClientThink( &sv_client->lastcmd );
+ while (net_drop > numDups) {
+ SV_ClientThink(&sv_client->lastcmd);
net_drop--;
}
// run backup cmds, if any
- while( net_drop > 0 ) {
+ while (net_drop > 0) {
i = numDups - net_drop;
- for( j = 0; j < numCmds[i]; j++ ) {
- SV_ClientThink( &cmds[i][j] );
+ for (j = 0; j < numCmds[i]; j++) {
+ SV_ClientThink(&cmds[i][j]);
}
net_drop--;
}
@@ -1205,10 +1234,10 @@ static void SV_NewClientExecuteMove( int c ) {
}
// run new cmds
- for( j = 0; j < numCmds[numDups]; j++ ) {
- SV_ClientThink( &cmds[numDups][j] );
+ for (j = 0; j < numCmds[numDups]; j++) {
+ SV_ClientThink(&cmds[numDups][j]);
}
-
+
sv_client->lastcmd = *lastcmd;
}
@@ -1219,110 +1248,113 @@ SV_UpdateUserinfo
Ensures that name and ip are properly set.
=================
*/
-static void SV_UpdateUserinfo( void ) {
+static void SV_UpdateUserinfo(void)
+{
char *s;
- if( !sv_client->userinfo[0] ) {
- SV_DropClient( sv_client, "empty userinfo" );
+ if (!sv_client->userinfo[0]) {
+ SV_DropClient(sv_client, "empty userinfo");
return;
}
- if( !Info_Validate( sv_client->userinfo ) ) {
- SV_DropClient( sv_client, "malformed userinfo" );
+ if (!Info_Validate(sv_client->userinfo)) {
+ SV_DropClient(sv_client, "malformed userinfo");
return;
}
// validate name
- s = Info_ValueForKey( sv_client->userinfo, "name" );
- if( COM_IsWhite( s ) ) {
- if( !sv_client->name[0] ) {
- SV_DropClient( sv_client, "malformed name" );
+ s = Info_ValueForKey(sv_client->userinfo, "name");
+ if (COM_IsWhite(s)) {
+ if (!sv_client->name[0]) {
+ SV_DropClient(sv_client, "malformed name");
return;
}
- if( !Info_SetValueForKey( sv_client->userinfo, "name", sv_client->name ) ) {
- SV_DropClient( sv_client, "oversize userinfo" );
+ if (!Info_SetValueForKey(sv_client->userinfo, "name", sv_client->name)) {
+ SV_DropClient(sv_client, "oversize userinfo");
return;
}
- SV_ClientCommand( sv_client, "set name \"%s\"\n", sv_client->name );
+ SV_ClientCommand(sv_client, "set name \"%s\"\n", sv_client->name);
}
// force the IP key/value pair so the game can filter based on ip
- s = NET_AdrToString( &sv_client->netchan->remote_address );
- if( !Info_SetValueForKey( sv_client->userinfo, "ip", s ) ) {
- SV_DropClient( sv_client, "oversize userinfo" );
+ s = NET_AdrToString(&sv_client->netchan->remote_address);
+ if (!Info_SetValueForKey(sv_client->userinfo, "ip", s)) {
+ SV_DropClient(sv_client, "oversize userinfo");
return;
}
- SV_UserinfoChanged( sv_client );
+ SV_UserinfoChanged(sv_client);
}
-static void SV_ParseFullUserinfo( void ) {
+static void SV_ParseFullUserinfo(void)
+{
size_t len;
// malicious users may try sending too many userinfo updates
- if( userinfoUpdateCount >= MAX_PACKET_USERINFOS ) {
- Com_DPrintf( "Too many userinfos from %s\n", sv_client->name );
- MSG_ReadString( NULL, 0 );
+ if (userinfoUpdateCount >= MAX_PACKET_USERINFOS) {
+ Com_DPrintf("Too many userinfos from %s\n", sv_client->name);
+ MSG_ReadString(NULL, 0);
return;
}
- len = MSG_ReadString( sv_client->userinfo, sizeof( sv_client->userinfo ) );
- if( len >= sizeof( sv_client->userinfo ) ) {
- SV_DropClient( sv_client, "oversize userinfo" );
+ len = MSG_ReadString(sv_client->userinfo, sizeof(sv_client->userinfo));
+ if (len >= sizeof(sv_client->userinfo)) {
+ SV_DropClient(sv_client, "oversize userinfo");
return;
}
- Com_DDPrintf( "%s(%s): %s [%d]\n", __func__,
- sv_client->name, sv_client->userinfo, userinfoUpdateCount );
+ Com_DDPrintf("%s(%s): %s [%d]\n", __func__,
+ sv_client->name, sv_client->userinfo, userinfoUpdateCount);
SV_UpdateUserinfo();
userinfoUpdateCount++;
}
-static void SV_ParseDeltaUserinfo( void ) {
+static void SV_ParseDeltaUserinfo(void)
+{
char key[MAX_INFO_KEY], value[MAX_INFO_VALUE];
size_t len;
// malicious users may try sending too many userinfo updates
- if( userinfoUpdateCount >= MAX_PACKET_USERINFOS ) {
- Com_DPrintf( "Too many userinfos from %s\n", sv_client->name );
- MSG_ReadString( NULL, 0 );
- MSG_ReadString( NULL, 0 );
+ if (userinfoUpdateCount >= MAX_PACKET_USERINFOS) {
+ Com_DPrintf("Too many userinfos from %s\n", sv_client->name);
+ MSG_ReadString(NULL, 0);
+ MSG_ReadString(NULL, 0);
return;
}
// optimize by combining multiple delta updates into one (hack)
- while( 1 ) {
- len = MSG_ReadString( key, sizeof( key ) );
- if( len >= sizeof( key ) ) {
- SV_DropClient( sv_client, "oversize delta key" );
+ while (1) {
+ len = MSG_ReadString(key, sizeof(key));
+ if (len >= sizeof(key)) {
+ SV_DropClient(sv_client, "oversize delta key");
return;
}
- len = MSG_ReadString( value, sizeof( value ) );
- if( len >= sizeof( value ) ) {
- SV_DropClient( sv_client, "oversize delta value" );
+ len = MSG_ReadString(value, sizeof(value));
+ if (len >= sizeof(value)) {
+ SV_DropClient(sv_client, "oversize delta value");
return;
}
- if( userinfoUpdateCount < MAX_PACKET_USERINFOS ) {
- if( !Info_SetValueForKey( sv_client->userinfo, key, value ) ) {
- SV_DropClient( sv_client, "malformed userinfo" );
+ if (userinfoUpdateCount < MAX_PACKET_USERINFOS) {
+ if (!Info_SetValueForKey(sv_client->userinfo, key, value)) {
+ SV_DropClient(sv_client, "malformed userinfo");
return;
}
- Com_DDPrintf( "%s(%s): %s %s [%d]\n", __func__,
- sv_client->name, key, value, userinfoUpdateCount );
+ Com_DDPrintf("%s(%s): %s %s [%d]\n", __func__,
+ sv_client->name, key, value, userinfoUpdateCount);
userinfoUpdateCount++;
} else {
- Com_DPrintf( "Too many userinfos from %s\n", sv_client->name );
+ Com_DPrintf("Too many userinfos from %s\n", sv_client->name);
}
- if( msg_read.readcount >= msg_read.cursize )
+ if (msg_read.readcount >= msg_read.cursize)
break; // end of message
- if( msg_read.data[msg_read.readcount] != clc_userinfo_delta )
+ if (msg_read.data[msg_read.readcount] != clc_userinfo_delta)
break; // not delta userinfo
msg_read.readcount++;
@@ -1332,87 +1364,91 @@ static void SV_ParseDeltaUserinfo( void ) {
}
#if USE_FPS
-static void align_key_frames( void ) {
+static void align_key_frames(void)
+{
int framediv = sv.framediv / sv_client->framediv;
int framenum = sv.framenum / sv_client->framediv;
int frameofs = framenum % framediv;
- int newnum = frameofs + Q_align( sv_client->framenum, framediv );
+ int newnum = frameofs + Q_align(sv_client->framenum, framediv);
- Com_DPrintf( "[%d] align %d --> %d (num = %d, div = %d, ofs = %d)\n",
- sv.framenum, sv_client->framenum, newnum, framenum, framediv, frameofs );
+ Com_DPrintf("[%d] align %d --> %d (num = %d, div = %d, ofs = %d)\n",
+ sv.framenum, sv_client->framenum, newnum, framenum, framediv, frameofs);
sv_client->framenum = newnum;
}
-static void set_client_fps( int value ) {
+static void set_client_fps(int value)
+{
int framediv, framerate;
// 0 means highest
- if( !value )
+ if (!value)
value = sv.framerate;
framediv = value / BASE_FRAMERATE;
- clamp( framediv, 1, MAX_FRAMEDIV );
+ clamp(framediv, 1, MAX_FRAMEDIV);
- framediv = sv.framediv / Q_gcd( sv.framediv, framediv );
+ framediv = sv.framediv / Q_gcd(sv.framediv, framediv);
framerate = sv.framerate / framediv;
- Com_DPrintf( "[%d] client div=%d, server div=%d, rate=%d\n",
- sv.framenum, framediv, sv.framediv, framerate );
+ Com_DPrintf("[%d] client div=%d, server div=%d, rate=%d\n",
+ sv.framenum, framediv, sv.framediv, framerate);
sv_client->framediv = framediv;
- if( sv_client->state == cs_spawned )
+ if (sv_client->state == cs_spawned)
align_key_frames();
// save for status inspection
sv_client->settings[CLS_FPS] = framerate;
- MSG_WriteByte( svc_setting );
- MSG_WriteLong( SVS_FPS );
- MSG_WriteLong( framerate );
- SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR );
+ MSG_WriteByte(svc_setting);
+ MSG_WriteLong(SVS_FPS);
+ MSG_WriteLong(framerate);
+ SV_ClientAddMessage(sv_client, MSG_RELIABLE | MSG_CLEAR);
}
#endif
-static void SV_ParseClientSetting( void ) {
+static void SV_ParseClientSetting(void)
+{
int idx, value;
idx = MSG_ReadShort();
value = MSG_ReadShort();
- Com_DDPrintf( "%s(%s): [%d] = %d\n", __func__, sv_client->name, idx, value );
+ Com_DDPrintf("%s(%s): [%d] = %d\n", __func__, sv_client->name, idx, value);
- if( idx < 0 || idx >= CLS_MAX )
+ if (idx < 0 || idx >= CLS_MAX)
return;
sv_client->settings[idx] = value;
#if USE_FPS
- if( idx == CLS_FPS && sv_client->protocol == PROTOCOL_VERSION_Q2PRO )
- set_client_fps( value );
+ if (idx == CLS_FPS && sv_client->protocol == PROTOCOL_VERSION_Q2PRO)
+ set_client_fps(value);
#endif
}
-static void SV_ParseClientCommand( void ) {
+static void SV_ParseClientCommand(void)
+{
char buffer[MAX_STRING_CHARS];
size_t len;
- len = MSG_ReadString( buffer, sizeof( buffer ) );
- if( len >= sizeof( buffer ) ) {
- SV_DropClient( sv_client, "oversize stringcmd" );
+ len = MSG_ReadString(buffer, sizeof(buffer));
+ if (len >= sizeof(buffer)) {
+ SV_DropClient(sv_client, "oversize stringcmd");
return;
}
// malicious users may try using too many string commands
- if( stringCmdCount >= MAX_PACKET_STRINGCMDS ) {
- Com_DPrintf( "Too many stringcmds from %s\n", sv_client->name );
+ if (stringCmdCount >= MAX_PACKET_STRINGCMDS) {
+ Com_DPrintf("Too many stringcmds from %s\n", sv_client->name);
return;
}
- Com_DDPrintf( "%s(%s): %s\n", __func__, sv_client->name, buffer );
+ Com_DDPrintf("%s(%s): %s\n", __func__, sv_client->name, buffer);
- SV_ExecuteUserCommand( buffer );
+ SV_ExecuteUserCommand(buffer);
stringCmdCount++;
}
@@ -1423,7 +1459,8 @@ SV_ExecuteClientMessage
The current net_message is parsed for the given client
===================
*/
-void SV_ExecuteClientMessage( client_t *client ) {
+void SV_ExecuteClientMessage(client_t *client)
+{
int c;
X86_PUSH_FPCW;
@@ -1437,22 +1474,22 @@ void SV_ExecuteClientMessage( client_t *client ) {
stringCmdCount = 0;
userinfoUpdateCount = 0;
- while( 1 ) {
- if( msg_read.readcount > msg_read.cursize ) {
- SV_DropClient( client, "read past end of message" );
+ while (1) {
+ if (msg_read.readcount > msg_read.cursize) {
+ SV_DropClient(client, "read past end of message");
break;
- }
+ }
c = MSG_ReadByte();
- if( c == -1 )
+ if (c == -1)
break;
-
- switch( c & SVCMD_MASK ) {
+
+ switch (c & SVCMD_MASK) {
default:
- badbyte:
- SV_DropClient( client, "unknown command byte" );
+badbyte:
+ SV_DropClient(client, "unknown command byte");
break;
-
+
case clc_nop:
break;
@@ -1469,7 +1506,7 @@ void SV_ExecuteClientMessage( client_t *client ) {
break;
case clc_setting:
- if( client->protocol < PROTOCOL_VERSION_R1Q2 )
+ if (client->protocol < PROTOCOL_VERSION_R1Q2)
goto badbyte;
SV_ParseClientSetting();
@@ -1477,21 +1514,21 @@ void SV_ExecuteClientMessage( client_t *client ) {
case clc_move_nodelta:
case clc_move_batched:
- if( client->protocol != PROTOCOL_VERSION_Q2PRO )
+ if (client->protocol != PROTOCOL_VERSION_Q2PRO)
goto badbyte;
- SV_NewClientExecuteMove( c );
+ SV_NewClientExecuteMove(c);
break;
case clc_userinfo_delta:
- if( client->protocol != PROTOCOL_VERSION_Q2PRO )
+ if (client->protocol != PROTOCOL_VERSION_Q2PRO)
goto badbyte;
SV_ParseDeltaUserinfo();
break;
}
- if( client->state <= cs_zombie )
+ if (client->state <= cs_zombie)
break; // disconnect command
}