Manual shotgun pumping
January 2024
You can help by adding links to this article from other relevant articles.
January 2024
Modifying the shotgun to be more like a pump action shotgun is not difficult, but has a really cool outcome.
Requirements
- A repository for storing your code changes. (GitHub, Subversion, etc)
- Visual Studio for changing and compiling your code.
Tutorial
Open weapon_shotgun.cpp
Step One: Remove auto reload
Look for line 543 (Line 645 in newer versions of the Source SDK) and comment it out using comment block (/* ... */).
else { // weapon is useable. Reload if empty and weapon has waited as long as it has to after firing if ( m_iClip1 <= 0 && !(GetWeaponFlags() & ITEM_FLAG_NOAUTORELOAD) && m_flNextPrimaryAttack < gpGlobals->curtime ) { if (StartReload()) { // if we've successfully started to reload, we're done return; } } }
Modified Code:
/* else { // weapon is useable. Reload if empty and weapon has waited as long as it has to after firing if ( m_iClip1 <= 0 && !(GetWeaponFlags() & ITEM_FLAG_NOAUTORELOAD) && m_flNextPrimaryAttack < gpGlobals->curtime ) { if (StartReload()) { // if we've successfully started to reload, we're done return; } } }*/
Now, the shotgun will not automatically reload if all bullets are expended. You could have also looked at ITEM_FLAG_NOAUTORELOAD
, but this requires less work and has a smaller chance of messing something up. However, you will be leaving code in your source which adds a small amount of bloat (although minuscule in size).
Step 2: Making the user manually pump the shotgun.
Scroll to line 446 (Line 547 in newer versions of the Source SDK).
Change this code block:
if ((m_bNeedPump) && (m_flNextPrimaryAttack <= gpGlobals->curtime)) { Pump(); return; }
To this:
if ((m_bNeedPump) && (m_flNextPrimaryAttack <= gpGlobals->curtime) && (pOwner->m_nButtons & IN_ATTACK || pOwner->m_nButtons & IN_ATTACK2)) { Pump(); return; }
Analyze this code for a minute. The compiler follows PEMDAS (Parenthesis, Exponents, Multiplication, Division, Addition, Subtraction) when looking at 'if' statements, so a statement inside a parenthesis is going to be analyzed first.
Original 'if' statement works like this: If you need to pump the shotgun, and the next attack time is less than or equal to the current time, pump the gun.
The changes work like this: If the user is pressing the +attack or +attack2 button and you need to pump and attack time is less than or equal to current time, pump the shotgun. Basically, this logic is what is making the gun into a manual action.
Now, if you wanted the user to be able to reload only if you expend all their ammunition, because there is an expended round in the chamber they would need to pump it out.
Scroll up to line 146 (line 246 in newer versions) (Inside bool CWeaponShotgun::StartReload( void ))
after:
if (j <= 0) return false;
Insert this:
if( m_iClip1 == 0 ) { m_bNeedPump = true ; }
Compile, load up, enjoy. Any problems send me a PM to otisranson on Steam, or send an email to [email protected].