summaryrefslogtreecommitdiff
path: root/src/game/g_ptr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/g_ptr.c')
-rw-r--r--src/game/g_ptr.c169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/game/g_ptr.c b/src/game/g_ptr.c
new file mode 100644
index 00000000..ba8c095a
--- /dev/null
+++ b/src/game/g_ptr.c
@@ -0,0 +1,169 @@
+// g_ptr.c -- post timeout restoration handling
+
+/*
+ * Portions Copyright (C) 2000-2001 Tim Angus
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the OSML - Open Source Modification License v1.0 as
+ * described in the file COPYING which is distributed with this source
+ * code.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include "g_local.h"
+
+static connectionRecord_t connections[ MAX_CLIENTS ];
+
+/*
+===============
+G_CheckForUniquePTRC
+
+Callback to detect ptrc clashes
+===============
+*/
+static qboolean G_CheckForUniquePTRC( int code )
+{
+ int i;
+
+ if( code == 0 )
+ return qfalse;
+
+ for( i = 0; i < MAX_CLIENTS; i++ )
+ {
+ if( connections[ i ].ptrCode == code )
+ return qfalse;
+ }
+
+ return qtrue;
+}
+
+/*
+===============
+G_UpdatePTRConnection
+
+Update the data in a connection record
+===============
+*/
+void G_UpdatePTRConnection( gclient_t *client )
+{
+ if( client && client->pers.connection )
+ {
+ client->pers.connection->clientTeam = client->ps.stats[ STAT_PTEAM ];
+ client->pers.connection->clientCredit = client->ps.persistant[ PERS_CREDIT ];
+ }
+}
+
+/*
+===============
+G_GenerateNewConnection
+
+Generates a new connection
+===============
+*/
+connectionRecord_t *G_GenerateNewConnection( gclient_t *client )
+{
+ int code = 0;
+ int i;
+ qtime_t time;
+
+ // this should be really random
+ trap_RealTime( &time );
+ srand( time.tm_sec + time.tm_min + time.tm_hour );
+
+ // there is a very very small possibility that this
+ // will loop infinitely
+ do
+ {
+ code = rand( );
+ } while( !G_CheckForUniquePTRC( code ) );
+
+ for( i = 0; i < MAX_CLIENTS; i++ )
+ {
+ //found an unused slot
+ if( !connections[ i ].ptrCode )
+ {
+ connections[ i ].ptrCode = code;
+ connections[ i ].clientNum = client->ps.clientNum;
+ client->pers.connection = &connections[ i ];
+ G_UpdatePTRConnection( client );
+
+ return &connections[ i ];
+ }
+ }
+
+ return NULL;
+}
+
+/*
+===============
+G_VerifyPTRC
+
+Check a PTR code for validity
+===============
+*/
+qboolean G_VerifyPTRC( int code )
+{
+ int i;
+
+ if( code == 0 )
+ return qfalse;
+
+ for( i = 0; i < MAX_CLIENTS; i++ )
+ {
+ if( connections[ i ].ptrCode == code )
+ return qtrue;
+ }
+
+ return qfalse;
+}
+
+/*
+===============
+G_FindConnectionForCode
+
+Finds a connection for a given code
+===============
+*/
+connectionRecord_t *G_FindConnectionForCode( int code )
+{
+ int i;
+
+ if( code == 0 )
+ return NULL;
+
+ for( i = 0; i < MAX_CLIENTS; i++ )
+ {
+ if( connections[ i ].ptrCode == code )
+ return &connections[ i ];
+ }
+
+ return NULL;
+}
+
+/*
+===============
+G_DeletePTRConnection
+
+Finds a connection and deletes it
+===============
+*/
+void G_DeletePTRConnection( connectionRecord_t *connection )
+{
+ if( connection )
+ memset( connection, 0, sizeof( connectionRecord_t ) );
+}
+
+/*
+===============
+G_ResetPTRConnections
+
+Invalidate any existing codes
+===============
+*/
+void G_ResetPTRConnections( void )
+{
+ memset( connections, 0, sizeof( connectionRecord_t ) * MAX_CLIENTS );
+}