diff options
Diffstat (limited to 'src/cgame')
-rw-r--r-- | src/cgame/cg_draw.c | 9 | ||||
-rw-r--r-- | src/cgame/cg_ents.c | 24 | ||||
-rw-r--r-- | src/cgame/cg_local.h | 7 | ||||
-rw-r--r-- | src/cgame/cg_players.c | 28 | ||||
-rw-r--r-- | src/cgame/cg_syscalls.c | 5 |
5 files changed, 71 insertions, 2 deletions
diff --git a/src/cgame/cg_draw.c b/src/cgame/cg_draw.c index 5f28cc57..0f407803 100644 --- a/src/cgame/cg_draw.c +++ b/src/cgame/cg_draw.c @@ -2261,10 +2261,17 @@ CG_DrawLocation static void CG_DrawLocation( rectDef_t *rect, float scale, int textalign, vec4_t color ) { const char *location; + centity_t *locent; float maxX; float tx = rect->x, ty = rect->y; maxX = rect->x + rect->w; - location = CG_ConfigString( CS_LOCATIONS + cgs.clientinfo[ cg.clientNum ].location ); + + locent = CG_GetLocation( &cg_entities[ cg.clientNum ] ); + if( locent ) + location = CG_ConfigString( CS_LOCATIONS + locent->currentState.generic1 ); + else + location = CG_ConfigString( CS_LOCATIONS ); + if( UI_Text_Width( location, scale, 0 ) < rect->w ) CG_AlignText( rect, location, scale, 0.0f, 0.0f, textalign, VALIGN_CENTER, &tx, &ty ); diff --git a/src/cgame/cg_ents.c b/src/cgame/cg_ents.c index e8a217db..54409aee 100644 --- a/src/cgame/cg_ents.c +++ b/src/cgame/cg_ents.c @@ -811,6 +811,26 @@ static void CG_LightFlare( centity_t *cent ) /* ========================= +CG_LinkLocation +========================= +*/ +void CG_LinkLocation( centity_t *cent ) +{ + centity_t *tempent; + + for( tempent = cg.locationHead; tempent; tempent = tempent->nextLocation ) + { + if( tempent == cent ) + return; + } + + cent->nextLocation = cg.locationHead; + cg.locationHead = cent; + +} + +/* +========================= CG_AdjustPositionForMover Also called by client movement prediction code @@ -1090,6 +1110,10 @@ static void CG_AddCEntity( centity_t *cent ) case ET_LIGHTFLARE: CG_LightFlare( cent ); break; + + case ET_LOCATION: + CG_LinkLocation( cent ); + break; } } diff --git a/src/cgame/cg_local.h b/src/cgame/cg_local.h index f2807044..764d8183 100644 --- a/src/cgame/cg_local.h +++ b/src/cgame/cg_local.h @@ -682,6 +682,7 @@ typedef struct centity_s qboolean valid; qboolean oldValid; + struct centity_s *nextLocation; } centity_t; @@ -1161,6 +1162,8 @@ typedef struct float healthCrossFade; int nextWeaponClickTime; + + centity_t *locationHead; } cg_t; @@ -1646,6 +1649,7 @@ void CG_PrecacheClientInfo( class_t class, char *model, char *skin ); sfxHandle_t CG_CustomSound( int clientNum, const char *soundName ); void CG_PlayerDisconnect( vec3_t org ); void CG_Bleed( vec3_t origin, vec3_t normal, int entityNum ); +centity_t *CG_GetLocation( centity_t *cent ); // // cg_buildable.c @@ -1707,7 +1711,7 @@ void CG_PositionEntityOnTag( refEntity_t *entity, const refEntity_t *pare qhandle_t parentModel, char *tagName ); void CG_PositionRotatedEntityOnTag( refEntity_t *entity, const refEntity_t *parent, qhandle_t parentModel, char *tagName ); - +void CG_LinkLocation( centity_t* cent ); @@ -1984,6 +1988,7 @@ void trap_R_AddRefEntityToScene( const refEntity_t *re ); // significant construction void trap_R_AddPolyToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts ); void trap_R_AddPolysToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts, int numPolys ); +qboolean trap_R_inPVS( const vec3_t p1, const vec3_t p2 ); void trap_R_AddLightToScene( const vec3_t org, float intensity, float r, float g, float b ); void trap_R_AddAdditiveLightToScene( const vec3_t org, float intensity, float r, float g, float b ); int trap_R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir ); diff --git a/src/cgame/cg_players.c b/src/cgame/cg_players.c index 6fa577f6..54c5acd4 100644 --- a/src/cgame/cg_players.c +++ b/src/cgame/cg_players.c @@ -2369,3 +2369,31 @@ void CG_PlayerDisconnect( vec3_t org ) } } +centity_t *CG_GetLocation( centity_t *cent ) +{ + centity_t *eloc, *best; + float bestlen, len; + vec3_t origin; + trace_t tr; + + best = NULL; + bestlen = 3.0f * 8192.0f * 8192.0f; + + VectorCopy( cent->lerpOrigin, origin ); + + for( eloc = cg.locationHead; eloc; eloc = eloc->nextLocation ) + { + len = DistanceSquared(origin, eloc->lerpOrigin); + + if( len > bestlen ) + continue; + + if( !trap_R_inPVS( origin, eloc->lerpOrigin ) ) + continue; + + bestlen = len; + best = eloc; + } + + return best; +} diff --git a/src/cgame/cg_syscalls.c b/src/cgame/cg_syscalls.c index 01b7ca85..b990ab8e 100644 --- a/src/cgame/cg_syscalls.c +++ b/src/cgame/cg_syscalls.c @@ -345,6 +345,11 @@ void trap_R_AddPolyToScene( qhandle_t hShader , int numVerts, const polyVert_t * syscall( CG_R_ADDPOLYTOSCENE, hShader, numVerts, verts ); } +qboolean trap_R_inPVS( const vec3_t p1, const vec3_t p2 ) +{ + syscall( CG_R_INPVS, p1, p2 ); +} + void trap_R_AddPolysToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts, int num ) { syscall( CG_R_ADDPOLYSTOSCENE, hShader, numVerts, verts, num ); |