‎‎

Q3PLUS DOCUMENTATION – SERVER

Bans System

Set the sv_bans "bans.txt" variable to the file where your ban list is.
The ban system's syntax has some similarities to the config file syntax.
If you prefer old banning system, then you can still use /rcon addip <ip-mask> and /rcon removeip <ip-mask>.

You can edit the file directly and add or remove the bans by yourself.

Additionally, the /rcon ban group of commands modify this file directly and add the banning information to it.

However, to remove the bans the file must be manually edited.

The syntax is described in the next example:

Name {
    "*yourname*" {        // ban all who have 'yourname' in their names
        IP: 92.18.0.4     // allow if ip match!
        Password: "test"  //    or if password!

        Reason: "Sorry, 'yourname' is a protected name!"
    }

    // for "^1 " names
    " " { Reason: "Please use a name!" }
}

IP {
    172.23.3.56 {        // ban this ip
        Name: "test*"    // but allow if the name begins with 'test'

        Reason: "Dude you are not test!"
    }

    207.46.* { Reason: "Microsoft isn't allowed!!" }
}
 ‎‎ 

Configuration System

Q3PLUS is very customizable. You can create your very own personal settings, change the weapon behavior, the gameplay, items, nearly everything to fit your needs.
All these settings are saved in configuration files inside the
conf/ directory, but their format is quite different from normal q3config files, so they can't be executed with the /exec command.

You can also use the pre-made configurations inside the conf/ directory.

To load a configuration, use /load yourconfig.cfg or if you are admin of a remote server /rcon load yourconfig.cfg.

Alternatively, you can set the sv_config server cvar and the config will be loaded on map change.

If there are errors while loading the file, then those errors will be printed on the console and will be visible only if you are testing in local server or the config has been loaded with with an rcon console.

Additionally, if the error happens on the parsing stage, it corresponds to a syntax error, and the execution of the file is aborted and default.cfg is loaded instead.

Syntax overview

The syntax for the configuration system has been completely reimplemented since 1.03. In its simplest form, you can just modify the value of a bunch of configuration options, like the following:

key1 = 1;
KEY1 = 1;
k E y 1 = 1;

topic1->key3 = 3;
topic1 { key3 = 3; }
t o p i c 1 -> key3 = 3;

exec("quake_command");

$quake_cvar = "10";
exec("set quake_cvar 10");

Semicolons ; at the end of sentences are mandatory, but white spaces are ignored, so multiple expressions and sentences can be specified on the same line.

Also, everything after double slashes // until the end of the line is a comment and is ignored.

Additionally, an slash followed by an asterisk /* indicates the start of a comment, which can be spread across multiple lines until an asterisk followed by an slash */ is found.

The key names are configuration options, which can only be accessed from inside the configuration system and are not available as quake cvars.

This greatly reduces the load of having lots of cvars to configure the game. Key names are case insensitive, and are also insensitive to spaces on it.

When several options are related, it's common to find them grouped inside topics or categories.

To modify an option inside a category, you can access it directly by writing the category name, followed by the arrow operator -> and the key name, or alternatively you can start a block after the category with brackets { } and access multiple keys directly inside that bracket without prefixing the category name.

When an identifier begins with a dollar sign $, it's interpreted as a quake cvar, and can be used either to access its value or to set it.

To execute commands, you have to use the exec function and add the command as a parameter.

Constants

Constants are a way to encapsulate values with identifiers, so the expressions become self documenting.

Its usage is optional, but it greatly increases the readability of the code. For example, consider the following example:

$sv_unlagged = 204;
$sv_unlagged = WP_MACHINEGUN | WP_SHOTGUN | WP_LIGHTNING | WP_RAILGUN;

These two sentences are equivalent, but clearly the second one is more understandable.

The pipes | are or operators and they are very useful for bitmask values, so in the second line it is easily noticeable that unlagged is being enabled only for hitscan weapons.

Most of the constants are listed (and explained when necessary) in the Available Options section, so we will only list the missing ones:

* VERSION - Q3PLUS short version string.

* Gametype constants:

GT_FFA              // Free For All
GT_TOURNAMENT       // Tournament
GT_SINGLE_PLAYER    // Single Player
GT_TEAM             // Team Deathmatch
GT_CTF              // Capture The Flag
GT_RTF              // Return The Flag
GT_1FCTF            // One Flag CTF
GT_CA               // Clan Arena
GT_FTAG             // Freeze Tag
GT_PTL              // Protect The Leader

Advanced syntax

The configuration system is pretty much an scripting language by itself, so their possibilities are a lot deeper.

However, to understand all of this, a certain programming background is suggested, and since we won't turn this document into a programing tutorial, we include here some sample code to cover most of this advanced features:

// this all might look like php but always keep in mind, this is not php :)
//
// but you can edit this with your favourite editor supporting php syntax
// higlighting as it almost fits perfectly.

// access or assign cvars, its the same as "/set sample 0"
$sample = 0;

// to connect strings use the dot operator
$sample = "string1" . " string2";

// accessing or assigning attributes
railGun {
    cycle = 1100;
}

// is the same as
railGun->cycle = 1100;
// or
Rail Gun    ->   C y c l e = 1100;

// ternary operator.. this
$sample = ( $g_gametype == GT_FFA ? 1 : 2 );

// is the same as
if ( $g_gametype == GT_FFA ) {
    $sample = 1;
}
else {
    $sample = 2;
}

// calculations of any kind
$sample = railGun->cycle * 0.5;
$sample += railGun->cycle / railGun->damage;

$sample *= (float)VERSION;

// comparsion of any complexity
if ( $g_gametype == GT_TEAM || $mapname == "q3dm1" || ($timelimit > 10 && $fraglimit <= 30 && !$capturelimit) || $g_gametype >= GT_FTAG ) {
    // do something
}

// there are some "functions" you can call
// if you know any others that could be useful, tell me

/* debug( message ) */
debug("^1will print this message \n   with \"line breaks\" \n   to the console including the line number");

/* include( filename ) 
 *
 * parse the config file and returns 1 if parsing was successful, 0 in case of error
 * max recursion level is 8, so avoid any deeper cyclic includes since they will fail
 **/
if ( include( "default.cfg" ) ) {
    debug( "Default settings loaded again!" );
}

/* match( pattern, subject )
 *
 * wildcard matching.
 *   ? - matches one character
 *   * - matches none or any amount of characters
 *  \? - matches a ?
 *  \* - matches a *
 **/
if ( match("q3dm*", $mapname) ) {
}
// is the same as
if ( $mapname ~= "q3dm*" ) {
}

/* in( needle, value1 [, value2...] )
 *
 * check against multiple values
 **/
if ( in($g_gametype, GT_FFA, GT_FTAG, GT_CTF) ) {
}

/* exec( command ) */
if ( !match("*(sample cfg)", $sv_hostname) ) {
    // would be more simple without exec()
    //$sv_hostname .= " (sample cfg)";

    exec('set sv_hostname "'. $sv_hostname .' (sample cfg)"');
}

/* modifyitem( id, classname, newClassname [ , respawnTime = -1 [ , amount = -1 [ , x, y, z ] ] ] )
 *
 * id - 0 will replace all items that match
 * classname - case insensitive, can contain wildcards like "weapon_*"
 * newClassname - case insensitive, will replace the item, use empty string to ignore
 * respawnTime - time in seconds, default -1, argument is optional
 * amount - amount given on pickup, default -1, argument is optional
 * x, y, z - will adjust the items position, only makes sense if id > 0, arguments are optional
 *
 * the complete item classname list is the following:
 *
 * ARMOR
 *   item_armor_shard          item_armor_jacket        item_armor_combat
 *   item_armor_body
 * HEALTH
 *   item_health_small         item_health              item_health_large
 *   item_health_mega
 * WEAPONS
 *   weapon_gauntlet           weapon_shotgun           weapon_machinegun
 *   weapon_grenadelauncher    weapon_rocketlauncher    weapon_lightning
 *   weapon_railgun            weapon_plasmagun         weapon_bfg
 *   weapon_grapplinghook
 * AMMO
 *   ammo_shells               ammo_bullets             ammo_grenades
 *   ammo_cells                ammo_lightning           ammo_rockets
 *   ammo_slugs                ammo_bfg
 * HOLDABLE ITEMS
 *   holdable_teleporter       holdable_medkit
 * POWERUPS
 *   item_quad                 item_enviro              item_haste
 *   item_invis                item_regen               item_flight
 * FLAGS
 *   team_CTF_redflag          team_CTF_blueflag        team_CTF_neutralflag
 **/

// replace all weapons with mega health
modifyitem(0, "weapon_*", "item_health_mega");

// replace second rocket launcher with bfg and place it to the given coordinates (100, 125, 520)
modifyitem(2, "weapon_rocketlauncher", "weapon_bfg", -1, -1, 100, 125, 520);

// change mega health to give +200
modifyitem(0, "item_health_mega", "", -1, 200);

// matching is always based on the original item
// so the below would just switch the locations, not removing the grenades
modifyitem(0, "weapon_shotgun", "weapon_grenadelauncher");
modifyitem(0, "weapon_grenadelauncher", "weapon_shotgun");

/* abs( value )
 * min( value1, value2 [, value3...] )
 * max( value1, value2 [, value3...] )
 * clamp( min, max, value )
 **/
$sample = abs(-3);              // 3

$sample = min(5, 9, 1, 3);      // 1
$sample = max(5, 9, 1, 3);      // 9

$sample = clamp(5, 9, 1);       // 5
$sample = clamp(5, 9, 45);      // 9

// maybe a usefull introduction to the bitwise operators
if ( startWeapons & WP_MACHINEGUN ) {
    debug("we have the machinegun");
}

// set all the weapons except grapple
startWeapons = WP_ALL & ~WP_GRAPPLING_HOOK;

// add rocket launcher to our startweapons
// yes, we have it already but unlike the '+' operator, this will not break it
startWeapons |= WP_ROCKET_LAUNCHER;

