This confused me for the longest time, but after looking at the code it all makes sense now.

m_pitch is linked to sv_cheats 1.

With cheats off, you're only allowed a value of .022 or -.022 and IF you set m_pitch to 0 then it'll always go to -.022

Two major reasons this needs to be cut from cheats:
1. Players aren't allowed their own pitch value(See: Quake community)
2. This really hurts my camera system.

If you know how to fix this, plz post.

in_mouse.cpp

class ConVar_m_pitch : public ConVar_ServerBounded
{
public:
ConVar_m_pitch() : 
ConVar_ServerBounded( "m_pitch","0.022", FCVAR_ARCHIVE, "Mouse pitch factor." )
{
}

virtual float GetFloat() const
{
if ( !sv_cheats )
sv_cheats = cvar->FindVar( "sv_cheats" );

// If sv_cheats is on then it can be anything.
float flBaseValue = GetBaseFloatValue();
if ( !sv_cheats || sv_cheats->GetBool() )
return flBaseValue;

// If sv_cheats is off than it can only be 0.022 or -0.022 (if they've reversed the mouse in the options).
if ( flBaseValue > 0 )
return 0.022f;
else
return -0.022f;
}
} cvar_m_pitch;
ConVar_ServerBounded *m_pitch = &cvar_m_pitch;