summaryrefslogtreecommitdiff
path: root/source/sv_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/sv_main.c')
-rw-r--r--source/sv_main.c52
1 files changed, 28 insertions, 24 deletions
diff --git a/source/sv_main.c b/source/sv_main.c
index d3d899d..c81bb4c 100644
--- a/source/sv_main.c
+++ b/source/sv_main.c
@@ -79,7 +79,9 @@ cvar_t *sv_bodyque_hack;
#ifndef _WIN32
cvar_t *sv_oldgame_hack;
#endif
-cvar_t *sv_disconnect_hack;
+#if USE_PACKETDUP
+cvar_t *sv_packetdup_hack;
+#endif
cvar_t *sv_iplimit;
cvar_t *sv_status_limit;
@@ -273,20 +275,20 @@ addrmatch_t *SV_MatchAddress( list_t *list, netadr_t *address ) {
===============
SV_StatusString
-Builds the string that is sent as heartbeats and status replies
+Builds the string that is sent as heartbeats and status replies.
+It is assumed that size of status buffer is at least SV_OUTPUTBUF_LENGTH!
===============
*/
static size_t SV_StatusString( char *status ) {
char entry[MAX_STRING_CHARS];
client_t *cl;
- int j;
- size_t total, length;
+ size_t total, len;
char *tmp = sv_maxclients->string;
// XXX: ugly hack to hide reserved slots
if( sv_reserved_slots->integer ) {
- sprintf( entry, "%d", sv_maxclients->integer -
- sv_reserved_slots->integer );
+ Q_snprintf( entry, sizeof( entry ), "%d",
+ sv_maxclients->integer - sv_reserved_slots->integer );
sv_maxclients->string = entry;
}
@@ -297,11 +299,11 @@ static size_t SV_StatusString( char *status ) {
// add uptime
if( sv_uptime->integer ) {
- length = Com_Uptime_m( entry, MAX_INFO_VALUE );
- if( total + 8 + length < MAX_INFO_STRING ) {
+ len = Com_Uptime_m( entry, MAX_INFO_VALUE );
+ if( len < MAX_INFO_VALUE && total + 8 + len < MAX_INFO_STRING ) {
memcpy( status + total, "\\uptime\\", 8 );
- memcpy( status + total + 8, entry, length );
- total += 8 + length;
+ memcpy( status + total + 8, entry, len );
+ total += 8 + len;
}
}
@@ -313,20 +315,18 @@ static size_t SV_StatusString( char *status ) {
if( cl->state == cs_zombie ) {
continue;
}
-#if USE_MVD_CLIENT
- if( sv.state == ss_broadcast ) {
- j = 0;
- } else
-#endif
- {
- j = cl->edict->client->ps.stats[STAT_FRAGS];
+ len = Q_snprintf( entry, sizeof( entry ),
+ "%i %i \"%s\"\n",
+ cl->edict->client->ps.stats[STAT_FRAGS],
+ cl->ping, cl->name );
+ if( len >= sizeof( entry ) ) {
+ continue;
}
- length = sprintf( entry, "%i %i \"%s\"\n",
- j, cl->ping, cl->name );
- if( total + length >= SV_OUTPUTBUF_LENGTH )
+ if( total + len >= SV_OUTPUTBUF_LENGTH ) {
break; // can't hold any more
- memcpy( status + total, entry, length );
- total += length;
+ }
+ memcpy( status + total, entry, len );
+ total += len;
}
}
@@ -897,6 +897,7 @@ static void SVC_DirectConnect( void ) {
// setup netchan
newcl->netchan = Netchan_Setup( NS_SERVER, nctype, &net_from,
qport, maxlength, protocol );
+ newcl->numpackets = 1;
// parse some info from the info strings
Q_strlcpy( newcl->userinfo, userinfo, sizeof( newcl->userinfo ) );
@@ -1337,7 +1338,7 @@ void SV_SendAsyncPackets( void ) {
if( netchan->message.cursize || netchan->reliable_ack_pending ||
netchan->reliable_length || retransmit )
{
- cursize = netchan->Transmit( netchan, 0, NULL );
+ cursize = netchan->Transmit( netchan, 0, NULL, 1 );
#if USE_CLIENT
if( sv_debug_send->integer ) {
Com_Printf( S_COLOR_BLUE"%s: send: %"PRIz"\n",
@@ -1878,6 +1879,9 @@ void SV_Init( void ) {
#ifndef _WIN32
sv_oldgame_hack = Cvar_Get( "sv_oldgame_hack", "0", CVAR_LATCH );
#endif
+#if USE_PACKETDUP
+ sv_packetdup_hack = Cvar_Get( "sv_packetdup_hack", "0", 0 );
+#endif
sv_iplimit = Cvar_Get( "sv_iplimit", "3", 0 );
@@ -1936,7 +1940,7 @@ static void SV_FinalMessage( const char *message, int cmd ) {
while( netchan->fragment_pending ) {
netchan->TransmitNextFragment( netchan );
}
- netchan->Transmit( netchan, msg_write.cursize, msg_write.data );
+ netchan->Transmit( netchan, msg_write.cursize, msg_write.data, 1 );
}
}