// remove it
startWeapons &= ~WP_ROCKET_LAUNCHER;

/* "switch" syntax
 *
 * we have a complex switch syntax which differs from other languages.
 *
 * we allow to modify the comparison function for each case (like ==, <, >=, ~= etc)
 * also our switch has a different fall through behaviour, see the example below
 **/
$sample = "q3dm3";

switch ( $sample ) {
    case ~= "q3dm*":
        debug("^2we loaded settings for all q3dm* maps");

        // no break here, we will fall through

    case ~= "q3ctf*":
        // we did fall through but this will not match!

        debug("^2we loaded settings for all q3ctf* maps");

        // no break here, we will fall through

    // now lets have individual settings for some maps
    case "q3dm17":
        debug("^3we loaded special settings for q3dm17");
        break;

    case "q3dm1":
    case "q3dm3":
        debug("^3we loaded settings for q3dm1 or q3dm3");
        break;

    default:
        // this will only be reached if none of the above apply, for
        // example q3dm9 will not match because it already did in
        //    case ~= "q3dm*"
        //
        // but q3tourney2 will
        debug("^1we don't know the map");
}

// the above is the same as
if ( $sample ~= "q3dm*" ) {
    //debug("^2we loaded settings for all q3dm* maps");

    if ( $sample == "q3dm17" ) {
        //debug("^3we loaded special settings for q3dm17");
    }
    else if ( $sample == "q3dm1" || $sample == "q3dm3" ) {
        //debug("^3we loaded settings for q3dm1 or q3dm3");
    }
}
else if ( $sample ~= "q3ctf*" ) {
    //debug("^2we loaded settings for all q3ctf* maps");
}
else {
    //debug("^1we don't know the map");
}

// there are the for, while, do..while loops.. but maybe they will be
// removed as i cant think of any use
for ( $sample = 1; $sample <= 2; $sample++ ) {
    //debug("for-loop #". $sample);
}

while ( ++$sample <= 5 ) {
    //debug("while-loop #". $sample);
}

do {
    //debug("do-while-loop #". $sample);
    $sample++;
} while ( $sample < 8 );

Configuration of config voting

You can add the sv_config string to the sv_vote cvar anytime, and that will enable the players to /callvote the config they want.

However, players will be able to vote any configuration they want, even non-existant ones.

To limit this, add the conf string instead, and put all the available configurations for voting inside the file specified by the sv_voteconf cvar (voteconf.txt by default).

The syntax is pretty simple, as shown in the example:

// Add configurations you want to be voted.
// /callvote conf [filename]

// Format: filename  description

baseq3.cfg              Quake III Arena (baseq3)
default.cfg             Default Settings
instagib.cfg            InstaGib Settings (rail only)

Available options

Here is the default Excessive Plus cfg with self-explaining comments of all available options:

/* Default Settings
 *
 * THESE SETTINGS ARE EXECUTED PRIOR TO CUSTOM CONFIGURATIONS
 **/

Config {
    /* Name of the configuration
     *
     * Full name of the config. Will be added to the sv_config server cvar and 
     * displayed on the client loading screen and scoreboard
     **/
    Name = "Default Settings";

    /* Some info for the config
     *
     * Just for documenting purposes since they are not accessible by any server cvar
     **/
    Date = "7 August 2009";
    Author = "easy <easy@excessiveplus.net>";
}

