static unsigned int G_FindPointedPlayer( edict_t *self ) { trace_t trace; int i, j, bestNum = 0; vec3_t boxpoints[8]; float value, dist, value_best = 0.90f; // if nothing better is found, print nothing edict_t *other; vec3_t vieworg, dir, viewforward; if( G_IsDead( self ) ) { return 0; } // we can't handle the thirdperson modifications in server side :/ VectorSet( vieworg, self->r.client->ps.pmove.origin[0], self->r.client->ps.pmove.origin[1], self->r.client->ps.pmove.origin[2] + self->r.client->ps.viewheight ); AngleVectors( self->r.client->ps.viewangles, viewforward, NULL, NULL ); for( i = 0; i < gs.maxclients; i++ ) { other = PLAYERENT( i ); if( !other->r.inuse ) { continue; } if( !other->r.client ) { continue; } if( other == self ) { continue; } if( !other->r.solid || ( other->r.svflags & SVF_NOCLIENT ) ) { continue; } VectorSubtract( other->s.origin, self->s.origin, dir ); dist = VectorNormalize2( dir, dir ); if( dist > 1000 ) { continue; } value = DotProduct( dir, viewforward ); if( value > value_best ) { BuildBoxPoints( boxpoints, other->s.origin, tv( 4, 4, 4 ), tv( 4, 4, 4 ) ); for( j = 0; j < 8; j++ ) { G_Trace( &trace, vieworg, vec3_origin, vec3_origin, boxpoints[j], self, MASK_SHOT | MASK_OPAQUE ); if( trace.ent && trace.ent == ENTNUM( other ) ) { value_best = value; bestNum = ENTNUM( other ); } } } } return bestNum; }
static void UpdatePoint( edict_t *who ) { vec3_t angles, forward, diff; trace_t trace; edict_t *ent, *ent_best = NULL; int i, j; float value, value_best = 0.35f; // if nothing better is found, print nothing gclient_t *client = who->r.client; vec3_t boxpoints[8], viewpoint; AngleVectors( client->ps.viewangles, forward, NULL, NULL ); VectorCopy( who->s.origin, viewpoint ); viewpoint[2] += who->viewheight; for( i = 0; i < game.numentities; i++ ) { ent = game.edicts + i; if( !ent->r.inuse || !ent->s.modelindex || ent == who ) continue; if( G_ISGHOSTING( ent ) ) continue; if( ent->s.type != ET_PLAYER && ent->s.type != ET_ITEM ) continue; VectorSubtract( ent->s.origin, viewpoint, angles ); VectorNormalize( angles ); VectorSubtract( forward, angles, diff ); for( j = 0; j < 3; j++ ) if( diff[j] < 0 ) diff[j] = -diff[j]; value = VectorLengthFast( diff ); if( value < value_best ) { BuildBoxPoints( boxpoints, ent->s.origin, ent->r.mins, ent->r.maxs ); for( j = 0; j < 8; j++ ) { G_Trace( &trace, viewpoint, vec3_origin, vec3_origin, boxpoints[j], who, MASK_OPAQUE ); if( trace.fraction == 1 ) { value_best = value; ent_best = ent; break; } } } } if( ent_best != NULL ) { point = ent_best; VectorCopy( ent_best->s.origin, point_location ); } else { vec3_t dest; VectorMA( viewpoint, 8192, forward, dest ); G_Trace( &trace, viewpoint, vec3_origin, vec3_origin, dest, who, MASK_OPAQUE ); point = NULL; VectorCopy( trace.endpos, point_location ); } }