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.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/game/g_ptr.c b/src/game/g_ptr.c
new file mode 100644
index 0000000..e102183
--- /dev/null
+++ b/src/game/g_ptr.c
@@ -0,0 +1,143 @@
+/*
+===========================================================================
+Copyright (C) 1999-2005 Id Software, Inc.
+Copyright (C) 2000-2006 Tim Angus
+
+This file is part of Tremulous.
+
+Tremulous is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the License,
+or (at your option) any later version.
+
+Tremulous 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. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Tremulous; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+===========================================================================
+*/
+
+// g_ptr.c -- post timeout restoration handling
+
+#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->pers.teamSelection;
+ client->pers.connection->clientCredit = client->pers.credit;
+ client->pers.connection->clientScore = client->pers.score;
+ }
+}
+
+/*
+===============
+G_GenerateNewConnection
+
+Generates a new connection
+===============
+*/
+connectionRecord_t *G_GenerateNewConnection( gclient_t *client )
+{
+ int code = 0;
+ int i;
+
+ // this should be really random
+ srand( trap_Milliseconds( ) );
+
+ // 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 );
+ client->pers.connection->clientEnterTime = client->pers.enterTime;
+
+ return &connections[ i ];
+ }
+ }
+
+ return NULL;
+}
+
+/*
+===============
+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_ResetPTRConnections
+
+Invalidate any existing codes
+===============
+*/
+void G_ResetPTRConnections( void )
+{
+ memset( connections, 0, sizeof( connectionRecord_t ) * MAX_CLIENTS );
+}