//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponCGuard::UpdateLasers( void ) { //Only update the lasers whilst charging if ( ( m_flChargeTime < gpGlobals->curtime ) || ( m_bFired ) ) return; Vector start, end, v_forward, v_right, v_up; CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( pPlayer == NULL ) return; pPlayer->GetVectors( &v_forward, &v_right, &v_up ); //Get the position of the laser start = pPlayer->Weapon_ShootPosition( ); start += ( v_forward * 8.0f ) + ( v_right * 3.0f ) + ( v_up * -2.0f ); end = start + ( v_forward * MAX_TRACE_LENGTH ); float angleOffset = ( 1.0f - ( m_flChargeTime - gpGlobals->curtime ) ) / 1.0f; Vector offset[4]; offset[0] = Vector( 0.0f, 0.5f, -0.5f ); offset[1] = Vector( 0.0f, 0.5f, 0.5f ); offset[2] = Vector( 0.0f, -0.5f, -0.5f ); offset[3] = Vector( 0.0f, -0.5f, 0.5f ); QAngle v_ang; Vector v_dir; angleOffset *= 2.0f; if ( angleOffset > 1.0f ) angleOffset = 1.0f; for ( int i = 0; i < 4; i++ ) { Vector ofs = start + ( v_forward * offset[i][0] ) + ( v_right * offset[i][1] ) + ( v_up * offset[i][2] ); float hScale = ( offset[i][1] <= 0.0f ) ? 1.0f : -1.0f; float vScale = ( offset[i][2] <= 0.0f ) ? 1.0f : -1.0f; VectorAngles( v_forward, v_ang ); v_ang[PITCH] = UTIL_AngleMod( v_ang[PITCH] + ( (1.0f-angleOffset) * 15.0f * vScale ) ); v_ang[YAW] = UTIL_AngleMod( v_ang[YAW] + ( (1.0f-angleOffset) * 15.0f * hScale ) ); AngleVectors( v_ang, &v_dir ); trace_t tr; UTIL_TraceLine( ofs, ofs + ( v_dir * MAX_TRACE_LENGTH ), MASK_SHOT, this, COLLISION_GROUP_NONE, &tr ); UTIL_Beam( ofs, tr.endpos, m_beamIndex, 0, 0, 2.0f, 0.1f, 2, 0, 1, 0, 255, 255, 255, 32, 100 ); UTIL_Beam( ofs, tr.endpos, m_haloIndex, 0, 0, 2.0f, 0.1f, 4, 0, 1, 16, 255, 255, 255, 8, 100 ); } }
//----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CWeaponImmolator::Update() { float flDuration = gpGlobals->curtime - m_flTimeLastUpdatedRadius; if( flDuration != 0.0 ) { m_flBurnRadius += RADIUS_GROW_RATE * flDuration; } // Clamp m_flBurnRadius = MIN( m_flBurnRadius, MAX_BURN_RADIUS ); CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); Vector vecSrc; Vector vecAiming; if( pOwner ) { vecSrc = pOwner->Weapon_ShootPosition( ); vecAiming = pOwner->GetAutoaimVector(AUTOAIM_2DEGREES); } else { CBaseCombatCharacter *pOwner = GetOwner(); vecSrc = pOwner->Weapon_ShootPosition( ); vecAiming = m_vecImmolatorTarget - vecSrc; VectorNormalize( vecAiming ); } trace_t tr; UTIL_TraceLine( vecSrc, vecSrc + vecAiming * MAX_TRACE_LENGTH, MASK_SHOT, pOwner, COLLISION_GROUP_NONE, &tr ); int brightness; brightness = 255 * (m_flBurnRadius/MAX_BURN_RADIUS); UTIL_Beam( vecSrc, tr.endpos, m_beamIndex, 0, //halo index 0, //frame start 2.0f, //framerate 0.1f, //life 20, // width 1, // endwidth 0, // fadelength, 1, // noise 0, // red 255, // green 0, // blue, brightness, // bright 100 // speed ); if( tr.DidHitWorld() ) { int beams; for( beams = 0 ; beams < 5 ; beams++ ) { Vector vecDest; // Random unit vector vecDest.x = random->RandomFloat( -1, 1 ); vecDest.y = random->RandomFloat( -1, 1 ); vecDest.z = random->RandomFloat( 0, 1 ); // Push out to radius dist. vecDest = tr.endpos + vecDest * m_flBurnRadius; UTIL_Beam( tr.endpos, vecDest, m_beamIndex, 0, //halo index 0, //frame start 2.0f, //framerate 0.15f, //life 20, // width 1.75, // endwidth 0.75, // fadelength, 15, // noise 0, // red 255, // green 0, // blue, 128, // bright 100 // speed ); } // Immolator starts to hurt a few seconds after the effect is seen if( m_flBurnRadius > 64.0 ) { ImmolationDamage( CTakeDamageInfo( this, this, 1, DMG_BURN ), tr.endpos, m_flBurnRadius, CLASS_NONE ); } } else { // The attack beam struck some kind of entity directly. } m_flTimeLastUpdatedRadius = gpGlobals->curtime; if( m_flBurnRadius >= MAX_BURN_RADIUS ) { StopImmolating(); } }