Misc {
    /* Physics
     *
     * Bitmask to modify physics behaviour. Available flags are:
     *
     * 1    PHYSICS_CONTROL_FORWARD     Enables forward physics control
     * 2    PHYSICS_CONTROL_SIDEWARD    Enables sideward physics control
     * 4    PHYSICS_CONTROL_STOP        Enables air stopping control
     * 16   PHYSICS_RAMP_JUMPS
     * 32   PHYSICS_DOUBLE_JUMPS 
     * 64   PHYSICS_QUAKE_LIVE 
     * 128  PHYSICS_AIR_STEPS 
     * 256  PHYSICS_STEP_JUMPS
     * 
     * A ql-alike physics config would have PHYSICS_QUAKE_LIVE | PHYSICS_AIR_STEPS | 
     * PHYSICS_STEP_JUMPS set as its value, which is the same as 448 (64+128+256), 
     * whereas a cpma-alike config would have PHYSICS_CONTROL_FORWARD | 
     * PHYSICS_CONTROL_SIDEWARD | PHYSICS_CONTROL_STOP, which is the same as 7 (1+2+4).
     **/
    //$sv_physics = PHYSICS_AIR_STEPS | PHYSICS_STEP_JUMPS;

    /* Unlagged
     *
     * Bitmask to turn on/off unlagged specifically for each weapon. Available
     * flags include (they are self explanatory):
     *
     * 4     WP_MACHINEGUN
     * 8     WP_SHOTGUN
     * 16    WP_GRENADE_LAUNCHER
     * 32    WP_ROCKET_LAUNCHER
     * 64    WP_LIGHTNING
     * 128   WP_RAILGUN
     * 256   WP_PLASMAGUN
     * 512   WP_BFG
     * 1024  WP_GRAPPLING_HOOK
     * 
     * 0     WP_NONE
     * 2046  WP_ALL
     *
     * If you don't want to mess with these values, a value of 1 is the shorthand for WP_ALL,
     * which delags all weapons, including all projectiles. If you prefer old unlagged for
     * which only the hitscan weapons are delagged, use instead WP_MACHINEGUN | WP_SHOTGUN | 
     * WP_LIGHTNING | WP_RAILGUN, which is the same as 204 (4+8+64+128).
     **/
    //$sv_unlagged = 1;

    /* Solids
     *
     * Bitmask to control how the player interacts with other solid entities on the world.
     * Available flags are:
     *
     * 1    SOLIDS_PLAYER       Removes map clips, so you have access to more places on the map
     * 2    SOLIDS_BODY         Removes collisions with other players and bodies (including
     *                          frozen ones), useful for a faster-paced game and to remove
     *                          lagged collisions for high pingers
     * 4    SOLIDS_WEAPON       Removes weapon hit tests, so weapons will not hit an enemy,
     *                          useful on trick maps
     **/
    //$sv_solids = no;

    /* Warmup Respawn
     *
     * Controls what is respawned at the end of warmup time. Available flags are:
     *
     * 1    WARMUPRESPAWN_PLAYERS
     * 2    WARMUPRESPAWN_ITEMS
     *
     * To reproduce 1.03, you would like to disable this option.
     **/
    //$sv_warmupRespawn = WARMUPRESPAWN_PLAYERS | WARMUPRESPAWN_ITEMS;

    /* You will start with this weapon in your hands
     *
     * If the weapon is not in your inventory when you respawn, then the highest available
     * weapon below your currently selected one will be used instead.
     *
     * WP_GAUNTLET
     * WP_MACHINEGUN
     * WP_SHOTGUN
     * WP_GRENADE_LAUNCHER
     * WP_ROCKET_LAUNCHER
     * WP_LIGHTNING
     * WP_RAILGUN
     * WP_PLASMAGUN
     * WP_BFG
     * WP_GRAPPLING_HOOK
     *
     * WP_LAST_USED
     **/
    Start Weapon = WP_BFG;

    /* Weapons in your inventory
    *
    * WP_GAUNTLET
    * WP_MACHINEGUN
    * WP_SHOTGUN
    * WP_GRENADE_LAUNCHER
    * WP_ROCKET_LAUNCHER
    * WP_LIGHTNING
    * WP_RAILGUN
    * WP_PLASMAGUN
    * WP_BFG
    * WP_GRAPPLING_HOOK
    *
    * WP_NONE
    * WP_ALL
    **/
    Start Weapons = WP_GAUNTLET | WP_MACHINEGUN;

    /* Your powerups on every spawn
     *
     * PW_QUAD
     * PW_BATTLESUIT
     * PW_HASTE
     * PW_INVIS
     * PW_REGEN
     * PW_FLIGHT
     *
     * PW_NONE
     * PW_ALL
     **/
    Start Powerups = no;

    // Duration of start powerups
    Start Powerups Duration = 30;

    /* Map Weapons
     *
     * WP_MACHINEGUN
     * WP_SHOTGUN
     * WP_GRENADE_LAUNCHER
     * WP_ROCKET_LAUNCHER
     * WP_LIGHTNING
     * WP_RAILGUN
     * WP_PLASMAGUN
     * WP_BFG
     *
     * WP_NONE
     * WP_ALL
     **/
    Weapons = WP_ALL;

    /* Map Items
     *
     * IT_ARMOR_SHARD
     * IT_ARMOR_JACKET
     * IT_ARMOR_COMBAT
     * IT_ARMOR_BODY
     * IT_HEALTH_SMALL
     * IT_HEALTH
     * IT_HEALTH_LARGE
     * IT_HEALTH_MEGA
     * IT_TELEPORTER
     * IT_MEDKIT
     *
     * IT_NONE
     * IT_ALL
     **/
    Items = IT_ALL;

    /* Map Ammos
     *
     * AM_BULLETS
     * AM_SHELLS
     * AM_GRENADES
     * AM_ROCKETS
     * AM_LIGHTNING
     * AM_SLUGS
     * AM_CELLS
     * AM_BFG
     *
     * AM_NONE
     * AM_ALL
     **/
    Ammos = AM_ALL;

    /* Map powerups
     *
     * PW_QUAD
     * PW_BATTLESUIT
     * PW_HASTE
     * PW_INVIS
     * PW_REGEN
     * PW_FLIGHT
     *
     * PW_NONE
     * PW_ALL
     **/
    Powerups = PW_ALL;

    /* Enables the /drop command
     *
     * DR_FLAG          Enables /drop flag
     * DR_WEAPON        Enables /drop weapon [<weaponNum>]
     * DR_AMMO          Enables /drop ammo [<weaponNum>] [<amount>]
     * DR_POWERUP       Enables /drop powerup [<name>]
     * DR_HOLDABLE      Enables /drop holdable
     * DR_ARMOR         Enables /drop armor <amount>
     * DR_HEALTH        Enables /drop health <amount>
     *
     * DR_NONE
     * DR_ALL
     **/
    Drop Enable = DR_NONE;

    /* Spawn protection in seconds
     *
     *   0 - No protection
     * > 0 - Dual way protection. No points or freezes for spawnkills
     * < 0 - Shield protection
     **/
    Spawn Protection = no;

    /* Weapon change time in milliseconds
     *
     * Settings for modifying the behavior of weapon switch time
     *
     * Converstion from 1.03
     *
     *      SwitchTime = 150;        Dropping = -150;
     *                               Raising = -1 - 100;
     *                               Ammo = -150 - 100;
     *
     *      SwitchTime = -150;       Dropping = 150;
     *                               Raising = 150;
     *                               Ammo = 150 + 100;
     **/
    Weapon Time {
        /* How long does it take to stow away the current weapon
         *
         * > 0 - Adds (value - 1) to the current time
         * < 0 - Sets (+value - 1) as the current time. This allows switching even just
         *       after firing the weapon
         *   0 - Same as 201
         **/
        Dropping = 0;

        /* How long does it take to pull out the next weapon
         *
         * > 0 - Adds (value - 1) to the current time. In combination with negative
         *       dropping weapon times, you can use this when you want to allow
         *       a weapon switch to bypass the weapon reload time
         * < 0 - Adds the maximum of (+value - 1) and global weapon time to the current 
         *       time, so the switch will not bypass the weapon reload time
         *   0 - Same as 251
         **/
        Raising = 0;

        /* Out of Ammo slowdown
         *
         * 0 - Same as 501
         **/
        Ammo = 0;

        /* How long does it take to start switching right after firing the weapon
         * 
         * Used only in combination with positive dropping weapon times, ignored otherwise
         *
         * 0 - Use weapon cycle time
         **/
        Shooting = 0;
    }

    // Multiple Air-Jumps
    Multi Jumps = no;

    /* DM Flags
     *
     * Miscellaneous flags to modify several aspects of the game. Available flags are:
     *
     * DM_NO_SELF_DAMAGE        Weapons don't do self damage
     * DM_NO_FALLING_DAMAGE     No falling damage
     * DM_INFINITE_HEALTH       Infinite health (can only be killed by falling or crushed)
     * DM_INFINITE_ARMOR        Infinite armor
     * DM_INFINITE_AMMO         Infinite ammo
     * DM_DROP_WEAPONS          Drop used weapon on death if it was picked up
     * DM_DROP_START_WEAPONS    Drop used weapon on death if it was an starting weapon
     * DM_DROP_HOLDABLES        Drop holdables on death
     * DM_DROP_POWERUPS         Drop powerups on death
     * DM_TELEPORT_SPEED        Keep speed when jumping into a teleport
     * DM_TELEPORT_DIRECTION    Keep the direction when jumping into a teleport
     * DM_NO_FOOTSTEPS          Disable footsteps sounds
     * DM_NO_FALLING_SOUND      Disable falling (land crashing) sounds
     * DM_NO_QUAD_KNOCKBACK     Disable quad factor effect in self knocback
     **/
    DM Flags = DM_DROP_WEAPONS | DM_DROP_HOLDABLES | DM_DROP_POWERUPS;

    /* Team self damage factor
     *
     * When $g_friendlyFire is on, damage inflicted to teammates will hurt ourselves by the
     * value of this option
     **/
    Team Self Damage = 0.0;

    // Respawn in seconds
    Respawn Time = 1.7;

    // If specified, replaces Respawn Time after suicide
    //Respawn Time Suicide = Respawn Time;

    /* Player hitbox
     *
     *   1.0 - default
     * < 1.0 - smaller box
     * > 1.0 - larger box
     **/
    Hit Box = 1.0;

    /* Floating Speed is a stepwise (smooth) speed adjustment used when
     * various speed factors take effect (like weapon weight or haste factor).
     * Floating Speed Rate is measured in UPS per second and it defines how fast
     * the speed will go to the final value. Null or negative rates are treated
     * as infinite (leading to one-step speed changes).
     **/
    Floating Speed Rate = 0;

    // Damage taken from world
    World Damage {
        Fall Medium = 5;
        Fall Far = 10;
        Lava = 30;
        Slime = 10;
        Water = 15;
    }

    /* Speed factor with Haste powerup
     *
     * Will be applied to player speed, weapon fire rate and weapon regeneration
     **/
    Haste Factor = 1.3;

    // Regen powerup amounts every second
    Regen Factors {
        // How much to increase health when it is under soft limit value
        Soft Health = 15;

        // How much to increase health when it is over soft limit value
        Hard Health = Soft Health / 3;

        // How much to increase armor when it is under soft limit value
        Soft Armor = 0;

        // How much to increase armor when it is over soft limit value
        Hard Armor = 0;
    }

    // Protection against damage with Battlesuit powerup
    Suit Factors {
        // Factor applied to damage inflicted directly
        Direct = 0.5;

        // Factor applied to damage provoked by splash hits
        Splash = 0;
    }

    // Speed fly factor with Flight powerup
    Flight Factor = 1.0;

    // Speed factor while swimming
    Swim Factor = 1.0;

    // Spawn with this amount of health, also medkit will heal the player until this value
    Health = 125;

    // Rot rate in milliseconds when health is over soft limit value
    Health Rot Rate = 1000;

    // Limit for regeneration/soft pickups
    Health Soft Limit = 100;

    // Maximum possible health
    Health Hard Limit = 200;

    // Regeneration in milliseconds
    Health Regen = no;
    Health Regen Amount = 1;

    // Spawn with this amount of armor
    Armor = 0;

    // Rot rate in milliseconds when armor is over soft limit value
    Armor Rot Rate = 1000;

    // Limit for regeneration/soft pickups
    Armor Soft Limit = 0;

    // Maximum possible armor
    Armor Hard Limit = 0;

    // Regeneration in milliseconds
    Armor Regen = 0;
    Armor Regen Amount = 1;

    Armor System {
        /* Armor System
         *
         *  0 - Regular VQ3 System
         *  1 - Quake I / CPMA System
         *  2 - Quake II System
         **/
        System = 0;

        /* Spawn with this Armor
         *
         * IT_ARMOR_JACKET (green)
         * IT_ARMOR_COMBAT (yellow)
         * IT_ARMOR_BODY   (red)
         **/
        Spawn Quality = IT_ARMOR_JACKET;

        // Limits for item pickups
        Jacket Limit = 100;
        Combat Limit = 150;
        Body Limit = 200;

        // Protection against damage
        Jacket Quality = 0.5;
        Combat Quality = 0.66;  // This applies for all systems, as you always have the combat armor
        Body Quality = 0.75;
    }

    Corpse {
        // Gib death bodys ($com_blood must be enabled)
        Gib = no;

        // Time in seconds until corpse dissapears
        Time = 5;
    }

    Missiles {
        // Made missiles destroyable by other weapons
        Destroyable = 0;

        // Teleport missiles through teleporters
        Teleport = 0;
    }

    Anti Camp {
        // Time in seconds, 0 disables camp protection
        Time = 0;

        // Apply camp protection to a max of this radius
        Radius = 500;

        // Damage to inflict every second after time is run out if the user keeps camping
        Damage = 65;
    }

    // Specific options for team red
    Team Red {
        Start Weapon = 0;
        Start Weapons = 0;
        Start Powerups = 0;
        Start Powerups Duration = 0;
    }

    // Specific options for team blue
    Team Blue {
        Start Weapon = 0;
        Start Weapons = 0;
        Start Powerups = 0;
        Start Powerups Duration = 0;
    }

    // Points applied if a team scores
    Team Score {
        Team = 1;
        Members = 0;

        Other Team = 0;
        Other Members = 0;
    }

    /* Tournament
     *
     * The opponent will score if you die, regardless of the way it happens
     **/
    Tournament -> Death Score = no;

    /* Capture the Flag
     *
     * Settings applied for flag gametypes
     **/
    Capture the Flag {
        // Auto return time in seconds
        Flag Time = 30;

        // Return flag on suicide
        Suicide Return = true;

        // Scores
        Kill Carrier = 2;
        Defend Hurt Carrier = 2;
        Defend Carrier = 2;
        Defend Base = 1;
        Defend Flag = 1;
        Flag Return = 1;
        Flag Capture = 5;
        Flag Assist Return = 1;
        Flag Assist Frag = 2;

        if ( $g_gametype == GT_RTF ) {
            Flag Return *= 2;
        }
    }

    /* Freeze Tag
     *
     * Thaw times in seconds.
     *
     *   0 - No thawing
     * > 0 - Continue the thaw
     * < 0 - Forces a restart
     **/
    Freeze Tag {
        Thaw Time = -3;

        Self Thaw Time = Water Thaw Time = 120;
        Lava Thaw Time = Slime Thaw Time = 5;
        Void Thaw Time = 10;
        Crushed Thaw Time = 0.001;

        // Distance needed to defrost your team mate
        Thaw Distance = 100;

        // Points for defrosting
        Thaw Score = 2;

        // Thaw if the frozen body touches a teleport?
        Teleport Thaw = no;

        /* Defrost if you reach the damage.
         * You won't get any points for that.
         *
         *   0 - Disabled
         * > 0 - You can defrost your enemys, be careful were you are shooting at
         * < 0 - Only own team
         **/
        Damage Thaw = 1000;

        // Freeze player if teamkilled? If disabled, player will be crushed
        Teamkill Freeze = no;
    }

    /* Protect the Leader
     *
     * The current leader will have these settings applied
     **/
    Protect the Leader {
        Start Health = 125;
        Start Armor = 100;
        Start Armor Quality = IT_ARMOR_JACKET;
        Start Weapon = WP_GAUNTLET;
        Start Weapons = WP_GAUNTLET;
        Start Powerups = PW_REGEN;

        // Scores
        Kill Leader = 4;
        Defend Leader = 1;
        Assist Kill Leader = 1;

        // Score on leader suicide/teamkill?
        Leader Suicide Score = yes;

        /* Control which player stats are cleared when he stops being the leader
         *
         * RESET_HEALTH
         * RESET_ARMOR
         *
         * RESET_NONE
         * RESET_ALL
         **/
        Reset Flags = RESET_HEALTH | RESET_ARMOR;
    }

    /* Round end actions
     *
     * Settings applied to all round based gametypes
     **/
    Round {
        /* Items that are reset
         *
         * IT_ARMOR_SHARD
         * IT_ARMOR_JACKET
         * IT_ARMOR_COMBAT
         * IT_ARMOR_BODY
         * IT_HEALTH_SMALL
         * IT_HEALTH
         * IT_HEALTH_LARGE
         * IT_HEALTH_MEGA
         * IT_TELEPORTER
         * IT_MEDKIT
         *
         * IT_NONE
         * IT_ALL
         **/
        Items = IT_NONE;

        /* Controls which player stats are cleared
         *
         * RESET_HEALTH
         * RESET_ARMOR
         * RESET_WEAPONS
         * RESET_POWERUPS
         *
         * RESET_NONE
         * RESET_ALL
         **/
        Reset Flags = RESET_ARMOR | RESET_WEAPONS | RESET_POWERUPS;

        // Round warmup time, only when $sv_matchmode is 2
        Warmup = 4;

        // Shuld players respawn after round warmup? Only when $sv_matchmode is 2
        Warmup Respawn = $sv_warmupRespawn & WARMUPRESPAWN_PLAYERS;

        // Call for draw when all players are dead instead of deciding with the latest frag
        Draw Enable = no;
    }

    Items {
        // Make items shootable
        Shootable = no;

        // Speed at which items will be dropped
        Drop Speed = 500;

        // Bounce damping factor [1...0...-1] that is equivalent to
        // [infinite bouncing...no bounce at all...infinite reflecting]
        Drop Bouncy = 0.45;

        // if Drop Gravity = no, then item will initially fly with no gravity
        // (straight forward) until the first bounce, and fall then
        Drop Gravity = yes;

        // These Attackerward drop settings control the flag dropping on death.
        // When the Attackerward Drop Speed is not null, then on death the flag will
        // be dropped right to the attacker with these speed, bouncy and gravity.
        // Certain settings are specified in the same way as for the item dropping
        Attackerward -> Drop Speed = 0;
        Attackerward -> Drop Bouncy = 0.45;
        Attackerward -> Drop Gravity = yes;
    }
}
/* Weapon Settings
 *
 * Common settings:
 *
 * - Cycle                 Weapon reload time
 *
 * - Damage                Amount of damage inflicted
 *
 * - Knockback             Damage and Knockback have been separated. You can have high damage
 *                         weapons but disable or lower the pushing effect. A negative value
 *                         will pull the player instead of pushing him. If not specified,
 *                         value is taken from Damage setting
 *
 * - Radius                Radius to apply to splash damage and for within splash and self
 *                         knockback have effect
 *
 * - Splash Damage         Max amount of splash damage to inflict, real damage will vary 
 *                         depending on the distance of the enemy to the explosion
 *
 * - Splash Knockback      Max amount of splash knockback to apply to other players. If not
 *                         specified, value is taken from Splash Damage setting
 *
 * - Self Knockback        Amount of splash knockback to apply only to self. A positive value
 *                         means radial knockback, whereas a negative value means a fixed value
 *                         regardless of the distance of the explosion. If not specified,
 *                         value is taken from Splash Knockback setting
 *
 * - Self Knockback HV     Horizontal/Vertical asymmetry control for the Self Knockback
 *                         It may vary in range [1...0...-1] and that is equivalent to
 *                         [just horizontal...symmetric...just vertical] knockback proportion
 *
 * - Self Slide Factor     Multiplier to the time to slide with no control, no friction
 *                         and no gravity after being kicked by self
 *
 * - Firing Knockback      Amount of knockback to apply to self when firing the gun, wich 
 *                         produces a kick effect
 *
 * - Firing Knockback HV   Horizontal/Vertical asymmetry control for the Firing Knockback.
 *                         Range and meanings see the Self Knockback HV description.
 *                         While standing on ground the vertical portion of firing knockback
 *                         will be not greater than (limited to) its horizontal portion
 *
 * - Team Knockback        Same as Knockback but applied to your teammates when you attack them.
 *                         If specified, it will replace the Knockback for the team attack
 *
 * - Team Splash Knockback Same as Splash Knockback but applied to your teammates when you 
 *                         attack them. If specified, it will replace the Splash Knockback
 *                         for the team attack
 *
 * - Ammo                  Amount of ammo to spawn for with that weapon
 *
 * - Ammo Limit            Limit ammo pickups up to this value
 *
 * - Regen                 Number of milliseconds for which to regenerate 1 ammo unit up to
 *                         the value of the Ammo. Weapon must not be firing to take effect
 *
 * - Sky                   If enabled, the weapon and missiles will hit the sky/black box
 *
 * - Weight                Weitgh of the weapon. Player Speed = Player Speed / Weapon Weight
 *
 * - Bounce                Number of times to bounce the shots/missiles before they explode.
 *                         A value of -1 will bounce max times alowed by the mod
 *
 * - Speed                 Only for missiles. Speed at which missiles move
 *
 * - Gravity               Only for missiles. If enabled, the missile will be affected by
 *                         gravity
 *
 * - Time To Live          Only for missiles. Number of seconds for the missile to run before
 *                         it explodes
 *
 * - Time -> *             Weapon switch time specific settings. A value of 0 for any of these
 *                         setting will use global value instead
 *
 * - Style                 Weapon style bitmask. Available flags (some weapons do have addition 
 *                         styles available, see the specific weapon section):
 *                             WPS_RAILTRAIL           Produce a rail trail (available only for
 *                                                     machinegun, shotgun and railgun)
 *                             WPS_IMPACT_MACHINEGUN   Produce a machinegun bullet impact
 *                             WPS_IMPACT_SHOTGUN      Produce a shotgun bullet impact
 *                             WPS_IMPACT_GRENADE      Produce a grenade explosion
 *                             WPS_IMPACT_ROCKET       Produce a rocket explosion
 *                             WPS_IMPACT_PLASMA       Produce a plasma explosion
 *                             WPS_IMPACT_RAIL         Produce a rail impact
 *                             WPS_IMPACT_BFG          Produce a bfg explosion
 **/

