Nothing on these pages is needed to play. This is the back of the machine: how a Quake 3 server is driven from the console, how its bots are built, and how Excessive Plus lets you rewrite every weapon in the game from a text file.

It is all configuration. No compiler, no source code, no build step. Quake 3 shipped in 1999 with an unusual amount of itself left in plain text, and most of that is still sitting in the pk3 files waiting to be edited.

THE SECTIONS

CONSOLE AND COMMANDS

Opening a console, running a server from it, and doing the same remotely with rcon. Config file syntax, command line switches, voting, demo recording, and the cheat commands that only work on a local test map.

Open the command reference

BOT CONFIGURATION

Every part of a bot is a text file: how it aims, whether it walks or strafe jumps, what it picks up, what it says when it kills you, and what it says back when you type at it. Covers the roster, the personality characteristics, both chat systems, models and skins, and the caching rule that catches everybody out.

Open the bot reference

WEAPON CONFIGURATION

Excessive Plus replaces Quake's hardcoded weapon numbers with an editable format, and reloads it live without restarting anything. Damage separated from knockback, weapons that make you slow, projectiles that chase people, and four complete example modes you can paste and run.

Open the weapon reference

HOW THE PIECES FIT

Worth understanding before you change anything, because it explains why some edits take effect instantly and others need a restart.

LAYERWHAT IT IS
The engine ioquake3 or similar. Networking, rendering, the file system, the console. Knows nothing about weapons or rules.
The game module qagame, inside the mod's pk3. This is what Excessive Plus replaces. It owns the rules, so commands like addbot do not exist until a map is running and the module has loaded.
pk3 files Renamed zip archives. Maps, models, sounds, and the bot files. The mod folder is searched before baseq3, so a file you put there shadows the one inside a pk3 without modifying it.
Config files Plain text, executed as console commands. Loaded at startup or on demand.
Bot files Parsed once at server start and then cached. This is why bot edits need a full restart while weapon configs do not.

A SENSIBLE ORDER TO WORK IN

If you are setting a server up from nothing, roughly this:

  • Get a dedicated server running on a map, locally, before anything else.
  • Set sv_allowDownload 1 so people who lack your maps and mod can join anyway. Add sv_pure 1 if you want custom skins and models to reach them too.
  • Get one other person connecting from outside your network. Do this early. Port forwarding and firewalls are the single most common reason a server nobody can join looks perfectly healthy from the inside.
  • Then start changing rules. Weapon configs first, since they reload live and give instant feedback.
  • Bots last. They are the slowest loop to iterate on, because every change means a restart.

Everything Quake 3 can do, it does through the console. The menus are a thin shell over the same commands. Learn the console and you can drive a server without ever opening a menu again.

OPENING A CONSOLE

~, the key left of 1. On many non US keyboard layouts that key does not produce a tilde and nothing happens. ioquake3 has a fix:

seta cl_consoleKeys "~ ` 0x7e 0x60 F1"

That cvar is a separate list from your normal binds, and it is what the engine checks while the console is open. This matters: a plain bind F1 "toggleconsole" will open the console and then be unable to close it, because once the console has focus your binds are not being read at all. Put the key in cl_consoleKeys and it works both ways.

A dedicated server has no window to press keys in. It reads typed commands directly, with no leading slash and no console to open.

RCON, DRIVING A SERVER REMOTELY

rcon sends a console command to a server you are connected to. Set a password on the server:

seta rconpassword "something long"

Then from your client, once connected, tell it the same password and prefix commands with rcon:

/rconpassword something long
/rcon status
/rcon map q3dm6
RCON IS PLAINTEXT. Quake 3 sends the password over UDP unencrypted, and anyone can fire guesses at the port. A short or dictionary password is found in seconds, and whoever finds it can run any server command. Use a long random one, and never reuse it anywhere else.

RUNNING THE SERVER

COMMANDWHAT IT DOES
map <name>Load a map. Ends the current game.
devmap <name>Same, but with cheats enabled. Local testing only.
map_restartRestart the current map without reloading it. Keeps everyone connected.
statusConnected players with their client numbers, ping and address. The number is what most other commands want.
serverinfo
systeminfo
Cvars the server is advertising.
dumpuser <name>One player's settings, as their client reports them.
kick <name>Remove a player by name.
clientkick <num>By client number. Safer, since names can contain color codes and spaces.
kick all
kick allbots
Everyone, or every bot.
addbot <name> <skill>
<team> <delay>
Add one bot. Skill 1 to 5, delay in milliseconds. Only works once a map is running, because it belongs to the game module rather than the engine.
say <text>
tell <num> <text>
Chat as the server, or to one player.
cp <text>Print in the center of everyone's screen.
quitShut the server down.

