Well, easiest thing is to tell how we did this for Korax Arena mod (plus you can have both our game&code before your eyes <!-- s;) --><img src="{SMILIES_PATH}/icon_wink.gif" alt=";)" title="Wink" /><!-- s;) -->).
I must warn, however, that many things there were not done in couple of days, it was rather long way and many stuff required some other stuff to be done beforehand. In other words, what's easy to tell is not so easy to do.
I'll try to give certain tips there, though I am afraid they won't be enough to complete your task. It's just something to start with.
[quote="kraigc":1kgxgk2o]I'm curious on how to handle such things as switching player classes,
In common progs there's a GameInfo class which stores an array of available game classes, PlayerClasses variable. You can feed it with your own classes, which must be descendants of PlayerPawn class (it is a base class for player-controlled actors).
Meanwhile, there is a PClass variable in BasePlayer class. When player is spawned, game uses it to know which player class to take from PlayerClasses array and put into game. This is done in common progs by default, so there's a chance you won't need to write your own functions for this, just feed PlayerClasses array with proper values; then make selection in game menu, or something, which would set 'class' console variable depending on user choice.
[quote="kraigc":1kgxgk2o]
capture the flag mode
Well, if to put this simple, we created a class for flag object in progs. This flag has all custom behavior, which depends on its state. State may be "sits on base", "captured" and "dropped". When on base or dropped it can be captured by opposing team players by touching it. When captured, it remembers capturer and straightforwardly follows him/her everywhere (technically, flag is just being moved after player, updating its position every tick).
When player, who is carrying captured flag, touch his own flag, which is "on base", team scores and enemy flag is teleported back to the base.
Bases are represented simply by "map spot" objects; their references are stored in Game object.
Ofcourse, CTF required Teams. I wrote PlayerTeam class, it stores team score, team colour and some other stuff, it also keeps list of players sorted by their personal scores for convenience. When game is initialized, two teams are created. When players spawn into the game they are being assigned to team. Each player has Team reference, and vice versa, Team has references to all players (as mentioned above).
What else? Well, this may be done elsewise, but I wrote GameModel class as a base class for all "advanced" game modes, primarily for easier programming game rules and behavior. Such modes as CTF and Domination are controlled by descendants from GameModel, these are classes called simply GameCTF, GameDomination, etc. When game is initialized, an object of corresponding game class is created.
This object usually stores references to important game objects, such as Flags and Bases in CTF, and also has numerous functions which serve as event handlers.
[quote="kraigc":1kgxgk2o]
how to zoom for a specific player class
You mean, like sniper scope? It can be done by changing 'FOV' console variable.
By the way, if you downloaded our mod, you can try this; select "The Hero" character in player setup, find Longbow weapon and press and hold fire button: you will get zoom over time.