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
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.
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.
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.
▪HOW THE PIECES FIT
Worth understanding before you change anything, because it explains why some edits take effect instantly and others need a restart.
| LAYER | WHAT 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 1so people who lack your maps and mod can join anyway. Addsv_pure 1if 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
▪RUNNING THE SERVER
| COMMAND | WHAT IT DOES |
|---|---|
| map <name> | Load a map. Ends the current game. |
| devmap <name> | Same, but with cheats enabled. Local testing only. |
| map_restart | Restart the current map without reloading it. Keeps everyone connected. |
| status | Connected 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. |
| quit | Shut 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.
| COMMAND | WHAT 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. |
| ref | Log in as referee, so you can run match commands without full rcon access. |
| lock / unlock | Stop teams being joined, or allow it again. |
| pause timeout / timein | Freeze and resume the match. |
| mute / unmute | Silence 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. |
| teamBalance | Even the teams up. |
| startrecord startmvd / stopmvd | Server side demo recording, including multi view demos. |
| ready / notready teamready | Match readiness during warmup. |
| motd | Show 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.
| COMMAND | WHAT 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. |
| wait | Pause 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"
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
| SWITCH | WHAT 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 1 | LAN server. |
| +set dedicated 2 | Internet 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.
| COMMAND | WHAT IT DOES |
|---|---|
| give all give weapons give <item> | Hand yourself equipment. |
| noclip | Fly through walls. |
| god notarget | Invulnerable, or invisible to bots. notarget
is the one for watching bot behavior without being attacked. |
| viewpos | Print 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.2 | Slow motion. Excellent for watching what a projectile actually does. |
▪RECORDING AND CAPTURE
| COMMAND | WHAT 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
| CVAR | WHAT IT DOES |
|---|---|
| sv_hostname | Name in the server browser. |
| sv_maxclients | Player slots. Bots occupy them too. |
| g_password | Set 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_pure | 1 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_dlURL | An HTTP address to download from instead of trickling files through the game protocol. Vastly faster. |
| com_hunkMegs | Memory 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 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.
| FILE | WHAT 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:
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.
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:
| CHARACTERISTIC | EFFECT |
|---|---|
| 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.
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.
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.
▪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. Undersv_pure 0a client only fetches what the server actually touched.
▪ADDING A BOT, START TO FINISH
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.
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.
A new block in a .bot file in scripts\,
with name, model and aifile.
rcon addbot Wraith 4
Not map_restart, and not kick and re-add. A full server
restart, because of the caching.
▪CVARS WORTH KNOWING
| CVAR | EFFECT |
|---|---|
| bot_enable 1 | Must be set before the first map loads. Not something you can flip on a running server. |
| g_spSkill 1-5 | Skill of auto filled bots, and of addbot
calls that give no number. |
| bot_minplayers | Auto fill target. 0 is off. |
| bot_nochat 1 | Silences 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 1 | They chat far more often. Useful for testing, exhausting to play with. |
| bot_thinktime | Milliseconds between decisions. Lower is sharper. |
| bot_challenge 1 | More aggressive play at the same skill number. |
| g_botsFile | Load the roster from a path of your choosing instead of
scripts/bots.txt. |
▪WHEN IT GOES WRONG
| CONSOLE SAYS | WHAT 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.
rcon load chaos and the entire weapon set changes
under everyone's feet mid fight.▪WHERE THINGS LIVE
| PATH | WHAT IT IS |
|---|---|
| excessiveplus\conf\*.cfg | The modes. One file each. |
| excessiveplus\conf\default.cfg | id'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.cfg | A shorter annotated starting point. |
| excessiveplus\*.txt | Map 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.
| KEY | WHAT IT DOES |
|---|---|
| Damage | Health removed. |
| Knockback | How 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 Knockback | Recoil. Pushes you when you pull the trigger, even on a total miss. |
| Team Knockback | A 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
| KEY | WHAT IT DOES |
|---|---|
| Cycle | Milliseconds between shots, so the fire rate. Rocket Launcher ships at 800, Machinegun at 100. |
| Spread | Inaccuracy cone. Shotgun ships at 700, Machinegun at 200. |
| Pellet Count | Shotgun 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. |
| Speed | Projectile travel speed. Rockets are 900. |
| Range | Lightning Gun reach. |
| Max Hits | Railgun 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. |
| Regen | Ammo 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.
| FLAG | EFFECT |
|---|---|
| WPS_RAILTRAIL | Draws 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_GUIDED | Steer the rocket with your mouse after firing. |
| WPS_ROCKET_HOMING | Rockets chase people. Pair it with
Homing Factor. |
| WPS_GRENADE_STICKY | Grenades stick where they land, so mines. |
| WPS_PLASMA_SPLIT | Three plasma streams instead of one. |
| WPS_GRAPPLE_ROPE | Swing 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. |
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.
| KEY | WHAT IT DOES |
|---|---|
| Start Weapons | What you spawn holding. WP_ALL,
WP_NONE, or a list joined with |. |
| Start Weapon | Which one is actually in your hands on spawn. |
| Weapons | Which 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_gravity | 800 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_physics | Movement flags: PHYSICS_RAMP_JUMPS,
PHYSICS_DOUBLE_JUMPS, PHYSICS_AIR_STEPS,
PHYSICS_QUAKE_LIVE, PHYSICS_STEP_JUMPS. |
| DM Flags | DM_INFINITE_AMMO,
DM_NO_SELF_DAMAGE, DM_NO_FALLING_DAMAGE,
DM_DROP_WEAPONS, DM_TELEPORT_SPEED,
DM_VOID_RESPAWN. |
| Spawn Protection | Seconds of invulnerability after respawning. |
| Flight Factor Floating Speed Rate | Flying speed, and how smoothly velocity changes while airborne. |
| Anti Camp | Punishes 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.
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;
}
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;
}
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;
}
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
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.
One value at a time. Weapon feel is extremely sensitive, and two changes at once tells you nothing about which one did what.
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.
q3dm6 {
$xp_config = "yourname";
$timelimit = 15;
}▪WHEN IT GOES WRONG
| SYMPTOM | CAUSE |
|---|---|
Nothing changed afterrcon 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.