diff options
author | SlackerLinux85 <SlackerLinux85@55599770-6f59-11de-83c4-53937bf5378e> | 2017-04-13 11:30:00 +0000 |
---|---|---|
committer | /dev/humancontroller <devhc@example.com> | 2017-04-15 12:04:45 +0200 |
commit | 45973dc48641365b31475733bce7af9c3b8603a6 (patch) | |
tree | c9e4cdec39e41fe35c3f0ec96d4d9bda70d682d7 /src/game/g_ptr.c | |
parent | 4d5120be9583309471102f8944234ee8a3a5738e (diff) |
import the Slacker's QVM code base
Diffstat (limited to 'src/game/g_ptr.c')
-rw-r--r-- | src/game/g_ptr.c | 143 |
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 ); +} |