/* * G_ProjectileDistancePrestep */ static void G_ProjectileDistancePrestep( edict_t *projectile, float distance ) { float speed; vec3_t dir, dest; int mask, i; trace_t trace; #ifdef PLASMAHACK vec3_t plasma_hack_start; #endif if( projectile->movetype != MOVETYPE_TOSS && projectile->movetype != MOVETYPE_LINEARPROJECTILE && projectile->movetype != MOVETYPE_BOUNCE && projectile->movetype != MOVETYPE_BOUNCEGRENADE ) return; if( !distance ) return; if( ( speed = VectorNormalize2( projectile->velocity, dir ) ) == 0.0f ) return; mask = ( projectile->r.clipmask ) ? projectile->r.clipmask : MASK_SHOT; // race trick should come set up inside clipmask if( projectile->movetype == MOVETYPE_LINEARPROJECTILE ) VectorCopy( projectile->s.origin2, projectile->s.origin ); #ifdef PLASMAHACK VectorCopy( projectile->s.origin, plasma_hack_start ); #endif VectorMA( projectile->s.origin, distance, dir, dest ); G_Trace4D( &trace, projectile->s.origin, projectile->r.mins, projectile->r.maxs, dest, projectile->r.owner, mask, projectile->timeDelta ); for( i = 0; i < 3; i++ ) projectile->s.origin[i] = projectile->s.origin2[i] = projectile->olds.origin[i] = projectile->olds.origin2[i] = trace.endpos[i]; GClip_LinkEntity( projectile ); SV_Impact( projectile, &trace ); // set initial water state if( !projectile->r.inuse ) return; projectile->waterlevel = ( G_PointContents4D( projectile->s.origin, projectile->timeDelta ) & MASK_WATER ) ? qtrue : qfalse; // ffs : hack for the plasmagun #ifdef PLASMAHACK if( projectile->s.type == ET_PLASMA ) if (trap_Cvar_Get( "rs_plasma_hack", "1", CVAR_ARCHIVE )->integer==1)//racesow W_Plasma_Backtrace( projectile, plasma_hack_start ); #endif }
/* * W_Think_Plasma */ static void W_Think_Plasma( edict_t *ent ) { vec3_t start; if( ent->timeout < level.time ) { G_FreeEdict( ent ); return; } if( ent->r.inuse ) { ent->nextThink = level.time + 1; } VectorMA( ent->s.origin, -( game.frametime * 0.001 ), ent->velocity, start ); W_Plasma_Backtrace( ent, start ); }