Difference between revisions of "Toggling RPG Guidance"

From Valve Developer Community
Jump to: navigation, search
(Category:Weapons programming, syntax highlight)
(Added Code that fixes the Infinite Toggling Sound when the player runs out of RPG Ammo.)
Line 91: Line 91:
 
If we changed weapons after firing, this will prevent the RPG from getting kicked back up to us for a reload after the dumb rocket explodes.
 
If we changed weapons after firing, this will prevent the RPG from getting kicked back up to us for a reload after the dumb rocket explodes.
  
And that's it! You're done.
+
 
 +
As soon as we run out of rockets, the RPG is forced to lower, causing a constant toggle sound to play forever, we clearly don't want that, and there is a very simple fix for this sort of issue, in ''void CWeaponRPG::StopGuiding()'' change this code :
 +
<source lang=cpp>
 +
m_bGuiding = false;
 +
 
 +
WeaponSound( SPECIAL2 );
 +
 
 +
StopLaserEffects();
 +
 
 +
// Kill the dot completely
 +
if (m_hLaserDot != NULL)
 +
{
 +
m_hLaserDot->TurnOff();
 +
UTIL_Remove(m_hLaserDot);
 +
m_hLaserDot = NULL;
 +
}
 +
</source>
 +
 
 +
To this :
 +
<source lang=cpp>
 +
m_bGuiding = false;
 +
 
 +
StopLaserEffects();
 +
 
 +
// Kill the dot completely
 +
if (m_hLaserDot != NULL)
 +
{
 +
m_hLaserDot->TurnOff();
 +
UTIL_Remove(m_hLaserDot);
 +
m_hLaserDot = NULL;
 +
 
 +
WeaponSound(SPECIAL2);
 +
}
 +
</source>
 +
 
 +
What we did here, was simply change the position of the ''WeaponSound(SPECIAL2);'', putting it inside of the if statement of which is designated to kill the guidance dot.
 +
 
 +
And that's it! You're done!
 +
 
 +
 
 +
''If any issues arise, ensure that you've done the steps above correctly, and that you didn't misplace (or create a typo within) the code.''

Revision as of 18:52, 18 August 2018

Based on tutorial found here.

Basically what we're going to be doing is allowing a player to switch the RPG's guiding laser on and off using the weapon's secondary fire. Along with this, we will allow a player who has fired a dumb (non-guided) rocket that hasn't yet exploded to change weapons.


Files affected:

  • weapon_rpg.cpp


In CWeaponRPG::ItemPostFrame() (about line 1539), add the following code:

if ( pPlayer->m_afButtonPressed & IN_ATTACK2 )
{
	ToggleGuiding();
}

at the end of the method, after:

if ( pPlayer->GetAmmoCount(m_iPrimaryAmmoType) <= 0 && m_hMissile == NULL )
{
	StopGuiding();
}

This says, in effect, "If the player hits the secondary attack, toggle rocket guidance on or off."

Then in CWeaponRPG::SuppressGuiding() (about line 1497), find the following code:

if ( m_hLaserDot == NULL )
{
	StartGuiding();

	//STILL!?
	if ( m_hLaserDot == NULL )
		return;
}

and comment "StartGuiding();" out, so that it looks like this:

if ( m_hLaserDot == NULL )
{
	//StartGuiding();

	//STILL!?
	if ( m_hLaserDot == NULL )
		return;
}

This stops the code from automatically starting up rocket guidance again.

That's it for the guidance toggling code. Now to allow the player to lower the RPG after firing a dumb rocket but before it explodes.

In CWeaponRPG::Lower() (about line 1528), find the following code:

if ( m_hMissile != NULL )
	return false;

and change it to read:

if ( m_hMissile != NULL && IsGuiding() )
	return false;

This prevents the code from automatically telling us that we can't lower the RPG if we're not guiding. You will then need to make the same change in CWeaponRPG::CanHolster() (about line 1641).

Then in CWeaponRPG::Reload() (about line 1827), add this code:

if ( pOwner->GetActiveWeapon() != this )
	return false;

after:

if ( pOwner->GetAmmoCount(m_iPrimaryAmmoType) <= 0 )
	return false;

If we changed weapons after firing, this will prevent the RPG from getting kicked back up to us for a reload after the dumb rocket explodes.


As soon as we run out of rockets, the RPG is forced to lower, causing a constant toggle sound to play forever, we clearly don't want that, and there is a very simple fix for this sort of issue, in void CWeaponRPG::StopGuiding() change this code :

m_bGuiding = false;

WeaponSound( SPECIAL2 );

StopLaserEffects();

// Kill the dot completely
if (m_hLaserDot != NULL)
{
	m_hLaserDot->TurnOff();
	UTIL_Remove(m_hLaserDot);
	m_hLaserDot = NULL;
}

To this :

m_bGuiding = false;

StopLaserEffects();

// Kill the dot completely
if (m_hLaserDot != NULL)
{
	m_hLaserDot->TurnOff();
	UTIL_Remove(m_hLaserDot);
	m_hLaserDot = NULL;

	WeaponSound(SPECIAL2);
}

What we did here, was simply change the position of the WeaponSound(SPECIAL2);, putting it inside of the if statement of which is designated to kill the guidance dot.

And that's it! You're done!


If any issues arise, ensure that you've done the steps above correctly, and that you didn't misplace (or create a typo within) the code.