diff options
Diffstat (limited to 'src/game')
-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 |
6 files changed, 67 insertions, 33 deletions
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; + } } } |