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(); }
// 20mm cannon // self->nojumptime < - fixes the bh w/ 20mm bug void BigAssBullet ( vec3_t direction, float damage ) { vec3_t org, src, vtemp; makevectors( self->s.v.v_angle ); src[0] = self->s.v.origin[0] + ( g_globalvars.v_forward[0] * 10 ); src[1] = self->s.v.origin[1] + ( g_globalvars.v_forward[0] * 10 ); src[2] = self->s.v.absmin[2] + ( self->s.v.size[2] * 0.7 ); ClearMultiDamage ( ); VectorScale( direction, 1500, vtemp ); VectorAdd( vtemp, src, vtemp ); traceline( PASSVEC3( src ), PASSVEC3( vtemp ), 0, self ); //traceline( src, (src + (direction * 1500)), 0, self ); if ( g_globalvars.trace_fraction != 1 ) TraceAttack ( damage, direction ); if ( PROG_TO_EDICT( g_globalvars.trace_ent )->s.v.takedamage ) { org[0] = g_globalvars.trace_endpos[0] - ( g_globalvars.v_forward[0] * 4 ); org[1] = g_globalvars.trace_endpos[1] - ( g_globalvars.v_forward[1] * 4 ); org[2] = g_globalvars.trace_endpos[2] - ( g_globalvars.v_forward[2] * 4 ); //org = (trace_endpos - (v_forward * 4)); SpawnBlood ( org, 9 ); } else { //org = (trace_endpos - (v_forward * 4)); org[0] = g_globalvars.trace_endpos[0] - ( g_globalvars.v_forward[0] * 4 ); org[1] = g_globalvars.trace_endpos[1] - ( g_globalvars.v_forward[1] * 4 ); org[2] = g_globalvars.trace_endpos[2] - ( g_globalvars.v_forward[0] * 4 ); trap_WriteByte( MSG_BROADCAST, SVC_TEMPENTITY ); trap_WriteByte( MSG_BROADCAST, TE_SPIKE ); trap_WriteCoord( MSG_BROADCAST, org[0] ); trap_WriteCoord( MSG_BROADCAST, org[1] ); trap_WriteCoord( MSG_BROADCAST, org[2] ); trap_multicast( PASSVEC3( g_globalvars.trace_endpos ), MULTICAST_PHS ); } ApplyMultiDamage ( ); }
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( ); }