EXCESSIVE PLUS EXTRAS

Commands the mod adds on top. Most work as /rcon commands, as referee commands, or as votes, depending on how the server is configured.

COMMANDWHAT IT DOES
load <config>Swap the entire gameplay config live, mid match. No restart, no map change. The single most useful command the mod adds.
refLog in as referee, so you can run match commands without full rcon access.
lock / unlockStop teams being joined, or allow it again.
pause
timeout / timein
Freeze and resume the match.
mute / unmuteSilence one player's chat.
ban <id or name>Ban, with an optional reason.
forcejoin
forceteam
Move players between teams. Accepts wildcards, plus all and allbots.
teamBalanceEven the teams up.
startrecord
startmvd / stopmvd
Server side demo recording, including multi view demos.
ready / notready
teamready
Match readiness during warmup.
motdShow the message of the day.

VOTING

Players call votes with /callvote. Stock Quake allows a fixed handful. Excessive Plus reads a vote definition file instead, so you decide exactly what can be voted on and what arguments are allowed:

seta xp_vote "callvote.txt"
seta g_allowVote "1"

Typical votes once that file is enabled:

/callvote map q3dm6
/callvote config instagib
/callvote gametype tdm
/callvote timelimit 15
/callvote restart
/callvote nextmap

The vote file can restrict arguments per command, so config only accepts configs that actually exist on the server. That is worth having: an unrestricted vote command is a way for players to break your server by accident.

CONFIG FILE SYNTAX

A config file is a list of console commands, one per line, executed in order. // starts a comment.

COMMANDWHAT IT DOES
set <cvar> <value>Set a variable for this session.
seta <cvar> <value>Set it and mark it archived, so it is written back to the config file on exit. Use this for anything you want to persist.
sets <cvar> <value>Set it and advertise it in serverinfo, where anyone browsing can read it.
exec <file.cfg>Run another config file.
bind <key> "<command>"Bind a key. Chain commands with ; inside the quotes.
unbind <key>
bindlist
Remove one, or list them all.
toggle <cvar>Flip between 0 and 1.
vstr <cvar>Execute the contents of a cvar as a command. This is how people build toggles and cycles out of nothing but variables.
waitPause one frame. Occasionally needed between commands in a bind.
echo <text>Print to your own console. Useful for checking a config actually ran.

A cycle built with vstr, since it is not obvious the first time you see it:

set fov1 "set cg_fov 90;  set fovtoggle vstr fov2"
set fov2 "set cg_fov 110; set fovtoggle vstr fov1"
set fovtoggle "vstr fov1"
bind F5 "vstr fovtoggle"
ORDER MATTERS MORE THAN YOU EXPECT. A map command loads the map immediately, right there in the middle of your config. Anything after it runs against a live game, and anything before it runs against an empty one. Settings that must be read at map load, such as sv_allowDownload or bot_enable, have to appear before the map line. Commands that need a running game, such as addbot, have to appear after it. A setting in the wrong half fails silently, which makes it a horrible thing to debug.

THE COMMAND LINE

ioq3ded.x86_64.exe +set dedicated 2 +set com_hunkMegs 512 +exec server.cfg
SWITCHWHAT IT DOES
+set <cvar> <value>Set a cvar before anything else loads. The only way to set variables the engine reads at startup.
+exec <file>Run a config once started.
+set dedicated 1LAN server.
+set dedicated 2Internet server, reports to the master list.
+set fs_game <mod>Run a mod folder.
+set net_port <n>Listen on a specific port. 27960 is the default.
+connect <addr>Client only. Join a server on launch.

TESTING WITH CHEATS

These need sv_cheats 1, which is why you start a test map with devmap rather than map. They are invaluable when checking a weapon config or hunting for coordinates.

COMMANDWHAT IT DOES
give all
give weapons
give <item>
Hand yourself equipment.
noclipFly through walls.
god
notarget
Invulnerable, or invisible to bots. notarget is the one for watching bot behavior without being attacked.
viewposPrint your exact position and facing angle. This is how you get coordinates for placing anything in a map.
r_showtris 1
r_speeds 1
Wireframe and rendering statistics.
timescale 0.2Slow motion. Excellent for watching what a projectile actually does.

