Advertisement
Guest User

Untitled

a guest
Jan 26th, 2011
845
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.16 KB | None | 0 0
  1.  
  2.     Vector CBaseEntity::FireBullets3( Vector vecSrc, Vector vecDirShooting, Vector vecSpread,
  3.                                       float flDistance, int iPenetration, int iBulletType, int iDamage, float flRangeModifier,
  4.                                       entvars_t *pevAttacker, _, int shared_rand )
  5.     {
  6.         int iCurrentDamage = iDamage;
  7.  
  8.         Vector vecRight = gpGlobals->v_right;
  9.         Vector vecUp    = gpGlobals->v_up;
  10.  
  11.         TraceResult tr;
  12.         int iPenetrationPower;
  13.         float flPenetrationDistance;
  14.         float flCurrentDistance;
  15.         float x, y, z;
  16.  
  17.         switch( iBulletType )
  18.         {
  19.             case BULLET_PLAYER_9MM :
  20.             {
  21.                 iPenetrationPower     = 21;
  22.                 flPenetrationDistance = 800.0;
  23.                 break;
  24.             }
  25.             case BULLET_PLAYER_45ACP :
  26.             {
  27.                 iPenetrationPower     = 15;
  28.                 flPenetrationDistance = 500.0;
  29.                 break;
  30.             }
  31.             case BULLET_PLAYER_50AE :
  32.             {
  33.                 iPenetrationPower     = 30;
  34.                 flPenetrationDistance = 1000.0;
  35.                 break;
  36.             }
  37.             case BULLET_PLAYER_762MM :
  38.             {
  39.                 iPenetrationPower     = 39;
  40.                 flPenetrationDistance = 5000.0;
  41.                 break;
  42.             }
  43.             case BULLET_PLAYER_556MM :
  44.             {
  45.                 iPenetrationPower     = 35;
  46.                 flPenetrationDistance = 4000.0;
  47.                 break;
  48.             }
  49.             case BULLET_PLAYER_338MAG :
  50.             {
  51.                 iPenetrationPower     = 45;
  52.                 flPenetrationDistance = 8000.0;
  53.                 break;
  54.             }
  55.             case BULLET_PLAYER_57MM :
  56.             {
  57.                 iPenetrationPower     = 30;
  58.                 flPenetrationDistance = 2000.0;
  59.                 break;
  60.             }
  61.             case BULLET_PLAYER_357SIG :
  62.             {
  63.                 iPenetrationPower     = 25;
  64.                 flPenetrationDistance = 800.0;
  65.                 break;
  66.             }
  67.             default :
  68.             {
  69.                 iPenetrationPower     = 0;
  70.                 flPenetrationDistance = 0.0;
  71.                 break;
  72.             }
  73.         }
  74.  
  75.         if( pevAttacker == NULL )
  76.             pevAttacker = pev;
  77.  
  78.         gMultiDamage.type = ( DMG_BULLET | DMG_NEVERGIB );
  79.  
  80.         if( IsPlayer() )
  81.         {
  82.             x = UTIL_SharedRandomFloat( shared_rand    , -0.5, 0.5 ) + UTIL_SharedRandomFloat( shared_rand + 1, -0.5, 0.5 );
  83.             y = UTIL_SharedRandomFloat( shared_rand + 2, -0.5, 0.5 ) + UTIL_SharedRandomFloat( shared_rand + 3, -0.5, 0.5 );
  84.         }
  85.         else
  86.         {
  87.             do
  88.             {
  89.                 x = RANDOM_FLOAT( -0.5, 0.5 ) + RANDOM_FLOAT( -0.5, 0.5 );
  90.                 y = RANDOM_FLOAT( -0.5, 0.5 ) + RANDOM_FLOAT( -0.5, 0.5 );
  91.             }
  92.             while( x * x + y * y > 1 );
  93.         }
  94.  
  95.         [...]
  96.        
  97.         Vector vecDir = vecDirShooting + x * vecSpread.x * vecRight + y * vecSpread.y * vecUp;
  98.         Vector vecEnd = vecSrc + vecDir * flDistance;
  99.  
  100.         while( iPenetration )
  101.         {
  102.             ClearMultiDamage();
  103.             UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( pev ), &tr );
  104.  
  105.             if( tr.fraction != 1.0 )
  106.             {
  107.                 TheBots->OnEvent( EVENT_PLAYER_SHOOT, pev, tr.vecEndPos );
  108.             }
  109.  
  110.             BOOL bSparks;
  111.             BOOL bHitMetal;
  112.  
  113.             switch( UTIL_TextureHit( tr, vecSrc, vecEnd ) )
  114.             {
  115.                 case CHAR_TEX_METAL :
  116.                 {
  117.                     bSparks = bHitMetal = TRUE;
  118.  
  119.                     iPenetrationPower = (int)( iPenetrationPower * 0.15 );
  120.                     flDamageModifier  = 0.2;
  121.                     break;
  122.                 }
  123.                 case CHAR_TEX_CONCRETE :
  124.                 {
  125.                     iPenetrationPower = (int)( iPenetrationPower * 0.25 );
  126.                     flDamageModifier  = 0.25;
  127.                     break;
  128.                 }
  129.                 case CHAR_TEX_GRATE :
  130.                 {
  131.                     bSparks = bHitMetal = TRUE;
  132.  
  133.                     iPenetrationPower = (int)( iPenetrationPower * 0.5 );
  134.                     flDamageModifier  = 0.4;
  135.                     break;
  136.                 }
  137.                 case CHAR_TEX_VENT :
  138.                 {
  139.                     bSparks = bHitMetal = TRUE;
  140.  
  141.                     iPenetrationPower = (int)( iPenetrationPower * 0.5 );
  142.                     flDamageModifier  = 0.45;
  143.                     break;
  144.                 }
  145.                 case CHAR_TEX_TILE :
  146.                 {
  147.                     iPenetrationPower = (int)( iPenetrationPower * 0.65 );
  148.                     flDamageModifier  = 0.3;
  149.                     break;
  150.                 }
  151.                 case CHAR_TEX_COMPUTER :
  152.                 {
  153.                     bSparks = bHitMetal = TRUE;;
  154.  
  155.                     iPenetrationPower = (int)( iPenetrationPower * 0.4 );
  156.                     flDamageModifier  = 0.45;
  157.                     break;
  158.                 }
  159.                 case CHAR_TEX_WOOD :
  160.                 {
  161.                     iPenetrationPower = (int)( iPenetrationPower * 1.0 );
  162.                     flDamageModifier  = 0.6;
  163.                     break;
  164.                 }
  165.             }
  166.  
  167.             if( tr.fraction != 1.0 )
  168.             {
  169.                 --iPenetration;
  170.  
  171.                 flCurrentDistance = tr.fraction * flDistance;
  172.                 iCurrentDamage *= pow( flCurrentDistance * 0.002, flRangeModifier );
  173.  
  174.                 if( flCurrentDistance > flPenetrationDistance )
  175.                     iPenetration = 0;
  176.  
  177.                 CBaseEntity *pEntity = CBaseEntity::Instance( tr.pHit );
  178.  
  179.                 if( tr.iHitgroup == HITGROUP_SHIELD )
  180.                 {
  181.                     if( RANDOM_LONG( 0, 1 ) )
  182.                         EMIT_SOUND( ENT( pEntity->pev ), CHAN_VOICE, "weapons/ric_metal-1.wav", 1, ATTN_NORM );
  183.                     else
  184.                         EMIT_SOUND( ENT( pEntity->pev ), CHAN_VOICE, "weapons/ric_metal-2.wav", 1, ATTN_NORM );
  185.  
  186.                     UTIL_Sparks( tr.vecEndPos );
  187.  
  188.                      pEntity->pev->punchangle.x = iCurrentDamage * RANDOM_FLOAT ( -0.15, 0.15 );
  189.                      pEntity->pev->punchangle.z = iCurrentDamage * RANDOM_FLOAT ( -0.15, 0.15 );
  190.  
  191.                     if( pEntity->pev->punchangle.x < 4 )
  192.                         pEntity->pev->punchangle.x = -4;
  193.  
  194.                     if( pEntity->pev->punchangle.z < -5 )
  195.                         pEntity->pev->punchangle.z = -5;
  196.                     else if( pEntity->pev->punchangle.z > 5 )
  197.                         pEntity->pev->punchangle.z = 5;
  198.                    
  199.                     break;
  200.                 }
  201.  
  202.                 if( unknown || RANDOM_NUM( 0, 3 ) )
  203.                 {
  204.                     bVar = TRUE;
  205.                 }
  206.  
  207.                 int iDamageType = DMG_BULLET | DMG_NEVERGIB;
  208.                 // DecalGunshot( &tr, iBulletType, bVar?, pev, ? );
  209.                
  210.                 if( pEntity->pev->solid == SOLID_BSP && iPenetration  )
  211.                 {
  212.                     vecSrc = tr.vecEndpos + ( vecDir * iPenetrationPower );
  213.                     flDistance = ( flDistance - flCurrentDistance ) * 0.5;
  214.                     vecEnd = vecSrc + ( vecDir * flDistance );
  215.  
  216.                     pEntity->TraceAttack( pevAttacker, iCurrentDamage, vecDir, &tr, iDamageType );
  217.  
  218.                     iCurrentDamage *= flDamageModifier;
  219.                 }
  220.                 else
  221.                 {
  222.                     vecSrc = tr.vecEndpos + ( vecDir * 42.0 );
  223.                     flDistance = ( flDistance - flCurrentDistance ) * 0.75;
  224.                     vecEnd = vecSrc + ( vecDir * flDistance );
  225.                        
  226.                     pEntity->TraceAttack( pevAttacker, iCurrentDamage, vecDir, &tr, iDamageType );
  227.  
  228.                     iCurrentDamage *= 0.75;
  229.                 }
  230.             }
  231.             else
  232.             {
  233.                 iPenetration = 0;
  234.             }
  235.  
  236.             ApplyMultiDamage();
  237.         }
  238.  
  239.         return Vector( x * vecSpread, y * vecSpread, 0 );
  240.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement