============== =Mapping Help= ============== While I can't help you make a map, I can help you get it listed in the menu and working in the maplist. :p The central object is the .mapcfg file, but there's much more available. Table of Contents ----------------- I Map Lists & Scripts (get your map listed and working) i. mapcfg ii. mapname.cfg II Map Descriptions (get the picture and info to show) III Domination IV CTF V Rune Match Appendix A Advanced mapcfgs i. mapcfg revisited ii. exit cfgs Appendix B Helpful extras i. Team Colors ii. Text Colors ======================== =I. Map Lists & Scripts= ======================== There are actually 3 script/cfg options available to you, each serving a different purpose and being executed at a different time during the map's life cycle: 1. The mapcfg 2. mapname.cfg 3. exit cfg (explained in Appendix A) Of these, the mapcfg is the only one that's truely required. ----------------- -The mapcfg file- ----------------- *cue scary music* The mapcfg file is basically what gets your map listed in the menu, and sets up the options needed to change to it. This file is basically required in order for your map to work, though in a pinch you could say "map mymap" in the console. The simplest mapcfg is simply a changelevel command, but you should usually add a timelimit and/or fraglimit to make sure your map will eventually change to the next map in the list. As an example, let's say I make a map called "wazat1.bsp". As long as I'm fantasizing, I might as well say this map is so well done I'm actually willing to release it for friends, neighbors, fellow forum visitors and other people who like me to judge me by. Let's also assume that I want domination, deathmatch/team deathmatch and runematch to all be playable on my map. This is very easy. Let's start with domination. I should make a file called "dom_wazat1.mapcfg" (and put it inside of the maps directory) and write the following inside of it: set g_domination 1 // turn on domination set fraglimit 100 // 100 points to win set timelimit 15 // 15 minute max round time changelevel wazat1 // now change level Likewise, runematch is easy: filename: "rune_wazat1.mapcfg" set g_runematch 1 // turn on rune match set fraglimit 1000 // points to win set timelimit 25 // round time changelevel wazat1 // now change level At this point I should say "okay, now it gets hard", but deathmatch and team deathmatch are easy (I skipped the comments in this one since they're fairly self-explanatory): filename: "dm_wazat1.mapcfg" set fraglimit 40 set timelimit 15 changelevel wazat1 Team Deathmatch is turned on automatically if the server sets the "Force Teamplay" option and plays a deathmatch map, but you can add TDM as an option for your map too: set g_tdm 1 // play team deathmatch set fraglimit 50 // how many kills to win //set timelimit 25 // disabled: don't bother setting a time limit changelevel wazat1 // now change level There's much more power in a mapcfg file. See Appendix A for more details. ------------- -mapname.cfg- ------------- Unlike the mapcfg, which happens before the map loads (and is responsible for loading it), the mapname.cfg file doesn't exec until the map has mostly loaded. This file is *usually* used to set values such as what music to play. Another difference from the mapcfg file is that mapname.cfg is global, meaning it doesn't matter if you're playing domination, deathmatch, or capture the flag, and it doesn't care what mapcfg was loaded. It does the same thing every time this bsp file is loaded. For that reason, this file should usually be used sparingly. To make the mapname.cfg, make a file with the same name as your map's .bsp file, except with a .cfg extension instead of .bsp. For example, my "wazat1.bsp" map would use "wazat1.cfg". It uses the same name as your map, thus the term mapname.cfg. ====================== =II. Map Descriptions= ====================== So, you've got your map listed in the menu and it plays properly, but the menu isn't showing your description and picture! What manner of man would create such an accursed abomination?! Well... That sounds like something I'd do. :D Luckily getting this to work is easy. Just like you can have different mapcfgs for each map, you can have different descriptions. In fact, those descriptions now match up with the mapcfgs, instead of the bsp files. So, all you need to do is make a description for each mapcfg file. Simple copy-pasting will fulfil this need, though a bit of modification between versions is prefered. There is one crucial difference in this map's format. Like the old style, the first like is what appears in the title bar. However, the second line is the map's image file. This means you can have a separate image for each game mode your map supports, if you want: one for domination, one for ctf, one for regular dm, and so on. Or you can use the same image for all of them. So how to do this? Easy, just create a .txt file with the same name as the .mapcfg file. For example, my wazat1.bsp has 4 mapcfgs: dm_wazat1.mapcfg tdm_wazat1.mapcfg dom_wazat1.mapcfg rune_wazat1.mapcfg I would then make 4 .txt files: dm_wazat1.txt tdm_wazat1.txt dom_wazat1.txt rune_wazat1.txt Each of these files can have the same content, but I recommend you change at least a little bit of it (such as the title bar). Here is an example of what rune_wazat1.txt would look like (note that when you make your real file, you shouldn't tab it in): Wibble (rune_wazat1) maps/rune_wazat1 The only map I've ever done right! Players: 3-8 Weapons: Machinegun, Mortar, Crylink, Nex, Rocket Launcher, Hagar Powerups: None Gametype: Rune Match Author: Wazat Notice the first line has the map's title (Wibble... what was I thinking?), and the filename of the mapcfg for the user to see (which from the player's point of view is essentially the map's filename). The second line defines where the image is that should be displayed. This can be different for each game mode, but it doesn't have to be. Note that you need to provide the right path (maps/), but you don't need to give an extension. The rest of the file is just plain text to print out as-is. ================= =III. Domination= ================= In order to get Domination working well in your map, you need to place dom_team and dom_controlpoint entites. You *must* have at least 3 dom_team entities - 2 minimum teams and one blank one (empty netname and no team). You can have up to 4 teams (5 dom_team entities). Dom Team -------- classname dom_team netname name of team (Red Team). Set to "" or don't define for the required blank team. cnt color of the team. See the "Helpful Extras" section for info. model When this team captures control points, the points turn to this model. If this is the neutral team, points start out as this model. noise Sound to be played on the control point when it's captured. Only players nearby will hear it. noise1 Sound to be played to all players when the control point is captured. Also good for an annoncer voice ("Red Team has captured a control point") Control Points -------------- classname dom_controlpoint message message to be displayed to all players when this point is captured, preceded by the team's name. This defaults to " has captured a control point". You can specify different names for each point, for example " has captured the Lava Room". origin where in the map this point is wait How often this point gives its controlling team frags. frags How many frags this point gives each wait cycle. Here is an example entry in a .ent file that includes colored text and 3 teams: { "classname" "dom_team" "netname" "" "model" "models/domination/dom_unclaimed.md3" } { "classname" "dom_team" "netname" "^4Blue Team" "cnt" "13" "noise" "" "noise1" "domination/claim.wav" "model" "models/domination/dom_blue.md3" } { "classname" "dom_team" "netname" "^1Red Team" "cnt" "4" "noise" "" "noise1" "domination/claim.wav" "model" "models/domination/dom_red.md3" } { "classname" "dom_team" "netname" "^6Pink Team" "cnt" "9" "noise" "" "noise1" "domination/claim.wav" "model" "models/domination/dom_pink.md3" } { "classname" "dom_team" "netname" "^3Yellow Team" "cnt" "12" "noise" "" "noise1" "domination/claim.wav" "model" "models/domination/dom_yellow.md3" } { "classname" "dom_controlpoint" "message" " ^3has captured the ^1Hallways" "origin" "-206.0 -488.8 -150.0" "frags" "3" "wait" "5" "scale" "1.3" } { "classname" "dom_controlpoint" "message" " ^3has captured the ^1Lavaroom" "origin" "1457.1 19.9 -110.0" "frags" "1" "wait" "5" } { "classname" "dom_controlpoint" "message" " ^3controls the ^1Nex & Strength" "origin" "-259.8 299.3 5" "frags" "1" "wait" "5" } { "classname" "dom_controlpoint" "message" " ^3has captured the ^1Upper Platform" "origin" "539.7 1206.0 182.0" "frags" "1" "wait" "5" } { "classname" "dom_controlpoint" "message" " ^3has captured the ^1Teleport Room" "origin" "-1000.0 636.2 -16.0" "frags" "1" "wait" "5" } As you can see in the example, there are 5 dom_team ents: one blank, Red, Blue, Pink and Yellow. Each control point has a different message (giving it a special name), and the one in the hallways gives 3 frags every 5 seconds instead of just one, making it more valuable. ========== =III. CTF= ========== Capture the flag needs at least 1 CTF flag per team, and can also make use of team spawnpoints. CTF Flags --------- classname item_flag_team1 or item_flag_team2 angle direction the flag will point model model of the flag (default: models/ctf/flag_red.md3 or models/ctf/flag_blue.md3) noise sound played when flag is stolen (default: "ctf/take.wav") noise1 sound played when flag is returned by a teammate (default: "ctf/return.wav") noise2 sound played when flag is captured (default: "ctf/capture.wav") noise3 sound played when flag returns itself (default: "ctf/respawn.wav") Team Spawnpoints ---------------- classname info_player_team1 or info_player_team2 *note: These function just like info_player_deathmatch, but for one team only. If you don't make team spawnpoints, info_player_deathmatch is used instead. ================ =III. Runematch= ================ Runematch needs only one type of entity to work: rune spawn points. You will need at least one for each rune (5 minimum at the time of this writing), though you should probably have more than that in the map. Just give the points a classname and origin. Rune Spawnpoints ---------------- classname runematch_spawn_point ================================= =Appendix A - Advanced Mapcfgs = ================================= --------------------- -i. mapcfg revisited- --------------------- You now know how to make a basic, bare-bones mapcfg to set up a couple options and load your map. However, there's much more you can do! Consider these senarios: 1. I want to play different music in ctf and domination 2. The laser has too high of a force for laser jumps and ruins CTF 3. I want to create fog in my map Each of these situations can be resolved with ease with a little work in the mapcfg file. You're already creating different settings between game modes with your gamecfgs, since you can choose different fraglimits. You can also play different music. The mapname.cfg file is global to all uses of your map, so instead of using it, we'll use the mapinfos. You'll need to remove the music entry from the mapname.cfg file, and paste it into each of your mapname.cfg files *after* the changelevel command. So, dom_wazat1.mapcfg would look like this: set g_domination 1 // turn on domination set fraglimit 100 // 100 points to win set timelimit 15 // 15 minute max round time set changelevel wazat1 // now change level cd loop "8" // play music You can choose different music for each of your game modes by changing that last line. Just make sure your map.cfg file doesn't have a cd loop command in it, or it'll overwrite what you've done. --------------- -ii. exit cfgs- --------------- In order to solve our laser jumping problem, we need to call upon another feature of mapcfgs -- map exit scripts or "exit cfgs". These are called when the map is changing, before the next map's mapcfg is run. You can use them to clean up any special changes you've made so they won't affect the next map. For our laser jumping example, we could do something like this: // set up the exit cfg so we can reset values to what they were before set exit_cfg "maps/dom_wazat1_exit.cfg" // make a backup set BACKUP_g_balance_laser_force $g_balance_laser_force // map-customized values here set g_balance_laser_force 100 // and on with the rest of the config set g_domination 1 // turn on domination set fraglimit 100 // 100 points to win set timelimit 15 // 15 minute max round time set changelevel wazat1 // now change level cd loop "8" // play music Then we would make the exit cfg, named "dom_wazat1_exit.cfg": // reset laser damage set g_balance_laser_force $BACKUP_g_balance_laser_force When my wazat1 map is run in domination, the laser's force will only be 100. However, before the map changes, it gets set back to what it was before. This is because the original value was stored in BACKUP_g_balance_laser_force, then BACKUP_g_balance_laser_force was copied back into g_balance_laser_force when the exit cfg ran. You can set all kinds of values like this, including fog and gameplay options. =============================== =Appendix B - Helpful Extras = =============================== ---------------- -i. Team Colors- ---------------- When you need to set an entity's color or team, use these values: Red --- Team: 5 Color: 4 Blue ---- Team: 14 Color: 13 Pink ----- Team: 10 Color: 9 Yellow ------ Team: 13 Color: 12 ---------------- -i. Text Colors- ---------------- Occasionally you may want to print text in color, such as team names. Here are your options: 1 Red 2 Green 3 Yellow 4 Blue 5 Cyan 6 Magenta 7 White 8 Grey 9 Grey 0 Black