RECORDING AND CAPTURE

COMMANDWHAT IT DOES
record <name>
stoprecord
Record a demo from your own point of view.
demo <name>Play one back.
screenshot
screenshotJPEG
Save an image.
condump <file.txt>Write the whole console scrollback to a file. The right way to capture an error, instead of photographing the screen.

CVARS WORTH KNOWING

CVARWHAT IT DOES
sv_hostnameName in the server browser.
sv_maxclientsPlayer slots. Bots occupy them too.
g_passwordSet it and only people who know it can join.
sv_allowDownload
cl_allowDownload
Both must be 1 for a client to fetch maps and mods it does not have.
sv_pure1 makes the server send its full pk3 list, which is what pushes custom skins and models to clients. It can also refuse players carrying unrelated custom pk3s.
sv_dlURLAn HTTP address to download from instead of trickling files through the game protocol. Vastly faster.
com_hunkMegsMemory for maps and models. Large custom maps fail to load without a generous value. If you see Hunk_Alloc failed on a small allocation, the hunk is full rather than the request being large.
rate
snaps
cl_maxpackets
Client networking. Worth raising from 1999 defaults on a modern connection.
cg_drawFPS 1
cg_lagometer 1
Frame rate and connection quality on screen.
sensitivity
cg_fov
Mouse speed and field of view. 90 is stock, most players prefer more.

Type cvarlist or cmdlist in any console for the complete list. Both accept a prefix, so cvarlist sv_ narrows it to server variables. That is faster than searching the internet for a cvar you half remember.

Quake 3's bots are not a black box. Every part of one, how it moves, what it picks up, how it talks, what it looks like, is a plain text file the game reads at startup. Nothing here needs a compiler and nothing here needs the source code. This page covers the whole set, in the order you would actually touch them.

THE ONE RULE. The bot library parses every file on this page once, at server start, and caches the result. Editing a file and then kicking and re-adding the bot changes nothing at all, because you get the cached copy back. Every change on this page needs a full server restart. This wastes more admin time than anything else about Quake 3 bots.

THE FILES

Paths below are relative to your mod folder, or to baseq3 if you are not running a mod. The mod folder is searched first, so anything you put there shadows or adds to what shipped in the pk3s.

FILEWHAT IT CONTROLS
scripts\bots.txt The roster. Which bots exist at all. Yours shadows the one inside pak0.
scripts\anything.bot Extra roster entries, added on top of bots.txt instead of replacing it.
botfiles\bots\<name>_c.c Personality. Aim, aggression, movement, item taste, chattiness.
botfiles\bots\<name>_t.c What it says on game events, such as kills, deaths, joining and map end.
botfiles\bots\<name>_w.c
botfiles\bots\<name>_i.c
Weapon preference and item preference. Which gun it reaches for, what it detours to pick up.
botfiles\rchat.c What bots say back when a player types. One file, shared by every bot.

THE ROSTER

The game reads scripts/bots.txt, then also scans scripts/ for any file ending in .bot and adds those on top. That second part is the useful one. A .bot file is purely additive, so you never have to copy or edit id's list to add your own bots.

{
name    Wraith                           // what you type after addbot
funname ^0W^0r^0a^0i^0t^0h               // scoreboard name, color codes ^0 to ^7
model   bones/black                      // model/skin, head follows automatically
aifile  bots/wraith_c.c                  // the personality file
}

Color codes run ^0 to ^7 only: black, red, green, yellow, blue, cyan, magenta, white. ^8 and ^9 do not exist and print as literal text on the scoreboard.

WHICH BOTS ACTUALLY SHOW UP

There is no cvar for "use these bots". bot_minplayers fills empty slots by picking at random from the entire roster, and gives you no say in which. With 30-odd bots registered, the three you carefully built will rarely be the three that appear.

Two ways around it, and they are opposites:

ANAME THEM YOURSELF

Set bot_minplayers 0 and add them explicitly from a config file:

addbot Wraith  4 free 0
addbot Vandal  4 free 1500
addbot Sable   4 free 3000

Arguments are name, skill 1-5, team, delay in ms. Staggered delays stop them all landing on the same frame.

That config must run after a map is loaded. addbot belongs to the game module and does not exist until a map is actually running, so put the exec line below your map line, not above it.

Cost: a kicked bot stays kicked and slots never refill on their own.

