Difference between revisions of "Lowering your weapon on sprint"
(unnamed parameters don't require the "1=" :p) |
|||
(6 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
− | This article | + | This article provides a basic implementation of weapon lowering while sprinting, and preventing weapon fire while doing so. |
− | |||
− | {{note| | + | {{note|This will not work if your viewmodel doesn't have ACT_VM_IDLE_LOWERED animation declared somewhere in the .qc file.}} |
− | + | ||
− | {{note| | + | |
− | + | {{note|If your weapon_yourweaponname.cpp is overriding ItemPostFrame then you have to place BaseClass::ProcessAnimationEvents(); in the ItemPostFrame of that class but only if you aren't calling BaseClass::ItemPostFrame();. For example in the weapon_shotgun.cpp it has an override of ItemPostFrame which means that the lowering weapon code will not be called for this weapon unless you add a call to it! '''Remember to put the Basecombatweapon_Shared.h declarations under public or protected so that you can make use of these variables in classes which inherit basecombatweapon_shared, like the weapon_shotgun.cpp's ItemPostFrame. If you don't do this you will get undeclared identifier errors'''}} | |
== The Code == | == The Code == | ||
− | + | {{note|This has been tested with HL2MP, 2013 and Alien Swarm SDKS.}} | |
− | {{note| | ||
===BASECOMBATWEAPON_SHARED.CPP=== | ===BASECOMBATWEAPON_SHARED.CPP=== | ||
Line 18: | Line 16: | ||
void CBaseCombatWeapon::ItemPostFrame( void ) | void CBaseCombatWeapon::ItemPostFrame( void ) | ||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | Then copy and paste this | + | Then copy and paste this above it: |
<source lang=cpp> | <source lang=cpp> | ||
− | + | void CBaseCombatWeapon::ProcessAnimationEvents(void) | |
{ | { | ||
− | + | CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); | |
− | + | if (!pOwner) | |
− | + | return; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | if ( | + | if ( !m_bWeaponIsLowered && (pOwner->m_nButtons & IN_SPEED ) ) |
− | |||
− | |||
{ | { | ||
− | + | m_bWeaponIsLowered = true; | |
SendWeaponAnim( ACT_VM_IDLE_LOWERED ); | SendWeaponAnim( ACT_VM_IDLE_LOWERED ); | ||
− | + | m_flNextPrimaryAttack = gpGlobals->curtime + GetViewModelSequenceDuration(); | |
+ | m_flNextSecondaryAttack = m_flNextPrimaryAttack; | ||
} | } | ||
− | + | else if ( m_bWeaponIsLowered && !(pOwner->m_nButtons & IN_SPEED ) ) | |
− | |||
− | else if ( | ||
− | |||
− | |||
{ | { | ||
− | + | m_bWeaponIsLowered = false; | |
SendWeaponAnim( ACT_VM_IDLE ); | SendWeaponAnim( ACT_VM_IDLE ); | ||
− | + | m_flNextPrimaryAttack = gpGlobals->curtime + GetViewModelSequenceDuration(); | |
+ | m_flNextSecondaryAttack = m_flNextPrimaryAttack; | ||
+ | } | ||
+ | |||
+ | if ( m_bWeaponIsLowered ) | ||
+ | { | ||
+ | if ( gpGlobals->curtime > m_flNextPrimaryAttack ) | ||
+ | { | ||
+ | SendWeaponAnim( ACT_VM_IDLE_LOWERED ); | ||
+ | m_flNextPrimaryAttack = gpGlobals->curtime + GetViewModelSequenceDuration(); | ||
+ | m_flNextSecondaryAttack = m_flNextPrimaryAttack; | ||
+ | } | ||
} | } | ||
− | |||
} | } | ||
</source> | </source> | ||
− | + | Now to make sure our code gets called we add ProcessAnimationEvents(); here: | |
− | |||
<source lang=cpp> | <source lang=cpp> | ||
− | + | void CBaseCombatWeapon::ItemPostFrame( void ) | |
− | + | { | |
− | + | //Add this underneath the pOwner accessor check. | |
− | + | ProcessAnimationEvents(); | |
+ | } | ||
</source> | </source> | ||
− | == | + | ===BASECOMBATWEAPON_SHARED.H=== |
− | + | Add these declarations under public at line 211 below '''bool IsViewModelSequenceFinished( void ); // Returns if the viewmodel's current animation is finished''': | |
+ | {{note|We make ProcessAnimationEvents virtual so that we can override it in classes which inherit this class.}} | ||
+ | <source lang=cpp> | ||
− | + | virtual void ProcessAnimationEvents(void); | |
+ | bool m_bWeaponIsLowered; | ||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | + | ==Finish== | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | Now your weapon should be lowered when you hit the sprint button and you will not be able to shoot until you release the button! | ||
+ | [[File:Sprint.gif|none|Finished Product]] | ||
− | [[Category:Weapons programming]] | + | [[Category:Weapons programming]] |
[[Category:Tutorials]] | [[Category:Tutorials]] |
Latest revision as of 05:25, 26 September 2018
This article provides a basic implementation of weapon lowering while sprinting, and preventing weapon fire while doing so.


The Code

BASECOMBATWEAPON_SHARED.CPP
Hit CTRL+F and search for this code:
void CBaseCombatWeapon::ItemPostFrame( void )
Then copy and paste this above it:
void CBaseCombatWeapon::ProcessAnimationEvents(void)
{
CBasePlayer *pOwner = ToBasePlayer( GetOwner() );
if (!pOwner)
return;
if ( !m_bWeaponIsLowered && (pOwner->m_nButtons & IN_SPEED ) )
{
m_bWeaponIsLowered = true;
SendWeaponAnim( ACT_VM_IDLE_LOWERED );
m_flNextPrimaryAttack = gpGlobals->curtime + GetViewModelSequenceDuration();
m_flNextSecondaryAttack = m_flNextPrimaryAttack;
}
else if ( m_bWeaponIsLowered && !(pOwner->m_nButtons & IN_SPEED ) )
{
m_bWeaponIsLowered = false;
SendWeaponAnim( ACT_VM_IDLE );
m_flNextPrimaryAttack = gpGlobals->curtime + GetViewModelSequenceDuration();
m_flNextSecondaryAttack = m_flNextPrimaryAttack;
}
if ( m_bWeaponIsLowered )
{
if ( gpGlobals->curtime > m_flNextPrimaryAttack )
{
SendWeaponAnim( ACT_VM_IDLE_LOWERED );
m_flNextPrimaryAttack = gpGlobals->curtime + GetViewModelSequenceDuration();
m_flNextSecondaryAttack = m_flNextPrimaryAttack;
}
}
}
Now to make sure our code gets called we add ProcessAnimationEvents(); here:
void CBaseCombatWeapon::ItemPostFrame( void )
{
//Add this underneath the pOwner accessor check.
ProcessAnimationEvents();
}
BASECOMBATWEAPON_SHARED.H
Add these declarations under public at line 211 below bool IsViewModelSequenceFinished( void ); // Returns if the viewmodel's current animation is finished:

virtual void ProcessAnimationEvents(void);
bool m_bWeaponIsLowered;
Finish
Now your weapon should be lowered when you hit the sprint button and you will not be able to shoot until you release the button!