/* QuakeEd only writes a single float for angles (bad idea), so up and down are just constant angles. */ void SetMovedir() { if ( VectorCompareF( self->s.v.angles, 0, -1, 0 ) ) SetVector( self->s.v.movedir, 0, 0, 1 ); else if ( VectorCompareF( self->s.v.angles, 0, -2, 0 ) ) SetVector( self->s.v.movedir, 0, 0, -1 ); else { makevectors( self->s.v.angles ); VectorCopy( g_globalvars.v_forward, self->s.v.movedir ); } SetVector( self->s.v.angles, 0, 0, 0 ); }
//========================================================================= // Touch Function for EMP Grenade void EMPGrenadeTouch( ) { // If the EMP Grenade hits a player, it just bounces off sound( self, 1, "weapons/bounce.wav", 1, 1 ); if ( VectorCompareF( self->s.v.velocity, 0, 0, 0 ) ) SetVector( self->s.v.avelocity, 0, 0, 0 ); }
void multi_touch( ) { gedict_t *te; if ( !other->s.v.classname ) return; if ( strneq( other->s.v.classname, "player" ) ) return; if ( !Activated( self, other ) ) { if ( self->else_goal ) { te = Findgoal( self->else_goal ); if ( te ) AttemptToActivate( te, other, self ); } return; } if ( !VectorCompareF( self->s.v.movedir, 0, 0, 0 ) ) { trap_makevectors( other->s.v.angles ); if ( DotProduct( g_globalvars.v_forward, self->s.v.movedir ) < 0 ) return; // not facing the right way } self->s.v.enemy = EDICT_TO_PROG( other ); multi_trigger( ); }
/* ================ InitTrigger ================ */ void InitTrigger() { // trigger angles are used for one-way touches. An angle of 0 is assumed // to mean no restrictions, so use a yaw of 360 instead. if ( !VectorCompareF( self->s.v.angles, 0, 0, 0 ) ) SetMovedir( self ); self->s.v.solid = SOLID_TRIGGER; setmodel( self, self->s.v.model ); // set size and link into world self->s.v.movetype = MOVETYPE_NONE; self->s.v.modelindex = 0; self->s.v.model = ""; }
/*QUAKED trigger_monsterjump (.5 .5 .5) ? Walking monsters that touch this will jump in the direction of the trigger's angle "speed" default to 200, the speed thrown forward "height" default to 200, the speed thrown upwards */ void SP_trigger_monsterjump( ) { if ( !CheckExistence( ) ) { dremove( self ); return; } if ( !self->speed ) self->speed = 200; if ( !self->height ) self->height = 200; if ( VectorCompareF( self->s.v.angles, 0, 0, 0 ) ) SetVector( self->s.v.angles, 0, 360, 0 ); InitTrigger( ); self->s.v.touch = ( func_t ) trigger_monsterjump_touch; }