BSHRINK THE ROSTER

Put your own scripts/bots.txt in the mod folder. It shadows pak0's, so only what you list plus your .bot files exist. Random fill then has nothing else to pick.

Cost: addbot sarge and every other stock name stops working, because those bots are no longer registered. Delete your file and they come back.

PERSONALITY, THE _c.c FILE

Each character file holds several skill blocks, and the game loads the one matching g_spSkill. Stock files define 1, 4 and 5. If your server runs a skill number with no matching block, the bot falls back to defaults and everything you tuned is ignored, silently.

Values run 0.0 to 1.0 unless noted. The ones that genuinely change how a bot feels to play against:

CHARACTERISTICEFFECT
AIM_SKILL
AIM_ACCURACY
How well it shoots. These two are what people mean by "difficulty".
REACTIONTIME Seconds before it responds to seeing you. Higher is slower and more human.
WALKER 1.0 means it never runs. Kills the strafe jumping that makes bots read as machines. The single most atmospheric value in the file.
CAMPER How much it sits still. Handle with care. High values send bots to camp spots stored in the map's AAS data, and some maps have spots baked inside solid geometry. A bot sent to one becomes stuck and unkillable. Keep it below about 0.4 on unfamiliar maps.
SELFPRESERVATION 0.0 means it never breaks off and never runs for health. Relentless.
AGGRESSION
ALERTNESS
Willingness to start a fight, and how fast it notices one.
ATTACK_SKILL Combat movement quality: circle strafing, dodging, keeping distance.
JUMPER
WEAPONJUMPING
How much it jumps around, and whether it rocket jumps.
CROUCHER How often it ducks. Keep it small or it looks broken.
CHAT_FILE
CHAT_NAME
Which _t.c to read, and which chat "name" block inside it. CHAT_NAME is a lookup key, not a label. Point it at a block that does not exist and the bot fails to load.
CHAT_CPM Typing speed in characters per minute. Sets the pause before a line appears. Low feels deliberate, high feels frantic.
CHAT_REPLY
CHAT_RANDOM
CHAT_MISC
How often it answers a player, speaks unprompted, and chats in general.

Edit every skill block, not just one. It is easy to change skill 5 and then wonder why nothing happened on a server running skill 4.

WHAT THEY SAY

Two separate systems. Confusing them wastes an evening.

1EVENT LINES, ONE FILE PER BOT

botfiles\bots\<name>_t.c fires on things that happen: a kill, a death, joining, the map ending, or a timer. One file per bot, so this is where an individual voice lives. There are 28 event types, from kill_rail to death_drown.

type "kill_insult"
{
	"look up";
	"same corner";
	"ur loud";
}

The random_misc block is unprompted small talk on a timer, its rate set by CHARACTERISTIC_CHAT_RANDOM. There is a fully commented example_t.c inside pak4 listing every type and which player names each one can substitute.

2REPLIES, SHARED BY EVERYONE

botfiles\rchat.c fires when a player types something. Quake loads one reply file for the whole server. There is no per bot version, so every bot answers questions in the same voice. Keep that text personality neutral and let the event lines carry the characters.

["lag", "lagging", "ping"] = 9
{
	"yeah its bad";
	"my ping is awful";
	"i thought it was me";
}

Keywords are substrings, matched anywhere in the message, and any one of them matching is enough. Prefix a keyword with ! to block the rule instead. The number is priority: the highest eligible rule wins, then one of its lines is picked at random.

There is also a capture form, which is what makes a reply feel like it landed:

[("do you like ", 0)] = 8
{
	0, " is alright";
	"never tried it";
}

Variable 0 holds whatever the player typed after the prefix. It only works inside the parenthesised form. None of the 455 original rules use it in a plain keyword list, and doing so produces nothing.

WHAT THIS IS NOT. There is no language model here. It matches substrings against a table written in 1999. No memory of what it said, no tracking of the topic, no understanding of the question. It holds up convincingly for a while and then answers something plainly wrong, and no amount of configuration fixes that. The realistic goal is a room that does not feel empty.

MODELS AND SKINS

Written as model/skin, for example bones/black. The head follows the body skin automatically, so no separate headmodel line is needed. Write just bones and you get the default skin.

