5 While I can't help you make a map, I can help you get it listed in the menu and
\r
6 working in the maplist. :p The central object is the .mapinfo file, but
\r
7 there's much more available.
\r
11 I Map Lists & Scripts
\r
12 (get your map listed and working)
\r
28 Appendix A - Advanced mapinfo
\r
30 Appendix B - Helpful extras
\r
34 Appendix C - Advanced Darkplaces shaders
\r
36 ========================
\r
37 =I. Map Lists & Scripts=
\r
38 ========================
\r
40 There now is just a single script/cfg file available to you, containing all map
\r
45 The mapinfo is actually required - however, the game is so nice that it
\r
46 automatically generates a draft of it for you.
\r
52 *cue even more scary music*
\r
54 The mapinfo file is basically what gets your map listed in the menu, and sets
\r
55 up the options needed to change to it. If no mapinfo file exists, the menu
\r
56 will automatically generate a rough draft for you on game startup. It will get
\r
57 stored into data/data/mapname.mapinfo.
\r
59 As an example, let's say I make a map called "wazat1.bsp". As long as I'm
\r
60 fantasizing, I might as well say this map is so well done I'm actually willing
\r
61 to release it for friends, neighbors, fellow forum visitors and other people
\r
62 who like me to judge me by. Let's also assume that I want domination,
\r
63 deathmatch/team deathmatch and runematch to all be playable on my map.
\r
65 This is very easy. First, I start the game and exit it again so the game writes
\r
66 data/data/wazat1.mapinfo for me. The file may look like:
\r
68 title Wazat's Great Map
\r
71 _diameter 1966.839355
\r
81 As I see, the menu autodetected that my map may be suitable for deathmatch,
\r
82 domination, runematch, last man standing and arena. But I want the map to be
\r
83 played in domination, deathmatch, team deathmatch, runematch only, and I also
\r
84 want different timelimits/fraglimits, so I will change the "type" lines to:
\r
91 Also, while I am at it, I should fix the placeholders in the map description lines:
\r
94 description A large multi level arena map
\r
97 Although not entirely necessary, I will now move the .mapinfo file from
\r
98 data/data/maps/wazat1.mapinfo to data/maps/wazat1.mapinfo, so it is at the same
\r
99 place as my map. Next time I start the game, my map will be shown supporting
\r
100 the right game modes and with the right description in the menu.
\r
102 Also, note the "has weapons" line. If this line is not there (which happens if
\r
103 the map contains no weapon entities other than the Nex), the map will run in
\r
104 MinstaGib only and not be shown in the menu normally. So if you look for your
\r
105 map and don't find it, add "has weapons" to the mapinfo file, and make sure you
\r
106 have weapon entities placed.
\r
108 There's much more power in a mapinfo file. See Appendix A for more details.
\r
110 By the way: the Domination and Keyhunt types allow a third number to specify
\r
111 the number of teams; the CTF type allows a third number to specify a capture
\r
112 limit (if g_ctf_win_mode is 0 or 1).
\r
119 So, you've got your map listed in the menu and it plays properly, but the menu
\r
120 isn't showing your picture! Or the picture is scaled badly! What manner of man
\r
121 would create such an accursed abomination?!
\r
123 Well... That sounds like something I'd do. :D
\r
125 And it is really easy: just make a screenshot of the map in action (preferably
\r
126 with crosshair and HUD switched off), and place it next to the map as
\r
127 mapname.jpg. For best rendering and file size, make the image in 4:3 aspect
\r
128 ratio, but scale it to the resolution 256x256 or possibly 512x512. It will look
\r
129 skewed in your image editing app, but the menu will show it right, and your
\r
130 graphics card LOVES images of such dimension.
\r
137 In order to get Domination working well in your map, you need to place dom_team
\r
138 and dom_controlpoint entites. You *must* have at least 3 dom_team entities - 2
\r
139 minimum teams and one blank one (empty netname and no team). You can have up
\r
140 to 4 teams (5 dom_team entities).
\r
145 netname name of team (Red Team). Set to "" or don't define for the required
\r
147 cnt color of the team. See the "Helpful Extras" section for info.
\r
148 model When this team captures control points, the points turn to this
\r
149 model. If this is the neutral team, points start out as this model.
\r
150 noise Sound to be played on the control point when it's captured. Only
\r
151 players nearby will hear it.
\r
152 noise1 Sound to be played to all players when the control point is
\r
153 captured. Also good for an annoncer voice ("Red Team has captured a
\r
158 classname dom_controlpoint
\r
159 message message to be displayed to all players when this point is captured,
\r
160 preceded by the team's name. This defaults to " has captured a control point".
\r
161 You can specify different names for each point, for example " has captured the
\r
163 origin where in the map this point is
\r
164 wait How often this point gives its controlling team frags.
\r
165 frags How many frags this point gives each wait cycle.
\r
167 Here is an example entry in a .ent file that includes colored text and 3 teams:
\r
170 "classname" "dom_team"
\r
172 "model" "models/domination/dom_unclaimed.md3"
\r
175 "classname" "dom_team"
\r
176 "netname" "^4Blue Team"
\r
179 "noise1" "domination/claim.wav"
\r
180 "model" "models/domination/dom_blue.md3"
\r
183 "classname" "dom_team"
\r
184 "netname" "^1Red Team"
\r
187 "noise1" "domination/claim.wav"
\r
188 "model" "models/domination/dom_red.md3"
\r
191 "classname" "dom_team"
\r
192 "netname" "^6Pink Team"
\r
195 "noise1" "domination/claim.wav"
\r
196 "model" "models/domination/dom_pink.md3"
\r
199 "classname" "dom_team"
\r
200 "netname" "^3Yellow Team"
\r
203 "noise1" "domination/claim.wav"
\r
204 "model" "models/domination/dom_yellow.md3"
\r
207 "classname" "dom_controlpoint"
\r
208 "message" " ^3has captured the ^1Hallways"
\r
209 "origin" "-206.0 -488.8 -150.0"
\r
215 "classname" "dom_controlpoint"
\r
216 "message" " ^3has captured the ^1Lavaroom"
\r
217 "origin" "1457.1 19.9 -110.0"
\r
222 "classname" "dom_controlpoint"
\r
223 "message" " ^3controls the ^1Nex & Strength"
\r
224 "origin" "-259.8 299.3 5"
\r
229 "classname" "dom_controlpoint"
\r
230 "message" " ^3has captured the ^1Upper Platform"
\r
231 "origin" "539.7 1206.0 182.0"
\r
236 "classname" "dom_controlpoint"
\r
237 "message" " ^3has captured the ^1Teleport Room"
\r
238 "origin" "-1000.0 636.2 -16.0"
\r
244 As you can see in the example, there are 5 dom_team ents: one blank, Red, Blue,
\r
245 Pink and Yellow. Each control point has a different message (giving it a
\r
246 special name), and the one in the hallways gives 3 frags every 5 seconds
\r
247 instead of just one, making it more valuable.
\r
249 If your map contains the required entities for Domination, the menu will
\r
250 automatically detect it for supporting Domination. To force the map to get
\r
251 re-detected after you add such entities, delete the data/data/mapname.mapinfo
\r
252 file - or simply edit it to add the "type dom" line.
\r
259 Capture the flag needs at least 1 CTF flag per team, and can also make use of
\r
264 classname item_flag_team1 or item_flag_team2
\r
265 angle direction the flag will point
\r
266 model model of the flag (default: models/ctf/flag_red.md3 or
\r
267 models/ctf/flag_blue.md3)
\r
268 noise sound played when flag is stolen (default: "ctf/take.wav")
\r
269 noise1 sound played when flag is returned by a teammate (default:
\r
271 noise2 sound played when flag is captured (default: "ctf/capture.wav")
\r
272 noise3 sound played when flag returns itself (default: "ctf/respawn.wav")
\r
276 classname info_player_team1 or info_player_team2
\r
277 *note: These function just like info_player_deathmatch, but for one team only.
\r
278 If you don't make team spawnpoints, info_player_deathmatch is used instead.
\r
280 If your map contains the required entities for CTF, the menu will automatically
\r
281 detect it for supporting CTF. To force the map to get re-detected after you add
\r
282 such entities, delete the data/data/mapname.mapinfo file - or simply edit it to
\r
283 add the "type ctf" line.
\r
289 Runematch needs only one type of entity to work: rune spawn points. You will
\r
290 need at least one for each rune (5 minimum at the time of this writing), though
\r
291 you should probably have more than that in the map. Just give the points a
\r
292 classname and origin.
\r
296 classname runematch_spawn_point
\r
298 If your map contains the required entities for Runematch, the menu will automatically
\r
299 detect it for supporting Runematch. To force the map to get re-detected after you add
\r
300 such entities, delete the data/data/mapname.mapinfo file - or simply edit it to
\r
301 add the "type rune" line.
\r
307 Making a race map is not hard: you need some special spawnpoints, and some checkpoints.
\r
311 classname info_player_race
\r
312 target targetname of the controlpoint
\r
313 race_place for finish line control points, the place of the point
\r
317 classname trigger_race_checkpoint
\r
318 targetname some name to target the checkpoint with
\r
319 cnt number of the checkpoint (or 0 for finish line)
\r
321 Note that checkpoints are brush entities, and they should be somewhat thick and
\r
322 cover the full volume the player could use to get past them.
\r
324 Example of entity placement:
\r
327 ---------------------###---
\r
328 / >>>> 7 5 3 1 ### \
\r
329 / >>>> 8 6 4 2 ### \
\r
330 | ------------------### |
\r
333 | ^ ^ ------------------$$$ |
\r
336 ----------------------$$$---
\r
339 ###: classname = trigger_race_checkpoint, cnt = 0, targetname = finish
\r
340 $$$: classname = trigger_race_checkpoint, cnt = 1, targetname = cp1
\r
341 %%%: classname = trigger_race_checkpoint, cnt = 2, targetname = cp2
\r
342 >: classname = info_player_race, target = finish, angle = 0
\r
343 1: classname = info_player_race, target = finish, angle = 0, race_place = 1
\r
344 2: classname = info_player_race, target = finish, angle = 0, race_place = 2
\r
346 8: classname = info_player_race, target = finish, angle = 0, race_place = 8
\r
347 <: classname = info_player_race, target = cp1, angle = 180
\r
348 ^: classname = info_player_race, target = cp2, angle = 90
\r
350 If your map contains the required entities for Race, the menu will automatically
\r
351 detect it for supporting Race. To force the map to get re-detected after you add
\r
352 such entities, delete the data/data/mapname.mapinfo file - or simply edit it to
\r
353 add the "type race" line.
\r
356 ===============================
\r
357 =Appendix A - Advanced mapinfo=
\r
358 ===============================
\r
360 You now know how to make a basic, bare-bones mapinfo to set up a couple options
\r
361 and load your map. However, there's much more you can do! Consider these
\r
364 1. The laser has too high of a force for laser jumps and ruins CTF
\r
365 2. I don't want players to start out with the shotgun, but with the machinegun
\r
367 3. The map takes so much server CPU performance that the anti-wallhack can't be
\r
370 Each of these situations can be resolved with ease with a little work in the
\r
373 To do this, I can add the following lines to my mapinfo file:
\r
375 settemp_for_type ctf g_balance_laser_primary_force 200
\r
376 settemp_for_type all g_start_weapon_shotgun 0
\r
377 settemp_for_type all g_start_weapon_uzi 1
\r
378 settemp_for_type all sv_cullentities_trace 0
\r
380 These "settemp" settings are automatically removed when the map is left and
\r
381 another is loaded. As you can see, it is possible to make per-mode temporary
\r
382 settings, and global ones.
\r
384 Similar settings are also possible for the client:
\r
386 clientsettemp_for_type all r_shadow_glossexponent 96
\r
389 =============================
\r
390 =Appendix B - Helpful Extras=
\r
391 =============================
\r
396 When you need to set an entity's color or team, use these values:
\r
422 Occasionally you may want to print text in color, such as team names. Here are your options:
\r
431 8 Grey (transparent)
\r
435 ==========================================
\r
436 =Appendix C - Advanced Darkplaces shaders=
\r
437 ==========================================
\r
439 Shader parameters for DP's own features:
\r
440 - dp_reflect <distort> <r> <g> <b> <a>
\r
441 Makes surfaces of this shader reflective with r_water. The reflection is
\r
442 alpha blended on the texture with the given alpha, and modulated by the given
\r
443 color. distort is used in conjunction with the normalmap to simulate a
\r
444 nonplanar water surface.
\r
445 - dp_refract <distort> <r> <g> <b>
\r
446 Makes surfaces of this shader refractive with r_water. The refraction
\r
447 replaces the transparency of the texture. distort is used in conjunction with
\r
448 the normalmap to simulate a nonplanar water surface.
\r
449 - dp_water <reflectmin> <reflectmax> <refractdistort> <reflectdistort> <refractr> <refractg> <refractb> <reflectr> <reflectg> <reflectb> <alpha>
\r
450 This combines the effects of dp_reflect and dp_refract to simulate a water
\r
451 surface. However, the refraction and the reflection are mixed using a Fresnel
\r
452 equation that makes the amount of reflection slide from reflectmin when
\r
453 looking parallel to the water to reflectmax when looking directly into the
\r
454 water. The result of this reflection/refraction mix is then layered BELOW the
\r
455 texture of the shader, so basically, it "fills up" the alpha values of the
\r
456 water. The alpha value is a multiplicator for the alpha value on the texture
\r
457 - set this to a small value like 0.1 to emphasize the reflection and make
\r
458 the water transparent; but if r_water is 0, alpha isn't used, so the water can
\r
459 be very visible then too.
\r