void FireSentryBulletsNEW( int shotcount, gedict_t * targ, float spread_x, float spread_y, float spread_z ) { vec3_t src; vec3_t dst; vec3_t norm_dir; sgAimNew( self, targ, src, dst, norm_dir ); ClearMultiDamage( ); traceline( PASSVEC3( src ), PASSVEC3( dst ), 0, self ); VectorScale( norm_dir, 4, puff_org ); VectorSubtract( g_globalvars.trace_endpos, puff_org, puff_org ); for ( ; shotcount > 0 ; shotcount-- ) { // для каждого выстрела определяем trace_ent trace_endpos // т.к.выстрелы могут убрать препятствия traceline( PASSVEC3( src ), PASSVEC3( dst ), 0, self ); // TraceAttack требует нормализованый вектор для корректного определения blood_org if(g_globalvars.trace_fraction != 1) TraceAttack( 4, norm_dir ); } ApplyMultiDamage( ); Multi_Finish( ); }
/* ================ FireBullets Used by shotgun, super shotgun, and enemy soldier firing Go to the trouble of combining multiple pellets into a single damage call. ================ */ void FireBullets( float shotcount, vec3_t dir, float spread_x, float spread_y, float spread_z ) { vec3_t direction; vec3_t src, tmp; makevectors( self->s.v.v_angle ); VectorScale( g_globalvars.v_forward, 10, tmp ); VectorAdd( self->s.v.origin, tmp, src ); //src = self->s.v.origin + v_forward*10; src[2] = self->s.v.absmin[2] + self->s.v.size[2] * 0.7; ClearMultiDamage(); traceline( PASSVEC3( src ), src[0] + dir[0] * 2048, src[1] + dir[1] * 2048, src[2] + dir[2] * 2048, false, self ); VectorScale( dir, 4, tmp ); VectorSubtract( g_globalvars.trace_endpos, tmp, puff_org ); // puff_org = trace_endpos - dir*4; while ( shotcount > 0 ) { VectorScale( g_globalvars.v_right, crandom() * spread_x, tmp ); VectorAdd( dir, tmp, direction ); VectorScale( g_globalvars.v_up, crandom() * spread_y, tmp ); VectorAdd( direction, tmp, direction ); // direction = dir + crandom()*spread[0]*v_right + crandom()*spread[1]*v_up; VectorScale( direction, 2048, tmp ); VectorAdd( src, tmp, tmp ); traceline( PASSVEC3( src ), PASSVEC3( tmp ), false, self ); if ( g_globalvars.trace_fraction != 1.0 ) TraceAttack( 4, direction ); shotcount = shotcount - 1; } ApplyMultiDamage(); Multi_Finish(); }
void FireSentryBulletsMTFL2( int shotcount, gedict_t * targ, float spread_x, float spread_y, float spread_z ) { vec3_t direction; vec3_t src; vec3_t dir, end, tmp; sgAimMTFL2( self, targ, src, dir ); ClearMultiDamage( ); VectorScale( dir, 2048, end ); VectorAdd( end, src, end ); traceline( PASSVEC3( src ), PASSVEC3( end ), 0, self ); VectorScale( dir, 4, puff_org ); VectorSubtract( g_globalvars.trace_endpos, puff_org, puff_org ); while ( shotcount > 0 ) { VectorScale( g_globalvars.v_right, crandom( ) * spread_x, tmp ); VectorScale( g_globalvars.v_up, crandom( ) * spread_y, direction ); VectorAdd( direction, tmp, direction ); VectorAdd( direction, dir, direction ); VectorNormalize( direction ); VectorScale( direction, 2048, end ); VectorAdd( end, src, end ); traceline( PASSVEC3( src ), PASSVEC3( end ), 0, self ); if ( g_globalvars.trace_fraction != 1 ) { TraceAttack( 4, direction ); } shotcount = shotcount - 1; } ApplyMultiDamage( ); Multi_Finish( ); }