Anything you reference must exist on every client. A skin the player does not have shows as a default model on their screen, not yours. Two things make that work:

  • Put skin pk3s in the mod folder, not baseq3. Baseq3 pk3s are only sent to clients when the current map needs them, and player skins never qualify.
  • Run sv_pure 1. That is what makes the server advertise its full pk3 list, including files it has not opened itself. Under sv_pure 0 a client only fetches what the server actually touched.

ADDING A BOT, START TO FINISH

1COPY A PERSONALITY

Copy an existing _c.c to botfiles\bots\yourname_c.c and change CHARACTERISTIC_NAME in every skill block. Do not start from an empty file. A missing characteristic is a load failure, not a default.

2GIVE IT A VOICE

Copy a _t.c, change the chat "name" at the top, and point CHARACTERISTIC_CHAT_FILE and CHAT_NAME at it. Or point at an existing file to borrow somebody else's voice.

3ADD TO THE ROSTER

A new block in a .bot file in scripts\, with name, model and aifile.

4TEST IT
rcon addbot Wraith 4
5RESTART AFTER EVERY EDIT

Not map_restart, and not kick and re-add. A full server restart, because of the caching.

CVARS WORTH KNOWING

CVAREFFECT
bot_enable 1Must be set before the first map loads. Not something you can flip on a running server.
g_spSkill 1-5Skill of auto filled bots, and of addbot calls that give no number.
bot_minplayersAuto fill target. 0 is off.
bot_nochat 1Silences every chat file on this page. Worth checking first when bots are mysteriously mute, because it hides all of that work at once.
bot_fastchat 1They chat far more often. Useful for testing, exhausting to play with.
bot_thinktimeMilliseconds between decisions. Lower is sharper.
bot_challenge 1More aggressive play at the same skill number.
g_botsFileLoad the roster from a path of your choosing instead of scripts/bots.txt.

WHEN IT GOES WRONG

CONSOLE SAYSWHAT IT MEANS
Bot 'Name' is not defined It is not in the roster. The game reads scripts/, not botfiles/. A roster file in the wrong folder is invisible.
couldn't find chat <name>
in bots/<file>_t.c
CHARACTERISTIC_CHAT_NAME is a lookup key into the chat file. It must match the chat "..." block inside it exactly.
loaded cached skill 5.000000 Your edit was never read. This is the caching. Restart the server.
camp spot at x y z in solid The map's AAS data has a camp spot inside geometry. Lower CHARACTERISTIC_CAMPER.
Bot shows as a
default model
The client does not have that skin. Check the pk3 is in the mod folder and that sv_pure is 1.
Bots never speak Check bot_nochat is 0, then check the chat characteristics are not all zero.

Excessive Plus replaces Quake 3's hardcoded weapon numbers with a text format you can rewrite and reload without restarting anything. Damage, knockback, fire rate, spread, projectile speed, visual effects, how heavy a gun makes you, what happens when you die, all of it is editable, and a whole new mode is one file.

THE BEST PART. Configs load live. No restart, no map change, no reconnect. Type rcon load chaos and the entire weapon set changes under everyone's feet mid fight.

WHERE THINGS LIVE

PATHWHAT IT IS
excessiveplus\conf\*.cfgThe modes. One file each.
excessiveplus\conf\default.cfgid's numbers written out in full. The reference for every key that exists, roughly 1300 heavily commented lines. Read it, do not edit it.
excessiveplus\conf\sample.cfgA shorter annotated starting point.
excessiveplus\*.txtMap rotations, with a config attached per map.

Three ways to load one:

rcon load chaos                    // live, right now
seta xp_config "chaos"             // at server start
q3dm6 { $xp_config = "chaos"; }    // per map, in a rotation file

ANATOMY OF A CONFIG

Config {
    Name = "Low Gravity";
    Version = "1";
    Author = "you";
}

Misc {
    // everything that is not one specific weapon
}

Rocket Launcher {
    Damage = 60;
    Splash Knockback = 400;
}

Weapon block names are the human ones: Gauntlet, Machinegun, Shotgun, Grenade Launcher, Rocket Launcher, Lightning Gun, Railgun, Plasma Gun, BFG, Grapple and Suicide.

Anything you leave out keeps its default. A config is a list of differences, not a complete description, so short files are normal and good. Three lines is a valid mode.

THE IDEA THAT MATTERS MOST

In stock Quake 3, how hard a weapon shoves you is tied to how much it hurts. Excessive Plus splits the two apart, and that single separation is where nearly every interesting mode comes from.

