AMX Mod X Plugin Approver
|
01-26-2011
, 14:52
Re: Traceline with multiple hits
|
#7
|
If interested, here how works CS when you shot a bullet.
PHP Code:
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( unknownParam || RANDOM_NUM( 0, 3 ) ) { bSomeVar = TRUE; } */
int iDamageType = DMG_BULLET | DMG_NEVERGIB; // DecalGunshot( &tr, iBulletType, bSomeVar?, pev, bSparks? ); if( pEntity->pev->solid == SOLID_BSP && iPenetration ) { vecSrc = tr.vecEndpos + ( vecDir * iPenetrationPower ); flDistance = ( flDistance - flCurrentDistance ) * 0.5; vecEnd = ( vecDir * flDistance ) + vecSrc;
pEntity->TraceAttack( pevAttacker, iCurrentDamage, vecDir, &tr, iDamageType );
iCurrentDamage *= flDamageModifier; } else { vecSrc = tr.vecEndpos + ( vecDir * 42.0 ); flDistance = ( flDistance - flCurrentDistance ) * 0.75; vecEnd = ( vecDir * flDistance ) + vecSrc; pEntity->TraceAttack( pevAttacker, iCurrentDamage, vecDir, &tr, iDamageType );
iCurrentDamage *= 0.75; } } else { iPenetration = 0; }
ApplyMultiDamage(); }
return Vector( x * vecSpread, y * vecSpread, 0 ); }
__________________
Last edited by Arkshine; 01-26-2011 at 17:43.
|
|