// Explosion produced when a player is killed, regardless of the way he dies

Suicide {
    Damage = no;
    //Knockback = Damage;
    Radius = no;
    Style = no;
    //Team Knockback = Knockback;
}

Grapple {
    Offhand = no;
    Cycle = 400;
    Damage = 300;
    //Knockback = Damage;
    Splash Damage = 0;
    //Splash Knockback = Splash Damage;
    Radius = no;
    Self Damage = 0.5;
    //Self Knockback = Splash Knockback;
    Self Knockback HV = 0.0;
    Self Slide Factor = 1.0;
    Firing Knockback = 0;
    Firing Knockback HV = 0.8;
    //Team Knockback = Knockback;
    //Team Splash Knockback = Splash Knockback;
    Speed = 2000;

    // Release the hook in seconds
    Time = 10;

    Pull Speed = 800;

    /* Grapple Style
     *
     * WPS_GRAPPLE_ROPE     You will swing around like hanging on a rope
     **/
    Style = 0;

    // The hook is auto-released if you receive at least this amount of knockback
    // (negative==infinite). However the hook is always released with any self knockback
    Breaking Knockback = 0;

    Gravity = no;
    Sky = no;
    Time to Live = 10;
    Weight = 1.0;
    Firing Weight = 1.0;
    Time -> Dropping = 0;
    Time -> Raising = 0;
    Time -> Shooting = 0;
}

Gauntlet {
    Cycle = 400;
    Damage = 50;
    //Knockback = Damage;
    //Team Knockback = Knockback;
    Weight = 1.0;

    // How long-distance is the gauntlet attack (in game units, while a player is normally 30x30x56)
    Distance = 32;

    /* Gauntlet Style
     *
     * WPS_GAUNTLET_DYNAMIC_WEIGHT  Gauntlet Firing Weight will be applied only while
     *                              you are contacting with ground or swimming
     **/
    Style = 0;

    Firing Weight = 1.0;
    Time -> Dropping = 0;
    Time -> Raising = 0;
    Time -> Shooting = 0;
}

Machinegun {
    Cycle = 100;
    Damage = ( $g_gametype != GT_TEAM ? 7 : 5 );
    //Knockback = Damage;
    Splash Damage = 0;
    //Splash Knockback = Splash Damage;
    Radius = no;
    Self Damage = 0.5;
    //Self Knockback = Splash Knockback;
    Self Knockback HV = 0.0;
    Self Slide Factor = 1.0;
    Firing Knockback = 0;
    Firing Knockback HV = 0.8;
    //Team Knockback = Knockback;
    //Team Splash Knockback = Splash Knockback;
    Regen = no;
    Ammo = 100;
    Ammo Limit = 200;
    Style = WPS_IMPACT_MACHINEGUN;
    Bounce = no;

    // Machinegun spread factor
    Spread = 200;

    // Use radial spread? If disabled, it will use quadratic spread (old mods before 1.29)
    Radial = yes;

    Sky = no;
    Weight = 1.0;
    Firing Weight = 1.0;
    Time -> Dropping = 0;
    Time -> Raising = 0;
    Time -> Ammo = 0;
    Time -> Shooting = 0;
}