KEYWHAT IT DOES
DamageHealth removed.
KnockbackHow hard they get pushed. Defaults to Damage if you do not set it, which is why the two feel welded together in stock Quake.
Splash Damage
Splash Knockback
Radius
The same pair again for explosions, plus how far the blast reaches.
Self Damage
Self Knockback
What your own explosion does to you. This is the rocket jump dial.
Firing KnockbackRecoil. Pushes you when you pull the trigger, even on a total miss.
Team KnockbackA separate value for teammates.

Set Damage = 0 with a large Knockback and you get a weapon that cannot hurt anyone but throws them across the room. That alone is a game mode: no kills, win by shoving people into the void.

Set knockback negative and it pulls them toward you instead:

Machinegun {
    Damage = 5;
    Knockback = -180;    // a tractor beam
    Spread = 60;
}

FEEL AND TIMING

KEYWHAT IT DOES
CycleMilliseconds between shots, so the fire rate. Rocket Launcher ships at 800, Machinegun at 100.
SpreadInaccuracy cone. Shotgun ships at 700, Machinegun at 200.
Pellet CountShotgun only. 11 by default.
Fixed Pattern
Radial
Turns the random shotgun spread into a fixed one. Radial = yes; Pellet Count = 16; Fixed Pattern = 2 | PATTERN_TIGHT; reproduces CPMA's shotgun.
SpeedProjectile travel speed. Rockets are 900.
RangeLightning Gun reach.
Max HitsRailgun penetration, meaning how many people one slug passes through.
Bounce
Gravity
Time to Live
Projectile behavior. Bouncing rockets, plasma that falls, grenades that never expire.
RegenAmmo regenerates over time.
Ammo
Ammo Limit
Starting count and cap.

WEIGHT, GUNS THAT SLOW YOU DOWN

An underused one. Movement speed becomes player speed divided by weapon weight, so a heavy gun makes you slow while you are holding it.

BFG {
    Weight = 2.5;           // half speed while carrying it
    Firing Weight = 4.0;    // crawling while actually firing
}

That is an entire balance system on its own. Powerful weapons cost mobility instead of being rationed by ammo, which changes how people move around a map far more than damage numbers do. Firing Weight applies only during the shot.

STYLES, LOOKS AND BEHAVIOR

Style is a bitmask, combined with |. Some flags are purely cosmetic, others change what the weapon is.

FLAGEFFECT
WPS_RAILTRAILDraws a rail trail. Works on any weapon.
WPS_IMPACT_ROCKET
WPS_IMPACT_PLASMA
WPS_IMPACT_RAIL
WPS_IMPACT_BFG
Which explosion appears on hit, regardless of what fired it. A machinegun with rocket impacts.
WPS_ROCKET_GUIDEDSteer the rocket with your mouse after firing.
WPS_ROCKET_HOMINGRockets chase people. Pair it with Homing Factor.
WPS_GRENADE_STICKYGrenades stick where they land, so mines.
WPS_PLASMA_SPLITThree plasma streams instead of one.
WPS_GRAPPLE_ROPESwing on the hook instead of being reeled in.
WPS_BFG_PANTS
WPS_BFG_SOD
Two alternative BFG behaviors carried over from older mods.
Style = no;No effect at all. An invisible weapon.
THE LAG TRAP. WPS_RAILTRAIL generates one network event per pellet. Put it on a shotgun firing 14 pellets and you emit 14 events in a single frame, which blows past Quake 3's per snapshot event budget and stalls everyone on the server. Never put rail trails on multi pellet weapons. Use WPS_IMPACT_* instead, which costs almost nothing.

THE MISC BLOCK

Everything that is not one specific gun.

