diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cgame/cg_servercmds.c | 19 | ||||
| -rw-r--r-- | src/game/g_active.c | 6 | ||||
| -rw-r--r-- | src/game/g_client.c | 10 | ||||
| -rw-r--r-- | src/game/g_cmds.c | 8 | ||||
| -rw-r--r-- | src/game/g_combat.c | 5 | ||||
| -rw-r--r-- | src/game/g_local.h | 9 | ||||
| -rw-r--r-- | src/game/g_team.c | 62 | 
7 files changed, 80 insertions, 39 deletions
diff --git a/src/cgame/cg_servercmds.c b/src/cgame/cg_servercmds.c index 64ef7985..dff02805 100644 --- a/src/cgame/cg_servercmds.c +++ b/src/cgame/cg_servercmds.c @@ -81,24 +81,31 @@ static void CG_ParseTeamInfo( void )    int   i;    int   count;    int   client; +  int   fields; -  count = ( trap_Argc( ) - 1 ) / 5; +  if( cg.snap->ps.stats[ STAT_TEAM ] == TEAM_ALIENS ) +    fields = 4; // aliens don't have upgrades +  else +    fields = 5; + +  count = ( trap_Argc( ) - 1 ) / fields;    cgs.teaminfoReceievedTime = cg.time;    for( i = 0; i < count; i++ )    { -    client = atoi( CG_Argv( i * 5 + 1 ) ); +    client = atoi( CG_Argv( i * fields + 1 ) );      if( client < 0 || client >= MAX_CLIENTS )      {        CG_Printf( "[skipnotify]CG_ParseTeamInfo: bad client number: %d\n", client );        return;      } -    cgs.clientinfo[ client ].location = atoi( CG_Argv( i * 5 + 2 ) ); -    cgs.clientinfo[ client ].health = atoi( CG_Argv( i * 5 + 3 ) ); -    cgs.clientinfo[ client ].curWeaponClass = atoi( CG_Argv( i * 5 + 4 ) ); -    cgs.clientinfo[ client ].upgrade = atoi( CG_Argv( i * 5 + 5 ) ); +    cgs.clientinfo[ client ].location = atoi( CG_Argv( i * fields + 2 ) ); +    cgs.clientinfo[ client ].health = atoi( CG_Argv( i * fields + 3 ) ); +    cgs.clientinfo[ client ].curWeaponClass = atoi( CG_Argv( i * fields + 4 ) ); +    if( cg.snap->ps.stats[ STAT_TEAM ] == TEAM_HUMANS ) +      cgs.clientinfo[ client ].upgrade = atoi( CG_Argv( i * fields + 5 ) );    }  } diff --git a/src/game/g_active.c b/src/game/g_active.c index 5adfa847..edd57a6a 100644 --- a/src/game/g_active.c +++ b/src/game/g_active.c @@ -1845,7 +1845,11 @@ void ClientEndFrame( gentity_t *ent )    else      ent->s.eFlags &= ~EF_CONNECTION; -  ent->client->ps.stats[ STAT_HEALTH ] = ent->health; // FIXME: get rid of ent->health... +  if( ent->client->ps.stats[ STAT_HEALTH ] != ent->health ) +  { +    ent->client->ps.stats[ STAT_HEALTH ] = ent->health; // FIXME: get rid of ent->health... +    ent->client->pers.infoChangeTime = level.time; +  }    // respawn if dead    if( ent->client->ps.stats[ STAT_HEALTH ] <= 0 && level.time >= ent->client->respawnTime ) diff --git a/src/game/g_client.c b/src/game/g_client.c index 88e75d0b..96b16c3d 100644 --- a/src/game/g_client.c +++ b/src/game/g_client.c @@ -980,9 +980,13 @@ char *ClientUserinfoChanged( int clientNum, qboolean forceName )    s = Info_ValueForKey( userinfo, "teamoverlay" );    if( atoi( s ) != 0 ) -    client->pers.teamInfo = qtrue; +  { +    // teamoverlay was enabled so we need an update +    if( client->pers.teamInfo == 0 ) +      client->pers.teamInfo = 1; +  }    else -    client->pers.teamInfo = qfalse; +    client->pers.teamInfo = 0;    s = Info_ValueForKey( userinfo, "cg_unlagged" );    if( !s[0] || atoi( s ) != 0 ) @@ -1516,6 +1520,8 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn, vec3_t origin, vec3_t angles    // clear entity state values    BG_PlayerStateToEntityState( &client->ps, &ent->s, qtrue ); + +  client->pers.infoChangeTime = level.time;  } diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index 664df9fa..5299af18 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -2238,10 +2238,14 @@ void Cmd_Buy_f( gentity_t *ent )      G_AddCreditToClient( ent->client, -(short)BG_Upgrade( upgrade )->price, qfalse );    }    else +  {      G_TriggerMenu( ent->client->ps.clientNum, MN_H_UNKNOWNITEM ); +    return; +  }    //update ClientInfo    ClientUserinfoChanged( ent->client->ps.clientNum, qfalse ); +  ent->client->pers.infoChangeTime = level.time;  } @@ -2412,10 +2416,14 @@ void Cmd_Sell_f( gentity_t *ent )      }    }    else +  {      G_TriggerMenu( ent->client->ps.clientNum, MN_H_UNKNOWNITEM ); +    return; +  }    //update ClientInfo    ClientUserinfoChanged( ent->client->ps.clientNum, qfalse ); +  ent->client->pers.infoChangeTime = level.time;  } diff --git a/src/game/g_combat.c b/src/game/g_combat.c index fcdc2ee2..6cb06309 100644 --- a/src/game/g_combat.c +++ b/src/game/g_combat.c @@ -419,6 +419,8 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int    }    trap_LinkEntity( self ); + +  self->client->pers.infoChangeTime = level.time;  }  /* @@ -1139,7 +1141,10 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,      targ->health = targ->health - take;      if( targ->client ) +    {        targ->client->ps.stats[ STAT_HEALTH ] = targ->health; +      targ->client->pers.infoChangeTime = level.time; +    }      targ->lastDamageTime = level.time;      targ->nextRegenTime = level.time + ALIEN_REGEN_DAMAGE_TIME; diff --git a/src/game/g_local.h b/src/game/g_local.h index 81700620..05fea6df 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -310,7 +310,7 @@ typedef struct    char                netname[ MAX_NAME_LENGTH ];    int                 enterTime;          // level.time the client entered the game    int                 location;           // player locations -  qboolean            teamInfo;           // send team overlay updates? +  int                 teamInfo;           // level.time of team overlay update (disabled = 0)    float               flySpeed;           // for spectator/noclip moves    qboolean            disableBlueprintErrors; // should the buildable blueprint never be hidden from the players? @@ -340,9 +340,10 @@ typedef struct    char                guid[ 33 ];    addr_t              ip;    char                voice[ MAX_VOICE_NAME_LEN ]; -  qboolean            useUnlagged;   -  // keep track of other players' info for tinfo -  char                cinfo[ MAX_CLIENTS ][ 16 ]; +  qboolean            useUnlagged; + +  // level.time when teamoverlay info changed so we know to tell other players +  int                 infoChangeTime;  } clientPersistant_t;  #define MAX_UNLAGGED_MARKERS 10 diff --git a/src/game/g_team.c b/src/game/g_team.c index a527ff91..ec387acd 100644 --- a/src/game/g_team.c +++ b/src/game/g_team.c @@ -301,15 +301,15 @@ Format:  */  void TeamplayInfoMessage( gentity_t *ent )  { -  char      entry[ 19 ], string[ 1143 ]; +  char      entry[ 17 ], +            string[ ( MAX_CLIENTS - 1 ) * ( sizeof( entry ) - 1 ) + 1 ];    int       i, j;     int       team, stringlength; -  int       sent = 0;    gentity_t *player;    gclient_t *cl;    upgrade_t upgrade = UP_NONE;    int       curWeaponClass = WP_NONE ; // sends weapon for humans, class for aliens -  char      *tmp; +  char      *format;    if( !g_allowTeamOverlay.integer )       return; @@ -328,10 +328,15 @@ void TeamplayInfoMessage( gentity_t *ent )    else      team = ent->client->pers.teamSelection; +  if( team == TEAM_ALIENS ) +    format = " %i %i %i %i"; // aliens don't have upgrades +  else +    format = " %i %i %i %i %i"; +    string[ 0 ] = '\0';    stringlength = 0; -  for( i = 0; i < MAX_CLIENTS; i++) +  for( i = 0; i < level.maxclients; i++)    {      player = g_entities + i ;      cl = player->client; @@ -340,6 +345,10 @@ void TeamplayInfoMessage( gentity_t *ent )          !player->inuse )        continue; +    // only update if changed since last time +    if( cl->pers.infoChangeTime <= ent->client->pers.teamInfo ) +      continue; +      if( cl->sess.spectatorState != SPECTATOR_NOT )      {        curWeaponClass = WP_NONE; @@ -367,36 +376,28 @@ void TeamplayInfoMessage( gentity_t *ent )        curWeaponClass = cl->ps.stats[ STAT_CLASS ];        upgrade = UP_NONE;      } -  -    tmp = va( "%i %i %i %i", -      player->client->pers.location, -      player->client->ps.stats[ STAT_HEALTH ] < 1 ? 0 : -        player->client->ps.stats[ STAT_HEALTH ], -      curWeaponClass,  -      upgrade ); -    if( !strcmp( ent->client->pers.cinfo[ i ], tmp ) ) -      continue; - -    Q_strncpyz( ent->client->pers.cinfo[ i ], tmp, -      sizeof( ent->client->pers.cinfo[ i ] ) ); - -    Com_sprintf( entry, sizeof( entry ), " %i %s", i, tmp ); +    Com_sprintf( entry, sizeof( entry ), format, i, +      cl->pers.location, +      cl->ps.stats[ STAT_HEALTH ] < 1 ? 0 : cl->ps.stats[ STAT_HEALTH ], +      curWeaponClass, +      upgrade );      j = strlen( entry ); -    if( stringlength + j > sizeof( string ) ) +    // this should not happen if entry and string sizes are correct +    if( stringlength + j >= sizeof( string ) )        break;      strcpy( string + stringlength, entry );      stringlength += j; -    sent++;    } -  if( !sent ) -    return;  - -  trap_SendServerCommand( ent - g_entities, va( "tinfo%s", string ) ); +  if( string[ 0 ] ) +  { +    trap_SendServerCommand( ent - g_entities, va( "tinfo%s", string ) ); +    ent->client->pers.teamInfo = level.time; +  }  }  void CheckTeamStatus( void ) @@ -421,9 +422,18 @@ void CheckTeamStatus( void )          loc = Team_GetLocation( ent );          if( loc ) -          ent->client->pers.location = loc->s.generic1; -        else +        { +          if( ent->client->pers.location != loc->s.generic1 ) +          { +            ent->client->pers.infoChangeTime = level.time; +            ent->client->pers.location = loc->s.generic1; +          } +        } +        else if( ent->client->pers.location != 0 ) +        { +          ent->client->pers.infoChangeTime = level.time;            ent->client->pers.location = 0; +        }        }      }  | 