Shotgun {
    Cycle = 1000;
    Damage = 10;
    //Knockback = Damage;
    Splash Damage = 0;
    //Splash Knockback = Splash Damage;
    Radius = no;
    Self Damage = 0.5;
    //Self Knockback = Splash Knockback;
    Self Knockback HV = 0.0;
    Self Slide Factor = 1.0;
    Firing Knockback = 0;
    Firing Knockback HV = 0.8;
    //Team Knockback = Knockback;
    //Team Splash Knockback = Splash Knockback;

    // Number of pellets that come out from a single shot
    Pellet Count = 11;

    // Shotgun spread factor
    Spread = 700;

    // Use radial spread? If disabled, it will use quadratic spread (default)
    Radial = no;

    Regen = no;
    Ammo = 0;
    Ammo Limit = 200;
    Style = WPS_IMPACT_SHOTGUN;
    Bounce = no;
    Sky = no;
    Weight = 1.0;
    Firing Weight = 1.0;
    Time -> Dropping = 0;
    Time -> Raising = 0;
    Time -> Ammo = 0;
    Time -> Shooting = 0;
}

Grenade Launcher {
    Cycle = 800;
    Damage = 100;
    //Knockback = Damage;
    Splash Damage = 100;
    //Splash Knockback = Splash Damage;
    Radius = 150;
    Self Damage = 0.5;
    //Self Knockback = Splash Knockback;
    Self Knockback HV = 0.0;
    Self Slide Factor = 1.0;
    Firing Knockback = 0;
    Firing Knockback HV = 0.8;
    //Team Knockback = Knockback;
    //Team Splash Knockback = Splash Knockback;
    Regen = 0;
    Speed = 700;
    Ammo = 0;
    Ammo Limit = 200;

    /* Grenade Launcher Style
     *
     * WPS_GRENADE_STICKY   Grenades will stick to walls, like mines
     **/
    Style = WPS_IMPACT_GRENADE;

    Bounce = -1;
    Gravity = yes;
    Time to Live = 2.5;
    Sky = no;
    Weight = 1.0;
    Firing Weight = 1.0;
    Time -> Dropping = 0;
    Time -> Raising = 0;
    Time -> Ammo = 0;
    Time -> Shooting = 0;
}

Rocket Launcher {
    Cycle = 800;
    Damage = 100;
    //Knockback = Damage;
    Splash Damage = 100;
    //Splash Knockback = Splash Damage;
    Radius = 120;
    Self Damage = 0.5;
    //Self Knockback = Splash Knockback;
    Self Knockback HV = 0.0;
    Self Slide Factor = 1.0;
    Firing Knockback = 0;
    Firing Knockback HV = 0.8;
    //Team Knockback = Knockback;
    //Team Splash Knockback = Splash Knockback;
    Regen = no;
    Speed = 900;
    Ammo = 0;
    Ammo Limit = 200;

    /* Rocket Launcher Styles
     *
     * WPS_ROCKET_GUIDED    Allows to control the rocket with your mouse
     * WPS_ROCKET_HOMING    Rocket will hunt your enemys
     **/
    Style = WPS_IMPACT_ROCKET;

    // Rocket launcher homing factor (only for WPS_ROCKET_HOMING style)
    Homing Factor = 0.3;

    Bounce = no;
    Gravity = no;
    Time to Live = 15;
    Sky = no;
    Weight = 1.0;
    Firing Weight = 1.0;
    Time -> Dropping = 0;
    Time -> Raising = 0;
    Time -> Ammo = 0;
    Time -> Shooting = 0;
}

Lightning Gun {
    Cycle = 50;
    Damage = 8;
    //Knockback = Damage;
    Splash Damage = 0;
    //Splash Knockback = Splash Damage;
    Radius = no;
    Self Damage = 0.5;
    //Self Knockback = Splash Knockback;
    Self Knockback HV = 0.0;
    Self Slide Factor = 1.0;
    Firing Knockback = 0;
    Firing Knockback HV = 0.8;
    //Team Knockback = Knockback;
    //Team Splash Knockback = Splash Knockback;
    Regen = no;
    Ammo = 0;
    Ammo Limit = 200;
    Style = no;
    Sky = no;

    // Lightning gun beam length
    Range = 768;

    // Lightning gun bounce. THIS WILL CRASH ALL CLIENTS WITHOUT MOD!
    Bounce = no;

    Weight = 1.0;
    Firing Weight = 1.0;
    Time -> Dropping = 0;
    Time -> Raising = 0;
    Time -> Ammo = 0;
    Time -> Shooting = 0;
}

Railgun {
    Cycle = 1500;
    Damage = 100;
    //Knockback = Damage;
    Splash Damage = 0;
    //Splash Knockback = Splash Damage;
    Radius = no;
    Self Damage = 0.5;
    //Self Knockback = Splash Knockback;
    Self Knockback HV = 0.0;
    Self Slide Factor = 1.0;
    Firing Knockback = 0;
    Firing Knockback HV = 0.8;
    //Team Knockback = Knockback;
    //Team Splash Knockback = Splash Knockback;
    Regen = no;
    Ammo = 0;
    Ammo Limit = 200;
    Style = WPS_RAILTRAIL | WPS_IMPACT_RAIL;
    Bounce = no;
    Sky = no;
    Weight = 1.0;
    Firing Weight = 1.0;
    Max Hits = 4;
    Time -> Dropping = 0;
    Time -> Raising = 0;
    Time -> Ammo = 0;
    Time -> Shooting = 0;
}

Plasma Gun {
    Cycle = 100;
    Damage = 20;
    //Knockback = Damage;
    Splash Damage = 15;
    //Splash Knockback = Splash Damage;
    Radius = 20;
    Self Damage = 0.5;
    //Self Knockback = Splash Knockback;
    Self Knockback HV = 0.0;
    Self Slide Factor = 1.0;
    Firing Knockback = 0;
    Firing Knockback HV = 0.8;
    //Team Knockback = Knockback;
    //Team Splash Knockback = Splash Knockback;
    Regen = no;
    Speed = 2000;
    Ammo = 0;
    Ammo Limit = 200;

    /* Plasma Gun Styles
     *
     * WPS_PLASMA_SPLIT     Adds 3 plasma streams
     **/
    Style = WPS_IMPACT_PLASMA;

    // Plasmagun spread (only for WPS_PLASMA_SPLIT style)
    Spread = 300;

    Bounce = no;
    Gravity = no;
    Time to Live = 10;
    Sky = no;
    Weight = 1.0;
    Firing Weight = 1.0;
    Time -> Dropping = 0;
    Time -> Raising = 0;
    Time -> Ammo = 0;
    Time -> Shooting = 0;
}

BFG {
    Cycle = 200;
    Damage = 100;
    //Knockback = Damage;
    Splash Damage = 100;
    //Splash Knockback = Splash Damage;
    Radius = 120;
    Self Damage = 0.5;
    //Self Knockback = Splash Knockback;
    Self Knockback HV = 0.0;
    Self Slide Factor = 1.0;
    Firing Knockback = 0;
    Firing Knockback HV = 0.8;
    //Team Knockback = Knockback;
    //Team Splash Knockback = Splash Knockback;
    Regen = no;
    Speed = 2000;
    Ammo = 0;
    Ammo Limit = 200;

    /* BFG Styles
     *
     * WPS_BFG_PANTS    Mr. Pants' Excessive
     * WPS_BFG_SOD      SoD MoD
     **/
    Style = WPS_IMPACT_BFG;

    /* Grenade Settings
     *
     * Only valid if WPS_BFG_PANTS or WPS_BFG_SOD is set
     **/
    Grenade Count = 7;        // valid for WPS_BFG_PANTS only, WPS_BFG_SOD will always use 4
    Grenade Damage = 80;
    //Grenade Knockback = Grenade Damage;
    Grenade Splash Damage = 200;
    //Grenade Splash Knockback = Grenade Splash Damage;
    Grenade Radius = 80;
    //Grenade Self Knockback = Grenade Splash Knockback;
    Grenade Style = WPS_IMPACT_GRENADE;
    //Grenade Team Knockback = Grenade Knockback;
    //Grenade Team Splash Knockback = Grenade Splash Knockback;

    Bounce = no;
    Gravity = no;
    Time to Live = 10;
    Sky = no;
    Weight = 1.0;
    Firing Weight = 1.0;
    Time -> Dropping = 0;
    Time -> Raising = 0;
    Time -> Ammo = 0;
    Time -> Shooting = 0;
}

Inner loading of other configs

You can load another config inside your own config file with the following syntax:

/* include( filename )
*
* parse the config file and returns 1 if parsing was successful, 0 in case of error
* does not limit the recursion level, so avoid any cyclic includes
**/
if ( include( "default.cfg" ) ) {
    debug( "default settings successfully loaded !" );
} else {
    debug( "ERROR : default settings could not be loaded !" );
}

An altenative is by issuing a:

exec("load default"); 

But with exec(), the config will be loaded after your config will be processed by the engine.

With include(), it will be processed wherever you place it in your code.

‎‎

Crontab

Set the sv_crontab "crontab.txt" variable to the file where your crontab script is.

A crontab is basically a list of commands that are executed at a given date/time.

The syntax format is the same as the *nix crontab use.

Short overview

Each line has the format: minute hour day month dayofweek /command

For any of the above values, an asterisk (*) can be used to specify all valid values. For example, an asterisk for the month value will execute the command every month within the constraints of the other values.

A hyphen (-) between numbers specifies a range. For example, 1-4 will expand to 1, 2, 3 and 4.

A list of values separated by commas (,) specifies a list. For example, 3,4,6,8 indicate those four specific numbers (note that there are no spaces between the commas).

The forward slash (/) can be used to specify step values. The value of an number can be skipped within a range by following the range with /.

For example, 0-59/2 can be used to define every other minute in the minute field. Step values can also be used with an asterisk.

For instance, the value */3 can be used in the month field to run the task every third month.