KEYWHAT IT DOES
Start WeaponsWhat you spawn holding. WP_ALL, WP_NONE, or a list joined with |.
Start WeaponWhich one is actually in your hands on spawn.
WeaponsWhich weapons exist as pickups in the map at all. WP_NONE strips the map bare.
Items
Ammos
The same idea for items and ammo boxes. IT_ALL, or a list such as IT_HEALTH_SMALL | IT_TELEPORTER.
Start Powerups
Start Powerups Duration
Spawn holding quad, flight, invisibility or regeneration. Duration in seconds.
Health
Health Soft Limit
Health Hard Limit
Spawn health, the point where it starts decaying, and the absolute ceiling.
$g_gravity800 is normal. Never use 0. Quake's movement code stops behaving and players drift with no way to steer. Around 260 gives a usable low gravity.
$xp_physicsMovement flags: PHYSICS_RAMP_JUMPS, PHYSICS_DOUBLE_JUMPS, PHYSICS_AIR_STEPS, PHYSICS_QUAKE_LIVE, PHYSICS_STEP_JUMPS.
DM FlagsDM_INFINITE_AMMO, DM_NO_SELF_DAMAGE, DM_NO_FALLING_DAMAGE, DM_DROP_WEAPONS, DM_TELEPORT_SPEED, DM_VOID_RESPAWN.
Spawn ProtectionSeconds of invulnerability after respawning.
Flight Factor
Floating Speed Rate
Flying speed, and how smoothly velocity changes while airborne.
Anti CampPunishes standing still.
Team Red { }
Team Blue { }
Nested blocks giving each team a different loadout. This is how asymmetric modes work, with two sides playing by different rules.

THE SUICIDE BLOCK

A weapon that fires when you die. Give it damage and a radius and every corpse explodes.

Suicide {
    Damage = 200;
    Knockback = 400;
    Radius = 250;
    Style = WPS_IMPACT_ROCKET;
}

WORKED EXAMPLES

Each of these is a complete, working config. They are short because a config only states differences.

1INSTAGIB

One shot rails and nothing else on the map.

Misc {
    Start Weapons = WP_RAILGUN | WP_GAUNTLET;
    Start Weapon  = WP_RAILGUN;
    Weapons = WP_NONE;          // no guns lying around
    Items   = IT_NONE;          // no armor, no health
    DM Flags = DM_INFINITE_AMMO;
}

Railgun {
    Damage = 1000;
    Cycle  = 1500;
}
2ADDING A WEAPON TO EVERY SPAWN

Give people the launcher from the start without touching anything else. Note that Start Weapons is a list, so include the gauntlet or they spawn unable to melee.

Misc {
    Start Weapons = WP_GAUNTLET | WP_MACHINEGUN | WP_ROCKET_LAUNCHER;
    Start Weapon  = WP_ROCKET_LAUNCHER;
}
3A GUN THAT ONLY MOVES PEOPLE

No damage anywhere, enormous knockback, no falling damage so the fall itself is the fun part rather than the punishment.

Misc {
    Start Weapons = WP_ALL;
    DM Flags = DM_INFINITE_AMMO | DM_NO_FALLING_DAMAGE;
}

Rocket Launcher {
    Damage = 0;
    Splash Damage = 0;
    Splash Knockback = 900;
    Radius = 250;
    Style = WPS_IMPACT_ROCKET;
}
4ASYMMETRIC TEAMS

Red gets one melee weapon, blue gets the arsenal. Nested team blocks override the outer Misc values for that team only.

Misc {
    Start Weapons = WP_MACHINEGUN;

    Team Red {
        Start Weapons  = WP_GAUNTLET;
        Start Powerups = PW_INVIS | PW_REGEN;
    }
    Team Blue {
        Start Weapons = WP_ALL;
    }
}

BUILDING YOUR OWN

1START FROM A NEIGHBOR

Copy whichever config is closest to what you want into conf\yourname.cfg. Do not start from default.cfg, which is 1300 lines when you only need the differences.

2CHANGE ONE THING

One value at a time. Weapon feel is extremely sensitive, and two changes at once tells you nothing about which one did what.

3LOAD IT LIVE
rcon load yourname

Changes apply immediately, mid game. A syntax error prints in the server console and the previous config stays loaded, so a broken file cannot take the server down.

4PUT IT IN ROTATION
q3dm6 {
	$xp_config = "yourname";
	$timelimit = 15;
}

WHEN IT GOES WRONG

SYMPTOMCAUSE
Nothing changed after
rcon load
A parse error. The console names the line. The previous config is still running.
Sudden lag whenever a
weapon fires
Per pellet events. Almost always WPS_RAILTRAIL on a shotgun.
Players drift and
cannot steer
$g_gravity at or near 0. Use 200 to 300 instead.
A weapon does
nothing at all
Damage and Knockback both 0, or the weapon appears in neither Start Weapons nor Weapons.
Spawning with no
melee attack
WP_GAUNTLET missing from Start Weapons. It is not implied.
Config not found It must sit in excessiveplus\conf\ and be loaded by name, with no .cfg on the end.

conf\default.cfg is the real documentation. Every key that exists is in there with a comment explaining it, including a good many not covered on this page.