Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Vector CBaseEntity::FireBullets3( Vector vecSrc, Vector vecDirShooting, Vector vecSpread,
- float flDistance, int iPenetration, int iBulletType, int iDamage, float flRangeModifier,
- entvars_t *pevAttacker, _, int shared_rand )
- {
- int iCurrentDamage = iDamage;
- Vector vecRight = gpGlobals->v_right;
- Vector vecUp = gpGlobals->v_up;
- TraceResult tr;
- int iPenetrationPower;
- float flPenetrationDistance;
- float flCurrentDistance;
- float x, y, z;
- switch( iBulletType )
- {
- case BULLET_PLAYER_9MM :
- {
- iPenetrationPower = 21;
- flPenetrationDistance = 800.0;
- break;
- }
- case BULLET_PLAYER_45ACP :
- {
- iPenetrationPower = 15;
- flPenetrationDistance = 500.0;
- break;
- }
- case BULLET_PLAYER_50AE :
- {
- iPenetrationPower = 30;
- flPenetrationDistance = 1000.0;
- break;
- }
- case BULLET_PLAYER_762MM :
- {
- iPenetrationPower = 39;
- flPenetrationDistance = 5000.0;
- break;
- }
- case BULLET_PLAYER_556MM :
- {
- iPenetrationPower = 35;
- flPenetrationDistance = 4000.0;
- break;
- }
- case BULLET_PLAYER_338MAG :
- {
- iPenetrationPower = 45;
- flPenetrationDistance = 8000.0;
- break;
- }
- case BULLET_PLAYER_57MM :
- {
- iPenetrationPower = 30;
- flPenetrationDistance = 2000.0;
- break;
- }
- case BULLET_PLAYER_357SIG :
- {
- iPenetrationPower = 25;
- flPenetrationDistance = 800.0;
- break;
- }
- default :
- {
- iPenetrationPower = 0;
- flPenetrationDistance = 0.0;
- break;
- }
- }
- if( pevAttacker == NULL )
- pevAttacker = pev;
- gMultiDamage.type = ( DMG_BULLET | DMG_NEVERGIB );
- if( IsPlayer() )
- {
- x = UTIL_SharedRandomFloat( shared_rand , -0.5, 0.5 ) + UTIL_SharedRandomFloat( shared_rand + 1, -0.5, 0.5 );
- y = UTIL_SharedRandomFloat( shared_rand + 2, -0.5, 0.5 ) + UTIL_SharedRandomFloat( shared_rand + 3, -0.5, 0.5 );
- }
- else
- {
- do
- {
- x = RANDOM_FLOAT( -0.5, 0.5 ) + RANDOM_FLOAT( -0.5, 0.5 );
- y = RANDOM_FLOAT( -0.5, 0.5 ) + RANDOM_FLOAT( -0.5, 0.5 );
- }
- while( x * x + y * y > 1 );
- }
- [...]
- Vector vecDir = vecDirShooting + x * vecSpread.x * vecRight + y * vecSpread.y * vecUp;
- Vector vecEnd = vecSrc + vecDir * flDistance;
- while( iPenetration )
- {
- ClearMultiDamage();
- UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( pev ), &tr );
- if( tr.fraction != 1.0 )
- {
- TheBots->OnEvent( EVENT_PLAYER_SHOOT, pev, tr.vecEndPos );
- }
- BOOL bSparks;
- BOOL bHitMetal;
- switch( UTIL_TextureHit( tr, vecSrc, vecEnd ) )
- {
- case CHAR_TEX_METAL :
- {
- bSparks = bHitMetal = TRUE;
- iPenetrationPower = (int)( iPenetrationPower * 0.15 );
- flDamageModifier = 0.2;
- break;
- }
- case CHAR_TEX_CONCRETE :
- {
- iPenetrationPower = (int)( iPenetrationPower * 0.25 );
- flDamageModifier = 0.25;
- break;
- }
- case CHAR_TEX_GRATE :
- {
- bSparks = bHitMetal = TRUE;
- iPenetrationPower = (int)( iPenetrationPower * 0.5 );
- flDamageModifier = 0.4;
- break;
- }
- case CHAR_TEX_VENT :
- {
- bSparks = bHitMetal = TRUE;
- iPenetrationPower = (int)( iPenetrationPower * 0.5 );
- flDamageModifier = 0.45;
- break;
- }
- case CHAR_TEX_TILE :
- {
- iPenetrationPower = (int)( iPenetrationPower * 0.65 );
- flDamageModifier = 0.3;
- break;
- }
- case CHAR_TEX_COMPUTER :
- {
- bSparks = bHitMetal = TRUE;;
- iPenetrationPower = (int)( iPenetrationPower * 0.4 );
- flDamageModifier = 0.45;
- break;
- }
- case CHAR_TEX_WOOD :
- {
- iPenetrationPower = (int)( iPenetrationPower * 1.0 );
- flDamageModifier = 0.6;
- break;
- }
- }
- if( tr.fraction != 1.0 )
- {
- --iPenetration;
- flCurrentDistance = tr.fraction * flDistance;
- iCurrentDamage *= pow( flCurrentDistance * 0.002, flRangeModifier );
- if( flCurrentDistance > flPenetrationDistance )
- iPenetration = 0;
- CBaseEntity *pEntity = CBaseEntity::Instance( tr.pHit );
- if( tr.iHitgroup == HITGROUP_SHIELD )
- {
- if( RANDOM_LONG( 0, 1 ) )
- EMIT_SOUND( ENT( pEntity->pev ), CHAN_VOICE, "weapons/ric_metal-1.wav", 1, ATTN_NORM );
- else
- EMIT_SOUND( ENT( pEntity->pev ), CHAN_VOICE, "weapons/ric_metal-2.wav", 1, ATTN_NORM );
- UTIL_Sparks( tr.vecEndPos );
- pEntity->pev->punchangle.x = iCurrentDamage * RANDOM_FLOAT ( -0.15, 0.15 );
- pEntity->pev->punchangle.z = iCurrentDamage * RANDOM_FLOAT ( -0.15, 0.15 );
- if( pEntity->pev->punchangle.x < 4 )
- pEntity->pev->punchangle.x = -4;
- if( pEntity->pev->punchangle.z < -5 )
- pEntity->pev->punchangle.z = -5;
- else if( pEntity->pev->punchangle.z > 5 )
- pEntity->pev->punchangle.z = 5;
- break;
- }
- if( unknown || RANDOM_NUM( 0, 3 ) )
- {
- bVar = TRUE;
- }
- int iDamageType = DMG_BULLET | DMG_NEVERGIB;
- // DecalGunshot( &tr, iBulletType, bVar?, pev, ? );
- if( pEntity->pev->solid == SOLID_BSP && iPenetration )
- {
- vecSrc = tr.vecEndpos + ( vecDir * iPenetrationPower );
- flDistance = ( flDistance - flCurrentDistance ) * 0.5;
- vecEnd = vecSrc + ( vecDir * flDistance );
- pEntity->TraceAttack( pevAttacker, iCurrentDamage, vecDir, &tr, iDamageType );
- iCurrentDamage *= flDamageModifier;
- }
- else
- {
- vecSrc = tr.vecEndpos + ( vecDir * 42.0 );
- flDistance = ( flDistance - flCurrentDistance ) * 0.75;
- vecEnd = vecSrc + ( vecDir * flDistance );
- pEntity->TraceAttack( pevAttacker, iCurrentDamage, vecDir, &tr, iDamageType );
- iCurrentDamage *= 0.75;
- }
- }
- else
- {
- iPenetration = 0;
- }
- ApplyMultiDamage();
- }
- return Vector( x * vecSpread, y * vecSpread, 0 );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement