Okay, as from discussion on irc, we have a problem.
Firstly, Cvars are console variables, which reside on the client and server, they are the ones that affect gameplay and other things.
The problem is: our current implementation.
As of late commits (below r951), we send all server cvars to the client, which results in perfect sync of the client side values. This is what was needed to be done eventually.
However, we have a naming problem, the freelook bug is a good example of this: we have a cvar named allowfreelook, which existed on both client and server, but the clients version was affected by the servers version "through proxy" by changing the sv_freelook cvar, the client could toggle freelook on or off using cl_freelook.
There lies the problem, we now send allowfreelook, which is used by the client and server, it is a variable in the common codebase as well.
We can't:
a) Stop sending allowfreelook (its has a CVAR_SERVERINFO and is needed), that is downright hacky as well.
b) Remove cl_freelook and sv_freelook, then the server would force freelook on or off, depending on its setting.
c) Countless other ways that results in hacky/buggy code.
Now, you may think this only affects freelook overall, but it doesn't, it affects a LARGE amount of other things as well, so what I and others of the team propose is this:
A) Put every single cvar in a single file that exists in the common codebase.
B) Bring back namespaces (cl_* and sv_* prefixes) for cvars (we could use CVAR_SERVERINFO and CVAR_CLIENTONLY instead, but I have not thought this through completely)
C) <add anything else>
There is one disadvantage to all of this, we break alot of older cfg's, BUT, because we aren't at 1.0 and not stable, we can do all of this.
Suggestions, opinions, criticisms?