// this function only gets called in multiplayer void CCrossbow::FireSniperBolt() { m_flNextPrimaryAttack = gpGlobals->time + 0.75; if (m_iClip == 0) { PlayEmptySound( ); return; } TraceResult tr; m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME; m_iClip--; // make twang sound EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/xbow_fire1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 93 + RANDOM_LONG(0,0xF)); if (m_iClip) { EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/xbow_reload1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 93 + RANDOM_LONG(0,0xF)); SendWeaponAnim( CROSSBOW_FIRE1 ); } else if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] == 0) { SendWeaponAnim( CROSSBOW_FIRE3 ); } // player "shoot" animation m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); Vector anglesAim = m_pPlayer->pev->viewangles + m_pPlayer->pev->punchangle; UTIL_MakeVectors( anglesAim ); Vector vecSrc = m_pPlayer->GetGunPosition( ) - gpGlobals->v_up * 2; Vector vecDir = gpGlobals->v_forward; UTIL_TraceLine(vecSrc, vecSrc + vecDir * 8192, dont_ignore_monsters, m_pPlayer->edict(), &tr); if ( tr.pHit->v.takedamage ) { switch( RANDOM_LONG(0,1) ) { case 0: EMIT_SOUND( tr.pHit, CHAN_BODY, "weapons/xbow_hitbod1.wav", 1, ATTN_NORM); break; case 1: EMIT_SOUND( tr.pHit, CHAN_BODY, "weapons/xbow_hitbod2.wav", 1, ATTN_NORM); break; } ClearMultiDamage( ); CBaseEntity::Instance(tr.pHit)->TraceAttack(m_pPlayer->pev, 120, vecDir, &tr, DMG_BULLET | DMG_NEVERGIB ); ApplyMultiDamage( pev, m_pPlayer->pev ); } else { // create a bolt CCrossbowBolt *pBolt = CCrossbowBolt::BoltCreate(); pBolt->pev->origin = tr.vecEndPos - vecDir * 10; pBolt->pev->angles = UTIL_VecToAngles( vecDir ); pBolt->pev->solid = SOLID_NOT; pBolt->SetTouch( NULL ); pBolt->SetThink( SUB_Remove ); EMIT_SOUND( pBolt->edict(), CHAN_WEAPON, "weapons/xbow_hit1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM ); if (UTIL_PointContents(tr.vecEndPos) != CONTENTS_WATER) { UTIL_Sparks( tr.vecEndPos ); } if ( FClassnameIs( tr.pHit, "worldspawn" ) ) { // let the bolt sit around for a while if it hit static architecture pBolt->pev->nextthink = gpGlobals->time + 5.0; } else { pBolt->pev->nextthink = gpGlobals->time; } } }