/* ================================================================================= env_portal_* ================================================================================= */ void gfx_portal_locateCamera( gentity_t *self ) { vec3_t dir; gentity_t *target; gentity_t *owner; owner = G_PickRandomTargetFor( self ); if ( !owner ) { G_FreeEntity( self ); return; } self->r.ownerNum = owner->s.number; // frame holds the rotate speed if ( owner->spawnflags & 1 ) { self->s.frame = 25; } else if ( owner->spawnflags & 2 ) { self->s.frame = 75; } // swing camera ? if ( owner->spawnflags & 4 ) { // set to 0 for no rotation at all self->s.misc = 0; } else { self->s.misc = 1; } // clientNum holds the rotate offset self->s.clientNum = owner->s.clientNum; VectorCopy( owner->s.origin, self->s.origin2 ); // see if the portal_camera has a target target = G_PickRandomTargetFor( owner ); if ( target ) { VectorSubtract( target->s.origin, owner->s.origin, dir ); VectorNormalize( dir ); } else { G_SetMovedir( owner->s.angles, dir ); } self->s.eventParm = DirToByte( dir ); }
void env_afx_teleporter_touch( gentity_t *self, gentity_t *other, trace_t* ) { gentity_t *dest; if ( self->s.eFlags & EF_NODRAW ) { return; } if ( !other->client ) { return; } if ( other->client->ps.pm_type == PM_DEAD ) { return; } // Spectators only? if ( ( self->spawnflags & 1 ) && other->client->sess.spectatorState == SPECTATOR_NOT ) { return; } dest = G_PickRandomTargetFor( self ); if ( !dest ) return; G_TeleportPlayer( other, dest->s.origin, dest->s.angles, self->config.speed ); }
/* ================================================================================= target_teleporter ================================================================================= */ void target_teleporter_act( gentity_t *self, gentity_t *other, gentity_t *activator ) { gentity_t *dest; if ( !activator || !activator->client ) { return; } dest = G_PickRandomTargetFor( self ); if ( !dest ) return; G_TeleportPlayer( activator, dest->s.origin, dest->s.angles, self->config.speed ); }
/* ================= AimAtTarget Calculate origin2 so the target apogee will be hit ================= */ void think_aimAtTarget( gentity_t *self ) { gentity_t *pickedTarget; vec3_t origin; float height, gravity, time, forward; float distance; VectorAdd( self->r.absmin, self->r.absmax, origin ); VectorScale( origin, 0.5, origin ); pickedTarget = G_PickRandomTargetFor( self ); if ( !pickedTarget ) { G_FreeEntity( self ); return; } height = pickedTarget->s.origin[ 2 ] - origin[ 2 ]; gravity = g_gravity.value; time = sqrt( height / ( 0.5 * gravity ) ); if ( !time ) { G_FreeEntity( self ); return; } // set s.origin2 to the push velocity VectorSubtract( pickedTarget->s.origin, origin, self->s.origin2 ); self->s.origin2[ 2 ] = 0; distance = VectorNormalize( self->s.origin2 ); forward = distance / time; VectorScale( self->s.origin2, forward, self->s.origin2 ); self->s.origin2[ 2 ] = time * gravity; }