Any lines that begin with a hash mark (#) or a double slash (//) are comments and are not processed.

Additionally, an slash followed by an asterisk (/*) indicates the start of a comment, which can be spread across multiple lines until an asterisk followed by an slash (*/) is found.

Example:

# examples
* * * * *       /say this is executed every minute!
* * * * 1       /say this is executed every minute but only on mondays!
*/5 * * * *     /say this is executed every 5 minutes!
0 15 5 2 *      /say this is executed on the 5th February at 15:00 o'clock!

# display greeting with hostname every half an hour
10,40 * * * *   /say ^2Welcome on ^7$(sv_hostname)^7

# display g_motd command info into crontab every 5 minutes
*/5 * * * *     /say $(g_motd)

# display number of active players every 3 minutes
*/3 * * * *     /say ^7There is currently ^2$(sv_activeClients) ^7players on the server!

# randomize rotation
* * * * *       /execstr set sv_rotateStep $sv_serverid

# change config at midnight
0 0 * * *       /exec your-midnight-fun.cfg

Conditional processing

Basic if-else structures are supported in crontab files. This allows you to execute commands only if a certain condition is met.

The syntax of if-else structures is the same as the one used in the Rotation System, so refer to it for further information.

Example:

// remind the users to remove the password at the end of a war
if ( g_needpass ) {
    */10 * * * *    /say ^3Remember to remove the password at the end of the war!
}

// say something depending on the number of clients
if ( sv_activeClients >= 14 ) {
    */5 * * * *     /say ^3Wow, server is really crowded! :D
} else if ( sv_activeClients >= 8 ) {
    */5 * * * *     /say ^3Expecting more players to come :P
} else if ( sv_activeClients > 0 ) {
    */5 * * * *     /say ^3Please don't leave the server! :(
} else {
    */5 * * * *     /say ^3To any spectator, join the game and stop wasting server slots!! :@
}
 ‎‎ 
 ‎‎ 
 ‎‎ 

Game Types

In Q3PLUS you have 4 great and all new gametypes to play with! Of course the old are still unchanged and there like Free for All (g_gametype 0), Tournament (g_gametype 1), Team Deathmatch (g_gametype 3) and Capture the Flag (g_gametype 4).

Additionally, there exist lots of configuration options to modify the behavior and scoring rules of these gametypes, refer to the Configuration System documentation for more information.

Tournament

1on1 (g_gametype 1). Well, yes you all know what it is but Q3PLUS added a new feature to have map rotations for this gametype. The rotation works the same as for any other gametype.

Capture the Flag

CTF (g_gametype 4). As with tournament, we all know what this gametype is about.

Return the Flag

RTF (g_gametype 5). This one is more difficult than the regular Capture the Flag but also the better team game.

Though the only difference is that you have to carry your own flag back to your base, it is harder than it sounds!

Be aware of double flag carriers, they can be your best friends but also your worst enemies.

One Flag CTF

1FCTF (g_gametype 6). This is another Capture the Flag variant.

You basically have to pickup the Neutral Flag (White Flag) in the middle of a map and try to get to the enemy's base to score a point.

Don't forget that it's the enemy base and therefore well protected! You better get your team with you to have a bigger chance to capture.

Many maps support this gametype like q3wcp*, q3w*, q3wxs* etc. but you can also add support for other maps (for example, q3ctf1-4, see the Map Modification feature).

Clan Arena

Clan Arena gametype can be considered as an elimination gametype. It is round-based, and the principle is simple: hunt down the enemy team to win.

Once you got fragged you have to wait until the round ends only then you will respawn.

It is inspired on the Rocket Arena mod.

Freeze Tag

FTAG (g_gametype 8). This is a great teamplay gametype. It is a lot like that game you may have played as a kid, but without the killing.

In Freeze Tag you try to eliminate the entire enemy team.

If you kill someone then they will become frozen. So to eliminate all, you'd need to freeze everyone, making them all frozen at the same time.

This will give your team a point and the round will start over again.

If you are ever frozen, a teammate can come rescue you by standing next to your icy body for three seconds. You'll then be set free and can join the battle again.

This gametype is based on Darrell Bircsak's Freeze Tag.

Protect the Leader

PTL (g_gametype 9). This one is an all-new teamplay gametype where you have to prevent that your leader gets hurt.

Each team has a granted team leader who is carrying your team's flag.

The enemy team of course tries to kill your leader to win the round and it is your job to prevent this!

The one who kills the leader gets the new leader and automatically is hunted by the other team.

‎‎

Map Modification

Q3PLUS includes a feature to modify map entities, which can be disabled with the sv_noCustomEnts server cvar. Entities includes all the interactive elements of a map, like items, spawns, movers, teleporting targets and more.

However, you can't alter the map solids with them, and even when you can modify location names or add new ones, keep in mind that all the modifications are server side, so that will either have no effect or even can actually break team overlay in client.

If the file maps/mapname.ents exists, it will override the original entities. So this file have to be complete, including jumppads, teleporters etc. To have an example, you can look at the q3ctf4.ents file included in the release.

If you want to add some items use maps/mapname.add instead.

Among the most common applications of the entities files, we have:

* Modifying a normal map to adapt it to flag gametypes. This includes both adding the flags and red/blue spawn points to it.

* Modify item placement. If item placement is also modified, that means bots can have some problems moving around the map. Also, always try to modify them for baseq3, since it is the default config, and every other config should be responsible for modifying the items by their selves.

* Add or modify player spawn points.

* Modify space maps to make the void bounce players instead of killing them.

* ... and many more.

As an example, we include the contents of the q3dm17.add file included in the release, which mostly adds support for flag gametypes to the map. As you can see, the syntax is a bit tricky, so it is advised that you only create this files by hand for easy modifications.

For more complex ones, we recommend you to modify the map with a map editor instead, and to take the contents for the .ents file directly from the compiled .bsp file (you can open it with an editor like wordpad or notepad++ and search for the "worldspawn" string, since it should always be the first entity in the list).

/* Here is an example how to modify existing maps.
 *
 * This will add red/blue lights to q3dm17 on team games and flags for CTF.
 * We use a hack to add dynamic lights to the map, please note that this is
 * very limited.
 **/

// Red base (left platform)
    {
        "classname" "team_CTF_redflag"
        "origin" "-300 -850 700"
        "notfree" "1"
    }

    // red light for all team games
    {
        "classname" "func_static"
        "origin" "-300 -850 700"
        "model" "*1"
        "light" "1020"
        "color" ".004 0 0"
        "notfree" "1"
    }

    // intensivy the light for CTF games
    {
        "classname" "func_bobbing"
        "origin" "0 -850 700"
        "model" "*1"
        "light" "1000"
        "color" ".004 0 0"
        "spawnflags" "1"
        "height" "300"
        "gametype" "ctf, rtf, oneflag"
    }

    // add a white marker light where the flag should
    // be, this will help us returning the flag
    {
        "classname" "func_static"
        "origin" "-300 -850 600"
        "model" "*1"
        "light" "100"
        "color" ".004 .004 .004"
        "gametype" "rtf"
    }

    // Blue base (right platform)
    {
        "classname" "team_CTF_blueflag"
        "origin" "-300 978 600"
        "notfree" "1"
    }

    // blue light for all team games
    {
        "classname" "func_static"
        "origin" "-300 978 700"
        "model" "*1"
        "light" "1020"
        "color" "0 0 .004"
        "notfree" "1"
    }

    // intensivy the light for CTF games
    {
        "classname" "func_bobbing"
        "origin" "0 978 700"
        "model" "*1"
        "light" "1000"
        "color" "0 0 .004"
        "spawnflags" "1"
        "height" "300"
        "gametype" "ctf, rtf, oneflag"
    }

    // add a white marker light where the flag should
    // be, this will help us returning the flag
    {
        "classname" "func_static"
        "origin" "-300 978 600"
        "model" "*1"
        "light" "90"
        "color" ".004 .004 .004"
        "gametype" "rtf"
    }

    // Neutral flag
    {
        "classname" "team_CTF_neutralflag"
        "origin" "2432 64 372"
        "gametype" "oneflag"
    }

    // add some light, only if gametype = oneflag
    {
        "classname" "func_static"
        "origin" "2432 64 372"
        "model" "*1"
        "light" "300"
        "color" ".004 .004 .004"
        "gametype" "oneflag"
    }
    {
        "classname" "func_bobbing"
        "origin" "2432 64 372"
        "model" "*1"
        "light" "600"
        "color" ".004 .004 .004"
        "spawnflags" "2"
        "height" "300"
        "gametype" "oneflag"
    }
 ‎‎ 
 ‎‎ 

Rotation System

Rotation files are means to replace old quake cvar-based rotation system. To enable it, just set sv_rotation to the file your rotation script is.

If the sv_rotation cvar is empty, or the file does not exist or it's empty (there are no maps on it, even if the file is not really empty), it falls back to the default quake behavior and executes whatever it is on the nextmap cvar.

Description

In its simplest form, you can just write a list of maps that your server will keep rotating once a map finishes. For example:

// very simple rotation file
q3dm1
q3dm2
q3dm3
q3dm4
q3dm5

The first line of the script is a comment and is ignored by the parser. Everything after double slashes // and a hash mark # until the end of the line is ignored.

Additionally, an slash followed by an asterisk /* indicates the start of a comment, which can be spread across multiple lines until an asterisk followed by an slash */ is found.

From the second to last line on the example we have our rotation, which is simply a list of maps. Maps are separated with a newline character, or with a semicolon ;.

Additionally, you can modify the values of server cvars inside your rotation files by adding a dollar-sign $ before the cvar name and after it the equal sign =, followed by its value, optionally enclosed by double quotes ".

Also, you can execute server commands, by prefixing it with a slash / or inverted slash \, and is read until the end of the line. This is illustrated in the following example:

// global settings, will be executed always before each map
$g_gametype = 3; // team deathmatch
$timelimit =  20;
$fraglimit =  30;
$sv_config =  "q3plus.cfg"; // strings can also be assigned

// kick any bot added in the previous map
/k allbots

// actual rotation
q3dm1
q3dm2
q3dm3

To separate multiple cvars you can alternatively use semicolons ;, which allows you to assign several cvars in the same line.

All these cvars and commands will be executed before each map, which is good to ensure that your server is running the right settings all the time.

However, you can also set settings and run commands specifically for one map in the rotation, if you enclose these between brackets { } immediately after a map, like the following example shows:

// this will be executed before each map
$timelimit =  20;
$fraglimit =  35;
$g_gametype = 0;

q3dm1 {
    $fraglimit = 50;
}
q3dm2
q3dm3

q3ctf1 {
    $g_gametype = 4;
    $timelimit = 15;
    $capturelimit = 10;
    /load q3plus
}

// this will be ffa! remember the "g_gametype = 0"
q3ctf4

A very common usage of map blocks is to set the g_motd cvar to the information of the next map in the rotation, and the message will be printed to clients in their loading screens:

// this will be executed before each map
$timelimit =  20;
$fraglimit =  35;
$g_gametype = 0;

q3dm1 { $g_motd = "^5Next map: ^2q3dm2" }
q3dm2 { $g_motd = "^5Next map: ^2q3dm3" }
q3dm3 { $g_motd = "^5Next map: ^2q3dm1" }

Manual rotation

By default, a map will be rotated only at the end of the map. However, you can additionally use the command /rcon rotate [step] to manually change the current map. The command accepts an optional parameter, which can be:

* A number, which will be used to rotate the map relatively to the current map. So, for example a value of 1 means rotate to the next map, a 2 to rotate two maps ahead, a -1 to rotate the the previous map and a 0 to restart the current map. If no argument is specified for the rotate command, then the value of sv_rotateStep will be used as the first parameter. Since a rotation is by definition cyclical, there is no problem in using any number as this parameter, even arbitrarily big ones, because for example in a 10 map rotation, the first map is also the 11th, 21th, and so on.

* The restart keyword, or its shorthand, r, which will rotate to the first map in the rotation.

If you want to let your users the possibility of chose which maps to play on, you can add the rotate string to the sv_vote cvar. However, this will let the user the liberty to specify a parameter for the command.

So, you can alternatively just add the nextmap string, which will just execute a /rotate command without any parameter.

Random rotation

As you could read in the latest section, the sv_rotateStep cvar controls how many maps to "jump" with a /rotate command without any parameter, which is what is used at the end of maps.

You can use this cvar to modify the flow of your rotation, for example a value of -1 will mean that your rotation will run backward.

However, a more useful application for this sv_rotateStep cvar is the possibility for random rotations. To achieve that effect, just add the following line to your Crontab file:

// randomize rotation
* * * * * /execstr set sv_rotateStep $(sv_serverid)

This will change the value of the sv_rotateStep cvar to the value of the sv_serverid cvar, which is pretty much a random number that is used as the identifier for the server, and it changes every map. This allows for a true random map rotation.

Alternatively, if you want to keep your normal rotation, but let a user to callvote a random map, you can use a little quake scripting, and add the following line to the server cfg:

// cvar to hold the command to callvote a random map
/set randomMap "execstr rotate $(sv_serverid)"

The you just have to add the string vstr randomMap to the sv_vote cvar, and then the users can do /callvote "vstr randomMap".

Conditional rotation

To make server rotation even more dynamic, basic if-else structures are supported in rotation scripts.

This allows you to rotate to specific maps only if a certain condition is met. To illustrate the syntax of if-else constructions, take a look at the example:

if ( $g_gametype != 3 ) { // NOT team deathmatch
    $timelimit = 15;
    $fraglimit = 50;
} else { // team deathmatch
    $timelimit = 10;
    $fraglimit = 100;
}

// just the same..
if ($g_gametype!=3) { $timelimit = 15; $fraglimit = 50; } else { $timelimit = 10; $fraglimit = 100; }

// a bit more complex?
if ( $g_gametype == 3 || $g_gametype == 8 ) { // tdm or freeze tag
    $g_quadFactor = 1;

    if ( $timelimit >= 20 ) { // 20+ minutes
        $fraglimit = 50;
    } else if ( $timelimit >= 12 ) { // 12+ minutes but less than 20
        $fraglimit = 35;
    } else { // less than 12 minutes
        $fraglimit = 25;

        $g_quadFactor = 3.5;
        /say ^1Quad Damage ^7is enabled because of the short timelimit!
    }
}

As you can see, the condition has to be of the form cvar comparison_operator value, where the operator can be one of the following:

* Is equal to ==

* Is not equal to !=

* Is less than <

* Is less or equal than <=

* Is greater than >

* Is greater or equal than >

The starting and closing brackets { } after the condition are mandatory.

The main usage of if-else constructions in rotation files, and actually the reason for its existence, is the possibility to modify the rotation and settings depending on the number of active clients on the server.

For this purpose the cvar sv_activeClients exists, which holds the number of non-spectators currently playing on the server:

if ( $sv_activeClients >= 12 ) {
    // big maps, 12 clients or more
    q3dm12
    q3dm14
    q3dm15
} else if ( $sv_activeClients >= 6 ) {
    // normal maps, from 6 to 11 clients
    q3dm6
    q3dm7
    q3dm8
} else {
    // small maps, 5 clients or less
    q3dm2
    q3dm3
    q3dm5
}

You can also use conditions inside map blocks:

$g_gametype = 3;

q3dm6 {
    if ( $sv_activeClients > 6 ) { $fraglimit = 100; }
    else { $fraglimit = 50; }
}

Conditional rotation gotcha

To finalize, there is an issue to keep an eye on when using conditions inside the rotation file. To illustrate it, consider the following rotation:

q3dm6
if ( $sv_activeClients > 6 ) { q3dm13 }
q3dm8
q3dm9

It's pretty obvious what is the objective with that rotation file: to rotate to q3dm13 only if there is more than 6 clients on the server, but otherwise rotate directly to q3dm8.

However, a problem arises here, and it's because of the way the rotation works internally: it first counts the number of maps on the rotation, ignoring the maps for which the conditions are not met, and then it executes the map in turn. The effects of this are two problems:

* If we are currently playing q3dm8 with 4 people, this means we are on the second map of the rotation, but if the number increases up to 8 at the end of the map, on next map we will rotate to the third map of the rotation, which will effectively just restart q3dm8 because it is the third map of the rotation for more than 6 players.

* If we are currently playing on q3dm13 with 8 players, we are currently at the second map of the rotation, but if the number of players decreases down to 4 at the end of the map, on next map we will rotate to the third map of the rotation, which is q3dm9 for 6 players or less, jumping over q3dm8.

These problems can become worse the more we use that kind of conditions. To fix this, always include an else with the same number of maps of the original condition so that the total number of maps doesn't vary depending on the number of players. Applying this to the example, the fixed rotation would look something like the following:

q3dm6
if ( $sv_activeClients > 6 ) { q3dm13 }
else { q3dm7 }
q3dm8
q3dm9
 ‎‎ 
 ‎‎ 

Server Cvars & Commands

Q3PLUS has several new server cvars and commands, as well as some modifications to existing ones, which accounts for its many server side features. In this document you will find them all.

Variable list

g_redTeam, g_blueTeam

g_redTeam "^1RED", g_blueTeam "^4BLUE": Now they accept fancy font encoding, which will be drawn on the client scoreboard.

g_teamAutoJoin

g_teamAutoJoin "0": Bitmask to control automatic team joining when a player first joins to a server or on gametype changes. Available flags:

* 1 - Join automatically to the team with less players or less score.

* 2 - Don't automatically join a team, but preserve the current teams across gametype changes.

refereePassword

refereePassword "": Sets the referee password. A referee is like an admin but with the advantage that the admin can restrict the commands a referee can use. You can for example allow referees to kick players but not to ban someone.
Use
sv_referee to define the commands and /ref to login and execute referee commands.
Use an empty password to disable referees.

roundlimit

roundlimit "0": Enables a roundbased gameplay. The match will end after X rounds were played no matter if there is a winner or not. However, if fraglimit is enabled, the game can also end if either of the teams reaches the fraglimit.
This is only available if
sv_matchmode is set.

sv_activeClients

sv_activeClients: Informative cvar that holds the number of non-spectators players that are currently in the server. Very useful for writing conditional rotations, see the Rotation System documentation for further information.

sv_bans

sv_bans "bans.txt": File name of the bans script of this server. If it exists, it enables the /rcon ban server commands, and its used as the input and output file for the Bans System.
Use an empty string to disable bans.

sv_chatProtection

sv_chatProtection "0": Enables the chat protection after someone chatted for X or more seconds. Setting this to 1 means that it can be abused! One can start chatting to avoid being killed.

sv_config

sv_config "conf/default.cfg": Holds the name of the current config file. It can also be used to change the config at the end of the map. For more information, refer to the Configuration System documentation.

sv_crontab

sv_crontab "crontab.txt": File name of the crontab script of the server. For a detailed information on the format of this file, refer to the Crontab documentation.
Use an empty string to disable crontab.

sv_floodProtect

sv_floodProtect "1": Enables flood protection on the server, which limits the number of commands a client can send to a server (most noticeably chats) in a second to the value of X. If this cvar is enabled, sv_floodProtect should be disabled.

sv_holyshit

sv_holyshit "0": If enabled you will hear the "holyshit" sound when you kill an enemy with a direct BFG hit.

sv_improvePrediction

sv_improvePrediction "1": Tries to send information of enemies earlier to the client, reducing the problem with enemies suddenly appearing out of nowhere, easily noticeable when you are playing with high pings.

sv_inactivitySpectator

sv_inactivitySpectator "180": This one sets you automatically /away after X seconds of idle. If you join the game you will get your old score back.

sv_legacy

sv_legacy "3": Bitmask to control support for older Q3PLUS versions in the server. Available flags:

* 0 - Disable legacy support

* 1 - Enable legacy version support

* 2 - Spam legacy clients with console upgrade messages every 5 min

* 4 - Spam legacy clients with centerprint upgrade messages every 5 min

sv_maps

sv_maps "servermaps.txt": When you set servermaps.txt as available maps on server (maplist) that will be printed to clients when they connect to the server, or when the client explicitly requests it with the /maps client command.

sv_matchmode

sv_matchmode "0": This enables the "match mode". It will enable the following client commands: /lock, /unlock, /joinword, /invite, /timeout, /ready, /notready, /teamready. Values:

* 1 - Simple Matchmode. Will just enable the matchmode commands.

* 2 - Will enable the roundlimit, with the possibility to have warmup between each rounds if enabled by config.

* 3 - Will enable roundbased gameplay. After each round you will see the scoreboard.

sv_maxMVD

sv_maxMVD "0": Number of public simultaneous multiview demo recorders in the server. A value of 0 means disabled, so only referees can record multiview demos.

sv_muteSpectators

sv_muteSpectators "0": Allows you to mute all spectators. They still can talk with other spectators but the in-game players won't see it. Referees are not affected by this setting.

sv_noCustomEnts

sv_noCustomEnts "0": Disables map modification scripts located inside the /maps directory, both .add and .ents files. For more information, refer to the Map Modification documentation.

sv_physics

sv_physics "0": Enable custom physics and movement control. Refer to the Configuration System documentation for a detailed description for the possible values of this bitmask.

sv_referee

sv_referee "k,kick,mute,unmute,s,status,w,whois": Additional commands the referees can use.
Note, however, that the following are commands that the referee can always execute and can't be disabled:

capturelimit
forcejoin
forceteam
fraglimit
g_doWarmup
g_friendlyFire
g_gametype
g_warmup
lock
map
map_restart
nextmap
ready
roundlimit
timein
timelimit
timeout
unlock
sv_matchmode
sv_suddenDeath

sv_rotateStep

sv_rotateStep "1": Default value of the /rcon rotate command, which accounts for number of maps to "jump" to when rotating the map. Requires a working rotation, and it can be used as the base for random rotations. Refer to the Rotation System documentation for further information.

sv_rotation

sv_rotation "": Server rotation script, an empty value disables rotation and falls back to the default quake rotation. For detailed information on the rotation file syntax, refer to the Rotation System documentation.

sv_solids

sv_solids "0": Modifies the player interaction with other entities on the server. For a detailed description of this cvar, refer to the Configuration System documentation.

sv_spawnSystem

sv_spawnSystem "3": Bitmask that controls player spawning system. Available flags are:

* 1 - Try to avoid spawn points close to enemy players.

* 2 - Try to avoid spawn points close to place of death.

sv_suddenDeath

sv_suddenDeath "0": Disables or enables sudden death. Sudden death is enforced if the time is over and there is no clear winner.

sv_teamBalance

sv_teamBalance "1": This will try to even out the teams after a match is over so the next game can be fair again if good players left a team, etc.

sv_unlagged

sv_unlagged "1": Enables the unlagged technology. It can be set separately for each weapon, see the Configuration System documentation for further information.

sv_userdb

sv_userdb "1": Enables the user aliases database and enables the following server commands: /rcon whois and /rcon w.

sv_validTLD

sv_validTLD "0": Don't allow the users to modify the value of their cg_country cvar, effectively disallowing faked country locations.

sv_vote

sv_vote "conf,map_restart,nextmap,map,..": This is the /callvote list. Add or remove commands you want and separate them with a "," or a ";". An empty string disables voting, but the recommended method for disabling callvoting is to disable the g_allowVote server cvar.

sv_voteconf

sv_voteconf "voteconf.txt": File name of the config voting script, which holds the names and descriptions of the allowed configs for voting when sv_vote has the conf string on it, see the Configuration System documentation for further information.

sv_voteTime

sv_voteTime "30": Adjustable vote time.

sv_warmupRespawn

sv_warmupRespawn "3": Bitmask to controls what is respawned at the end of warmup time. For the possible flags, see the Configuration System documentation.

xp_version

xp_version: Holds the version of the Q3PLUS mod. Additionally, since it is a server info cvar, it has the filename of the current config, its name and the MD5 of it.

xp_date

xp_date: Server info cvar that holds the server binary build date, used to know if a server is fully updated.

‎‎

Command list

ban

/rcon ban <id|expresion> [<reason>], alias /rcon b: This command will add a ban to the bans.txt. You can use wildcard matches to ban whole list of players and additionally give a reason for the ban.
By default, this command bans a player by name, IP and GUID with a single call. However, if you just want to ban an user for a single one of them, you can use
/rcon banname, /rcon banip or /rcon banguid respectively, all of which share the same syntax as /rcon ban.


Examples:

/rcon ban 2
/rcon ban "A*" "guys with a starting 'A' are out!"

centerprint, cp

/rcon centerprint <message>, alias /rcon cp: This lets you display a big message to the screen of all players. Clients can disable printing of this messages by disabling cg_centerTime.

cmd2

/rcon cmd2 <cvarname> [<arg1> ...: Executes the string contained in the cvar specified with all the occurrences of $(X) (where X is a number) replaced with the passed parameters, which effectively allows you to simulate custom "commands".

Additionally, any server command of the form /rcon =cvarname [...] will be expanded to /rcon cmd2 cvarname [...] on execution.

Example:

// first put the command in the cvar, the following will
// modify sv_pure to the first parameter and restart the map right after
/rcon set set_pure "sv_pure $(1); map_restart"

// now execute the custom "command"
/rcon cmd2 set_pure 1
// which is the same as
/rcon =set_pure 1

// add the "command" to the referee commands
/rcon sv_referee "=set_pure"
// now execute it with /ref
/ref =set_pure 1

// now add it to vote commands
/rcon sv_vote "=set_pure"
// now you can /callvote it
/callvote =set_pure 1

execstr

/rcon execstr <command>: Executes the given command with every occurrence of $(cvarname) replaced with the value of the given cvar, for example:

// displays a message with number of playing clients
/rcon execstr say ^5There are currently $(sv_activeClients) active clients on the server!

// displays the name of the host to clients
/rcon execstr say ^5You are playing on $(sv_hostname)!

// adds kick to list of referee commands
/rcon execstr set sv_referee kick,$(sv_referee)

forcejoin

/rcon forcejoin <id|name> <"red"|"blue"|"none">: When teams are locked, use this command to invite a player to spectate the given team, and also to be able to join later. If, however, "none" is passed as the team name, it will remove him from any team he was already invited.
This is only available if
sv_matchmode is set.

forceteam

/rcon forceteam <id|expression|"all"|"allbots"> <"free"|"red"|"blue"|"spec"|"away">: Forces a client to join an specific team. You can use wildcards to match group of clients, or also the keywords "allbots" and "all". If the team you want to set for a client is locked, the client must be already invited to it. If he's not, use /rcon forcejoin on the client first.

ipdb

/rcon ipdb <ip_address>: This is just a raw access to the IP-to-Country database. Can be used to check the origin of IP addresses.

kick2, k

/rcon kick2 <id|expresion|"all"|"allbots"> [<reason>], alias /rcon k: This is an advanced /rcon kick and /rcon clientkick in one command. You can use wildcard matches to kick a whole list of players and additionally give a reason for the kick.

Examples:

/rcon k 2
/rcon k "A*" "guys with a starting 'A' are out!"
/rcon k all "I want to empty my server!"
/rcon k allbots

load

/rcon load <config>: Loads a specific configuration. Read the Configuration System documentation for further information. Example: /rcon load q3plus.

lock

/rcon lock <"red"|"blue"|"all">: Locks the specified team with a random generated password (or both if "all" is used), so clients can't join the team nor spectate its members, and also to lock it's free-fly view, unless the players explicitly /invite him.
This is only available if sv_matchmode is set.

maps

/rcon maps <id|"all"> [<maps_file>]: Displays the contents of the specified file (or the one in the sv_maps cvar if omitted) as a maps command for the specified client (or to everyone is "all" is used).

mute

/rcon mute <id|name>: Mutes the given player. A muted player will not be able to chat with other players, except by using private messages (/tell).

rotate

/rcon rotate <step|"restart">: Manual rotating command, if no argument is supplied it will use sv_rotateStep as its value. If instead "restart" is passed, it will rotate to the first map of the rotation. Read the Rotation System documentation for further details.
Server admins should be used to /rcon vstr nextmap to rotate maps. However this does not work for the new rotation system!
You have to use /rcon rotate instead, this also works for old rotation. In general just use /rcon rotate instead of /rcon vstr nextmap in Q3PLUS.

says

/rcon says <message>: Broadcast a message to all players. The message will be prepended with "server:", instead of "console:" for /rcon say, which is handled by the engine. Now since miss-typed commands are only echoed back to the rcon user, he must explicitely use /rcon say or /rcon says to communicate with players.

status2, s

/rcon status2, alias /rcon s: This is an advanced /rcon status and will show you the ID, IP address and GUID of the players on the server.

timein, ready

/rcon timein, alias /rcon ready: Ends the current taken timeout by setting all clients to ready status.

timeout

/rcon timeout: Timeouts the game for either 120 seconds (team gametypes) or 60 seconds (tournament). To end the timeout, the clients can use /ready or /teamready.

unlock

/rcon unlock <"red"|"blue"|"all">: Unlocks a previously locked team, or both if "all" is used.

unmute

/rcon unmute <id|name>: Allows a muted player to chat again.

vote

/rcon vote <"yes"|"no">: Forces a vote to either pass through ("yes") or to fail ("no").

w

/rcon w: Queries the user aliases database (userdb) and lists the top 3 aliases for all the current players of the server. Please note that the userdb uses client GUIDs as the identifier for the client, so if the client changes his CD key then the aliases won't be found.
This is only available if
sv_userdb is set.

whois, who

/rcon whois <id>, alias /rcon who: Queries the user aliases database (userdb) and lists the top 10 aliases used by the client being queried.
This is only available if
sv_userdb is set.

‎‎

Server-Side Only

Q3PLUS is fully compatible to be played without any client-side modifications.
That also means that your server will be more popular and filled with new gamers because they don't need to download anything to play on a Q3PLUS server.

Use the /players command to see who is playing with/without the client-side modification: players without the mod are marked with a red asterisk, and even further, players with older Q3PLUS versions are marked with a yellow asterisk.

But nevertheless it's very recommended to play it with the client-side modifications, specially on servers that use non-baseq3 physics or modified weapons times, so the settings can be predicted properly and the gaming experience is better. Additionally, the client modifications include several useful features of its own.

‎‎