bool CGEWeaponRocketLauncher::Deploy( void )
{
	m_bPreLaunch = false;
	m_flRocketSpawnTime = -1;

	bool success = BaseClass::Deploy();

	if (m_iClip1 > 0)
		SwitchBodygroup(1, 0);
	else
		SwitchBodygroup(1, 1);

	return success;
}
//-----------------------------------------------------------------------------
// Purpose: Put the rocket back on the end of the rocket launcher after we reload it.
//-----------------------------------------------------------------------------
void CGEWeaponRocketLauncher::OnReloadOffscreen(void)
{
	BaseClass::OnReloadOffscreen();

	CBaseCombatCharacter *pOwner = GetOwner();
	if (!pOwner)
		return;

	if (pOwner->GetActiveWeapon() == this)
		SwitchBodygroup(1, 0);
}
void CWeaponShotgun::CalculateShellVis(bool fillclip)
{
	// Shells on the shotgun viewmodel will be removed if the reserve ammo is less than 5.  
	// Each time we draw and reload, we check to see if this is the case, and if it is we change bodygroups accordingly.

	CBaseCombatCharacter *pOwner = GetOwner();

	if (!pOwner)
		return;

	int reserveammo = pOwner->GetAmmoCount(m_iPrimaryAmmoType);

	if (fillclip) //If we need to fill the clip, just subtract the difference between the max capacity and the current value.
		reserveammo -= GetMaxClip1() - m_iClip1; //This can be negative, it won't change the comparision results.

	for (int i = 4; i >= 0; i--)
	{
		if (reserveammo > i)
			SwitchBodygroup(m_iShellBodyGroup[i], 0);
		else
			SwitchBodygroup(m_iShellBodyGroup[i], 1);
	}
}
//-----------------------------------------------------------------------------
// Purpose: Launch a bounce/impact grenade
//-----------------------------------------------------------------------------
void CGEWeaponRocketLauncher::LaunchRocket( void )
{
	CBaseCombatCharacter *pOwner = GetOwner();
	if ( !pOwner )
		return;

#ifndef CLIENT_DLL
	Vector	vForward, vRight, vUp;
	AngleVectors( pOwner->EyeAngles(), &vForward, &vRight, &vUp );

	// Manipulate the shoot position such that it is in front of our gun muzzle
	Vector vecSrc = pOwner->Weapon_ShootPosition();

	if ( pOwner->IsPlayer() )
	{
		VectorMA( vecSrc, 4.5f, vRight, vecSrc ); // 3.0, 5.0
		VectorMA( vecSrc, 16.5f, vForward, vecSrc ); // 20, 19
		VectorMA( vecSrc, -5.25f, vUp, vecSrc ); // -2, -6, -5, 5.25
	}
	else
	{
		VectorMA( vecSrc, 20.0, vForward, vecSrc );
	}

	CheckLaunchPosition( pOwner->EyePosition(), vecSrc );

	if ( pOwner->MyNPCPointer() )
		vForward = pOwner->MyNPCPointer()->GetActualShootTrajectory( vecSrc );

	QAngle angAiming;
	VectorAngles( vForward, angAiming );

	// Convert us into a bot player :-D
	if ( pOwner->IsNPC() )
	{
		CNPC_GEBase *pNPC = (CNPC_GEBase*) pOwner;
		if ( pNPC->GetBotPlayer() )
			pOwner = pNPC->GetBotPlayer();
	}
	
	CGERocket *pRocket = (CGERocket*)CBaseEntity::Create( "npc_rocket", vecSrc, angAiming, NULL );

	if ( pRocket )
	{
		pRocket->SetThrower( pOwner );
		pRocket->SetOwnerEntity( pOwner );
		pRocket->SetSourceWeapon(this);

		pRocket->SetDamage( GetGEWpnData().m_iDamage );
		pRocket->SetDamageRadius( GetGEWpnData().m_flDamageRadius );

		if (pOwner->GetTeamNumber() == TEAM_JANUS)
			pRocket->SetCollisionGroup( COLLISION_GROUP_GRENADE_JANUS );
		else if (pOwner->GetTeamNumber() == TEAM_MI6)
			pRocket->SetCollisionGroup( COLLISION_GROUP_GRENADE_MI6 );

		// Tell the owner what we threw to implement anti-spamming
		if ( pOwner->IsPlayer() )
			ToGEMPPlayer( pOwner )->AddThrownObject( pRocket );
	}
#endif

	// Remove the rocket from our ammo pool
	m_iClip1 -= 1;
	WeaponSound( SINGLE );

	SwitchBodygroup(1, 1);

	//Add our view kick in
	AddViewKick();
}