1. SERVER SIDE RECOIL FUNCTION:
1. Open weapons.h and find the declaration of the CBasePlayerWeapon class.
2. Add
void V_PunchAngles( int x = 0, int y = 0, int z = 0, int minus = 1 );
below
BOOL AddSecondaryAmmo( int iCount, char *szName, int iMaxCarry );
3. Now go to weapons.cpp and paste this code anywhere ( not inside another function obviously )
void CBasePlayerWeapon::V_PunchAngles( int x, int y, int z, int minus ) { if ( minus ) { m_pPlayer->pev->punchangle.x -= x; m_pPlayer->pev->punchangle.y -= y; m_pPlayer->pev->punchangle.z -= z; } else { m_pPlayer->pev->punchangle.x = x; m_pPlayer->pev->punchangle.y = y; m_pPlayer->pev->punchangle.z = z; } }
NOTE: If you set int minus to 1( default ), it means the recoil will add up. For example: if you set int x to 1, it will keep going up until you stop firing or the ammo runs out.
However, if you set int minus to 0, it will go up and stay in a fixed position.
If you dont understand, try it yourself.
4. Now go to mp5.cpp.
5. In the PrimaryAttack function, below m_iClip--, add this
/////////////////////////////// // // RECOIL START // /////////////////////////////// switch ( m_iClip ) { case 30: V_PunchAngles( 1 ); break; case 29: V_PunchAngles( 1 ); break; case 28: V_PunchAngles( 1 ); break; case 27: V_PunchAngles( 1 ); break; case 26: V_PunchAngles( 1 ); break; case 25: V_PunchAngles( 0, 2 ); break; case 24: V_PunchAngles( 0, 2 ); break; case 23: V_PunchAngles( 0, 2 ); break; case 22: V_PunchAngles( 0, 2 ); break; case 21: V_PunchAngles( 0, -2 ); break; case 20: V_PunchAngles( 0, -2 ); break; case 19: V_PunchAngles( 0, -2 ); break; case 18: V_PunchAngles( 0, -2 ); break; case 17: V_PunchAngles( 0, 0 ); break; case 16: V_PunchAngles( 1 ); break; case 15: V_PunchAngles( 1 ); break; case 14: V_PunchAngles( 1 ); break; case 13: V_PunchAngles( 1 ); break; case 12: V_PunchAngles( 1 ); break; case 11: V_PunchAngles( 1 ); break; case 10: V_PunchAngles( 0, -2 ); break; case 9: V_PunchAngles( 0, -3 ); break; case 8: V_PunchAngles( 0, -2 ); break; case 7: V_PunchAngles( 0, -3 ); break; case 6: V_PunchAngles( 0, 1 ); break; case 5: V_PunchAngles( 0, 1 ); break; case 4: V_PunchAngles( 0, 1 ); break; case 3: V_PunchAngles( 1, 0 ); break; case 2: V_PunchAngles( 1 ); break; case 1: V_PunchAngles( 1 ); break; case 0: V_PunchAngles( 0 ); break; } /////////////////////////////// // // RECOIL END // ///////////////////////////////
Note : int x is vertical and int y is horizontal. You will also have to change the value of MP5_MAX_CLIP and MP5_DEFAULT_GIVE to 30.
6. When compiling from client side you will get an error. To fix this, go to hl_baseentity.cpp and at the bottom add
void CBasePlayerWeapon::V_PunchAngles( int x, int y, int z, int minus ) {}
It is done! If you have any problems, ask me in the comments.
2. Weapon Knockback
1. Open mp5.cpp and find the PrimaryAttack function.
2. Under m_iClip--, add
if (m_pPlayer->pev->flags & FL_ONGROUND) { m_pPlayer->pev->velocity = m_pPlayer->pev->velocity - gpGlobals->v_forward*( 100 ); }
Note: 100 is the power of the knockback.
Done! Pretty short huh. If you have any problems, ask me in the comments.