void CMissile::DumbFire( void ) { SetThink( &CMissile::DumbThink ); SetMoveType( MOVETYPE_FLY ); SetModel("models/weapons/w_missile.mdl"); UTIL_SetSize( this, vec3_origin, vec3_origin ); EmitSound( "Missile.Ignite" ); Vector vecForward; //QAngle angles; //angles.x += 1; //angles.y += 1; //SetLocalAngles( angles ); AngleVectors( GetLocalAngles(), &vecForward ); SetAbsVelocity( vecForward * RPG_SPEED ); // Smoke trail. CreateSmokeTrail(); } void CMissile::DumbThink( void ) //Added this so I can make my missiles spiral around each other later { SetMoveType( MOVETYPE_FLY ); SetModel("models/weapons/w_missile.mdl"); UTIL_SetSize( this, vec3_origin, vec3_origin ); RemoveSolidFlags( FSOLID_NOT_SOLID ); //TODO: Play opening sound Vector vecForward; QAngle angForward; EmitSound( "Missile.Ignite" ); angForward = GetAbsAngles(); //angForward.z += 10; //SetLocalAngles( angForward ); AngleVectors( GetLocalAngles(), &vecForward ); SetAbsVelocity( vecForward * ( RPG_SPEED - 800 )); SetNextThink( gpGlobals->curtime ); CreateSmokeTrail(); } void CWeaponRPG::SecondaryAttack( void ) { CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); // Can't have a missile out. if ( m_hMissile != NULL ) return; // Can't be reloading. if ( GetActivity() == ACT_VM_RELOAD ) return; if ( pOwner == NULL ) return; int intAmmoAmount; Vector vecOrigin; Vector vecForward; m_flNextSecondaryAttack = gpGlobals->curtime + 2.0f; Vector vForward, vRight, vUp; pOwner->EyeVectors( &vForward, &vRight, &vUp ); Vector muzzlePoint = pOwner->Weapon_ShootPosition() + vForward * 12.0f + vRight * 6.0f + vUp * -3.0f; intAmmoAmount = Clip1(); if ( intAmmoAmount <= 0 ) { WeaponSound( EMPTY ); return; } for ( int i = 0; i < intAmmoAmount; i++ ) { QAngle vecAngles; VectorAngles( vForward, vecAngles ); vecAngles.x += ((rand() % 250) / 100.0) * (rand() % 2 == 1 ? -1 : 1); vecAngles.y += ((rand() % 250) / 100.0) * (rand() % 2 == 1 ? -1 : 1); muzzlePoint.x += i * -2; m_hMissile = CMissile::Create( muzzlePoint, vecAngles, GetOwner()->edict() ); m_hMissile->m_hOwner = this; m_hMissile->DumbFire(); } // If the shot is clear to the player, give the missile a grace period trace_t tr; Vector vecEye = pOwner->EyePosition(); UTIL_TraceLine( vecEye, vecEye + vForward * 128, MASK_SHOT, this, COLLISION_GROUP_NONE, &tr ); if ( tr.fraction == 1.0 ) { m_hMissile->SetGracePeriod( 0.3 ); } m_iClip1 -= intAmmoAmount; Reload(); // Register a muzzleflash for the AI pOwner->SetMuzzleFlashTime( gpGlobals->curtime + 0.5 ); SendWeaponAnim( ACT_VM_PRIMARYATTACK ); WeaponSound( SINGLE ); pOwner->RumbleEffect( RUMBLE_SHOTGUN_SINGLE, 0, RUMBLE_FLAG_RESTART ); // Check to see if we should trigger any RPG firing triggers int iCount = g_hWeaponFireTriggers.Count(); for ( int i = 0; i < iCount; i++ ) { if ( g_hWeaponFireTriggers[i]->IsTouching( pOwner ) ) { if ( FClassnameIs( g_hWeaponFireTriggers[i], "trigger_rpgfire" ) ) { g_hWeaponFireTriggers[i]->ActivateMultiTrigger( pOwner ); } } } if( hl2_episodic.GetBool() ) { CAI_BaseNPC **ppAIs = g_AI_Manager.AccessAIs(); int nAIs = g_AI_Manager.NumAIs(); string_t iszStriderClassname = AllocPooledString( "npc_strider" ); for ( int i = 0; i < nAIs; i++ ) { if( ppAIs[ i ]->m_iClassname == iszStriderClassname ) { ppAIs[ i ]->DispatchInteraction( g_interactionPlayerLaunchedRPG, NULL, m_hMissile ); } } } }