5 void worldspawn (void)
\r
9 // the gravity set here can be overwritten by <mapname>.cfg
\r
12 cvar_set("sv_gravity", ftos(world.gravity));
\r
15 cvar_set("sv_gravity", "800");
\r
17 game = cvar ("gamecfg"); // load game options
\r
19 //precache_model ("progs/beam.mdl");
\r
20 precache_model ("progs/beam.mdl");
\r
21 precache_model ("models/bullet.mdl");
\r
22 precache_model ("models/casing_bronze.mdl");
\r
23 precache_model ("models/casing_shell.mdl");
\r
24 precache_model ("models/casing_steel.mdl");
\r
25 precache_model ("models/ebomb.mdl");
\r
26 precache_model ("models/elaser.mdl");
\r
27 precache_model ("models/flash.md3");
\r
28 precache_model ("models/gibs/bloodyskull.md3");
\r
29 precache_model ("models/gibs/chunk.mdl");
\r
30 precache_model ("models/gibs/eye.md3");
\r
31 precache_model ("models/gibs/gib1.md3");
\r
32 precache_model ("models/gibs/gib2.md3");
\r
33 precache_model ("models/gibs/gib3.md3");
\r
34 precache_model ("models/gibs/gib4.md3");
\r
35 precache_model ("models/gibs/gib5.md3");
\r
36 precache_model ("models/gibs/gib6.md3");
\r
37 precache_model ("models/grenademodel.md3");
\r
38 precache_model ("models/hagarmissile.mdl");
\r
39 precache_model ("models/items/a_bullets.mdl");
\r
40 precache_model ("models/items/a_cells.md3");
\r
41 precache_model ("models/items/a_rockets.md3");
\r
42 precache_model ("models/items/a_shells.md3");
\r
43 precache_model ("models/items/g_a1.md3");
\r
44 precache_model ("models/items/g_a25.md3");
\r
45 precache_model ("models/items/g_h1.md3");
\r
46 precache_model ("models/items/g_h25.md3");
\r
47 precache_model ("models/items/g_h100.md3");
\r
48 precache_model ("models/items/g_invincible.md3");
\r
49 precache_model ("models/items/g_strength.md3");
\r
50 precache_model ("models/laser.mdl");
\r
51 precache_model ("models/misc/chatbubble.spr");
\r
52 precache_model ("models/nexflash.md3");
\r
53 precache_model ("models/plasma.mdl");
\r
54 precache_model ("models/plasmatrail.mdl");
\r
55 precache_model ("models/rocket.md3");
\r
56 precache_model ("models/sprites/grenadeexplosion.spr32");
\r
57 precache_model ("models/sprites/hagarexplosion.spr32");
\r
58 precache_model ("models/sprites/muzzleflash.spr32");
\r
59 //precache_model ("models/sprites/plasmahitwall.spr32");
\r
60 //precache_model ("models/sprites/plasmashot.spr32");
\r
61 precache_model ("models/sprites/rocketexplosion.spr32");
\r
62 precache_model ("models/tracer.mdl");
\r
63 precache_model ("models/uziflash.md3");
\r
64 precache_model ("models/weapons/g_crylink.md3");
\r
65 precache_model ("models/weapons/g_electro.md3");
\r
66 precache_model ("models/weapons/g_gl.md3");
\r
67 precache_model ("models/weapons/g_hagar.md3");
\r
68 precache_model ("models/weapons/g_nex.md3");
\r
69 precache_model ("models/weapons/g_rl.md3");
\r
70 precache_model ("models/weapons/g_shotgun.md3");
\r
71 precache_model ("models/weapons/g_uzi.md3");
\r
72 precache_model ("models/weapons/v_crylink.md3");
\r
73 precache_model ("models/weapons/v_electro.md3");
\r
74 precache_model ("models/weapons/v_gl.md3");
\r
75 precache_model ("models/weapons/v_hagar.md3");
\r
76 precache_model ("models/weapons/v_laser.md3");
\r
77 precache_model ("models/weapons/v_nex.md3");
\r
78 precache_model ("models/weapons/v_rl.md3");
\r
79 precache_model ("models/weapons/v_shotgun.md3");
\r
80 precache_model ("models/weapons/v_uzi.md3");
\r
81 precache_model ("models/weapons/w_crylink.zym");
\r
82 precache_model ("models/weapons/w_electro.zym");
\r
83 precache_model ("models/weapons/w_gl.zym");
\r
84 precache_model ("models/weapons/w_hagar.zym");
\r
85 precache_model ("models/weapons/w_laser.zym");
\r
86 precache_model ("models/weapons/w_nex.zym");
\r
87 precache_model ("models/weapons/w_rl.zym");
\r
88 precache_model ("models/weapons/w_shotgun.zym");
\r
89 precache_model ("models/weapons/w_uzi.zym");
\r
93 // new weapon models
\r
94 precache_model ("models/weapons/v_rli.md3"); // incendiary rockets
\r
95 precache_model ("models/weapons/v_flamer.md3"); // flamer
\r
96 precache_model ("models/weapons/v_bombletts.md3"); // bombletts
\r
97 precache_model ("models/weapons/v_hotbombs.md3"); // hot bombs
\r
98 precache_model ("models/weapons/v_grapple.md3"); // grappling hook
\r
99 precache_model ("models/weapons/v_namek.md3"); // namek
\r
101 precache_model ("models/weapons/w_rli.zym");
\r
102 precache_model ("models/weapons/w_flamer.zym");
\r
103 precache_model ("models/weapons/w_bombletts.zym");
\r
104 precache_model ("models/weapons/w_hotbombs.zym");
\r
105 precache_model ("models/weapons/w_grapple.zym");
\r
106 precache_model ("models/weapons/w_namek.zym");
\r
110 precache_model ("models/weapons/namekb.mdl");
\r
111 precache_sound ("weapons/namek_fire.wav");
\r
113 precache_model ("models/misc/shield_s.mdl");
\r
115 precache_model ("models/misc/ropebase.mdl");
\r
118 precache_model ("models/sprites/fire_base.spr32");
\r
119 precache_model ("models/sprites/fire_top.spr32");
\r
121 precache_model ("models/sprites/null.spr");
\r
124 precache_sound ("announcer/1fragleft.wav");
\r
125 precache_sound ("announcer/1minuteremains.wav");
\r
126 precache_sound ("announcer/2fragsleft.wav");
\r
127 precache_sound ("announcer/3fragsleft.wav");
\r
128 precache_sound ("announcer/welcometonexuiz.wav");
\r
129 precache_sound ("misc/armor1.wav");
\r
130 precache_sound ("misc/armor25.wav");
\r
131 precache_sound ("misc/armorimpact.wav");
\r
132 precache_sound ("misc/bodyimpact1.wav");
\r
133 precache_sound ("misc/bodyimpact2.wav");
\r
134 precache_sound ("misc/gib.wav");
\r
135 precache_sound ("misc/gib_splat01.wav");
\r
136 precache_sound ("misc/gib_splat02.wav");
\r
137 precache_sound ("misc/gib_splat03.wav");
\r
138 precache_sound ("misc/gib_splat04.wav");
\r
139 //precache_sound ("misc/h2ohit.wav");
\r
140 precache_sound ("misc/hit.wav");
\r
141 precache_sound ("misc/hitground1.wav");
\r
142 precache_sound ("misc/hitground2.wav");
\r
143 precache_sound ("misc/hitground3.wav");
\r
144 precache_sound ("misc/hitground4.wav");
\r
145 precache_sound ("misc/itempickup.wav");
\r
146 precache_sound ("misc/itemrespawn.wav");
\r
147 precache_sound ("misc/jumppad.wav");
\r
148 precache_sound ("misc/mediumhealth.wav");
\r
149 precache_sound ("misc/megahealth.wav");
\r
150 precache_sound ("misc/minihealth.wav");
\r
151 precache_sound ("misc/powerup.wav");
\r
152 precache_sound ("misc/talk.wav");
\r
153 precache_sound ("misc/teleport.wav");
\r
154 precache_sound ("plats/medplat1.wav");
\r
155 precache_sound ("plats/medplat2.wav");
\r
156 precache_sound ("player/lava.wav");
\r
157 precache_sound ("player/slime.wav");
\r
158 precache_sound ("weapons/crylink.wav");
\r
159 precache_sound ("weapons/crylink2.wav");
\r
160 precache_sound ("weapons/electro_fire.wav");
\r
161 precache_sound ("weapons/electro_fly.wav");
\r
162 precache_sound ("weapons/electro_impact.wav");
\r
163 precache_sound ("weapons/grenade_bounce.wav");
\r
164 precache_sound ("weapons/grenade_fire.wav");
\r
165 precache_sound ("weapons/grenade_impact.wav");
\r
166 precache_sound ("weapons/hagar_fire.wav");
\r
167 precache_sound ("weapons/hagexp1.wav");
\r
168 precache_sound ("weapons/hagexp2.wav");
\r
169 precache_sound ("weapons/hagexp3.wav");
\r
170 precache_sound ("weapons/lasergun_fire.wav");
\r
171 precache_sound ("weapons/laserimpact.wav");
\r
172 precache_sound ("weapons/nexfire.wav");
\r
173 precache_sound ("weapons/neximpact.wav");
\r
174 precache_sound ("weapons/ric1.wav");
\r
175 precache_sound ("weapons/ric2.wav");
\r
176 precache_sound ("weapons/ric3.wav");
\r
177 precache_sound ("weapons/rocket_fire.wav");
\r
178 precache_sound ("weapons/rocket_fly.wav");
\r
179 precache_sound ("weapons/rocket_impact.wav");
\r
180 precache_sound ("weapons/shotgun_fire.wav");
\r
181 precache_sound ("weapons/shotgun_reload.wav");
\r
182 precache_sound ("weapons/tink1.wav");
\r
183 precache_sound ("weapons/uzi_fire.wav");
\r
184 precache_sound ("weapons/weapon_switch.wav");
\r
185 precache_sound ("weapons/weaponpickup.wav");
\r
186 precache_sound ("weapons/flamer.wav");
\r
187 // TF SOUNDS & MODELS
\r
188 precache_sound ("weapons/prime.wav");
\r
189 precache_sound ("weapons/gren.wav");
\r
190 precache_sound ("weapons/bounce.wav");
\r
191 // precache_sound ("player/step1l.wav");
\r
192 precache_sound ("weapons/throw.wav");
\r
193 precache_model ("progs/hgren2.mdl");
\r
194 precache_model ("models/ammo/grenade/grenade.md3");
\r
195 precache_model ("models/grenades/fragnade.md3");
\r
197 // plays music for the level if there is any
\r
200 precache_sound (self.noise);
\r
201 ambientsound ('0 0 0', self.noise, 1.00, ATTN_NONE);
\r
205 lightstyle(0, "m");
\r
207 // 1 FLICKER (first variety)
\r
208 lightstyle(1, "mmnmmommommnonmmonqnmmo");
\r
210 // 2 SLOW STRONG PULSE
\r
211 lightstyle(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba");
\r
213 // 3 CANDLE (first variety)
\r
214 lightstyle(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg");
\r
217 lightstyle(4, "mamamamamama");
\r
219 // 5 GENTLE PULSE 1
\r
220 lightstyle(5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj");
\r
222 // 6 FLICKER (second variety)
\r
223 lightstyle(6, "nmonqnmomnmomomno");
\r
225 // 7 CANDLE (second variety)
\r
226 lightstyle(7, "mmmaaaabcdefgmmmmaaaammmaamm");
\r
228 // 8 CANDLE (third variety)
\r
229 lightstyle(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa");
\r
231 // 9 SLOW STROBE (fourth variety)
\r
232 lightstyle(9, "aaaaaaaazzzzzzzz");
\r
234 // 10 FLUORESCENT FLICKER
\r
235 lightstyle(10, "mmamammmmammamamaaamammma");
\r
237 // 11 SLOW PULSE NOT FADE TO BLACK
\r
238 lightstyle(11, "abcdefghijklmnopqrrqponmlkjihgfedcba");
\r
240 // styles 32-62 are assigned by the light program for switchable lights
\r
243 lightstyle(63, "a");
\r
245 if (cvar("g_domination"))
\r
249 /* // spawn redirect function; doesn't work!
\r
254 e.create_time = time;
\r
264 // reads and alters data/maplist.cfg (sliding it one line), and returns a
\r
265 // strzoned string containing the next map
\r
266 #define MAPLIST "maplist.cfg"
\r
267 string() Nex_RotateMapList =
\r
269 local float lHandle;
\r
270 local string lNextMap;
\r
271 local string lCurrentMap;
\r
272 local string lBuffer;
\r
274 lHandle = fopen( MAPLIST, FILE_READ );
\r
275 if( lHandle < 0 ) {
\r
277 // restart the current map if no other map is not found
\r
278 return strzone( mapname );
\r
281 // get the first line that will be moved to the end later
\r
282 lCurrentMap = strzone( fgets( lHandle ) );
\r
283 if( !lCurrentMap ) {
\r
285 // restart the current map if no other map is not found
\r
286 return strzone( mapname );
\r
289 // now get the second line which is the map that should be loaded next
\r
290 lBuffer = fgets( lHandle );
\r
291 // if there isnt a second line, nothing needs to be rotated
\r
294 strunzone( lCurrentMap );
\r
295 // restart the current map if no other map is not found
\r
296 return strzone( mapname );
\r
299 // since lBuffer holds the next map, it is assigned to nextmap
\r
300 lNextMap = strzone( lBuffer );
\r
302 // since fgets uses its own buffer we need to move lBuffer to a tempstring
\r
303 // before reading the next line (or lBuffer will be lost)
\r
304 lBuffer = strcat( lBuffer );
\r
306 // read in the rest of the list
\r
308 local string lLine;
\r
310 lLine = fgets( lHandle );
\r
315 lBuffer = strcat( lBuffer, "\n", lLine );
\r
318 lBuffer = strcat( lBuffer, "\n", lCurrentMap );
\r
320 // dismiss lCurrentmap now
\r
321 strunzone( lCurrentMap );
\r
323 // and close the file handle
\r
326 // open the maplist for output this one
\r
327 lHandle = fopen( MAPLIST, FILE_WRITE );
\r
328 if( lHandle < 0 ) {
\r
329 // this shouldnt happen!
\r
330 // print a warning/error message
\r
331 dprint( "Couldn't open ", MAPLIST, " for output!\n" );
\r
333 strunzone( lNextMap );
\r
335 // we return the currently running map
\r
336 return strzone( mapname );
\r
339 fputs( lHandle, lBuffer );
\r
347 float intermission_running;
\r
348 //float intermission_exittime;
\r
349 float alreadychangedlevel;
\r
352 void() GotoNextMap =
\r
354 local string nextmap;
\r
355 //local float n, nummaps;
\r
357 if (alreadychangedlevel)
\r
359 alreadychangedlevel = TRUE;
\r
360 if (cvar("samelevel")) // if samelevel is set, stay on same level
\r
361 changelevel (mapname);
\r
366 //local entity pos;
\r
370 // restart current map if no cycle is found
\r
371 nextmap = strzone(mapname);
\r
372 fh = fopen("maplist.cfg", FILE_READ);
\r
378 if (nextmap == mapname)
\r
380 strunzone(nextmap);
\r
381 nextmap = strzone(line);
\r
385 if (line == mapname)
\r
390 strunzone(nextmap);
\r
391 nextmap = strzone(line);
\r
397 changelevel (nextmap);
\r
398 strunzone(nextmap);
\r
401 //nextmap = Nex_RotateMapList();
\r
402 //changelevel (nextmap);
\r
403 //strunzone (nextmap);
\r
406 s = cvar_string("g_maplist");
\r
407 nummaps = tokenize(s);
\r
408 // if no map list, restart current one
\r
413 while (n < nummaps)
\r
415 if (argv(n) == mapname)
\r
424 changelevel (nextmap);
\r
434 When the player presses attack or jump, change to the next level
\r
437 void() IntermissionThink =
\r
439 if (time < intermission_exittime)
\r
442 if (time < intermission_exittime + 10 && !self.button0 && !self.button1 && !self.button2 && !self.button3)
\r
452 Returns the entity to view from
\r
456 entity() FindIntermission =
\r
461 // look for info_intermission first
\r
462 spot = find (world, classname, "info_intermission");
\r
464 { // pick a random one
\r
465 cyc = random() * 4;
\r
468 spot = find (spot, classname, "info_intermission");
\r
470 spot = find (spot, classname, "info_intermission");
\r
476 // then look for the start position
\r
477 spot = find (world, classname, "info_player_start");
\r
481 // testinfo_player_start is only found in regioned levels
\r
482 spot = find (world, classname, "testplayerstart");
\r
486 // then look for the start position
\r
487 spot = find (world, classname, "info_player_deathmatch");
\r
491 //objerror ("FindIntermission: no spot");
\r
497 ===============================================================================
\r
501 ===============================================================================
\r
505 go to the next level for deathmatch
\r
506 only called if a time or frag limit has expired
\r
512 intermission_running = 1;
\r
514 // enforce a wait time before allowing changelevel
\r
515 intermission_exittime = time + 5;
\r
517 WriteByte (MSG_ALL, SVC_CDTRACK);
\r
518 WriteByte (MSG_ALL, 3);
\r
519 WriteByte (MSG_ALL, 3);
\r
521 //pos = FindIntermission ();
\r
523 other = find (world, classname, "player");
\r
524 while (other != world)
\r
526 //other.nextthink = time + 0.5;
\r
527 other.takedamage = DAMAGE_NO;
\r
528 other.solid = SOLID_NOT;
\r
529 other.movetype = MOVETYPE_NONE;
\r
530 other.angles = other.v_angle;
\r
531 other.angles_x = other.angles_x * -1;
\r
535 other.modelindex = 0;
\r
536 other.weaponentity = world; // remove weapon model
\r
537 other.view_ofs = '0 0 0';
\r
538 other.angles = other.v_angle = pos.mangle;
\r
541 other.angles = other.v_angle = pos.angles;
\r
542 other.v_angle_x = other.v_angle_x * -1;
\r
544 other.fixangle = TRUE; // turn this way immediately
\r
545 setorigin (other, pos.origin);
\r
548 other = find (other, classname, "player");
\r
551 WriteByte (MSG_ALL, SVC_INTERMISSION);
\r
558 Exit deathmatch games upon conditions
\r
561 void() CheckRules_Player =
\r
563 local float fraglimit;
\r
565 if (gameover) // someone else quit the game already
\r
568 fraglimit = cvar("fraglimit");
\r
569 if (fraglimit && self.frags >= fraglimit)
\r
576 float checkrules_oneminutewarning;
\r
577 float checkrules_leaderfrags;
\r
578 entity checkrules_leader;
\r
584 Exit deathmatch games upon conditions
\r
587 void() CheckRules_World =
\r
589 local float timelimit;
\r
590 local float fraglimit;
\r
591 local float checkrules_oldleaderfrags;
\r
592 local entity checkrules_oldleader;
\r
595 if (intermission_running)
\r
596 if (time >= intermission_exittime + 60)
\r
602 if (gameover) // someone else quit the game already
\r
605 timelimit = cvar("timelimit") * 60;
\r
606 fraglimit = cvar("fraglimit");
\r
608 if (timelimit && time >= timelimit)
\r
614 if (!checkrules_oneminutewarning && timelimit && time > timelimit - 60)
\r
616 checkrules_oneminutewarning = TRUE;
\r
617 sound(world, CHAN_AUTO, "announcer/1minuteremains.wav", 1, ATTN_NONE);
\r
620 checkrules_oldleader = checkrules_leader;
\r
621 checkrules_oldleaderfrags = checkrules_leaderfrags;
\r
622 checkrules_leaderfrags = 0;
\r
623 checkrules_leader = world;
\r
624 head = findchain(classname, "player");
\r
627 if (checkrules_leaderfrags < head.frags)
\r
629 checkrules_leaderfrags = head.frags;
\r
630 checkrules_leader = head;
\r
634 if (checkrules_leaderfrags <= 0)
\r
636 checkrules_leader = world;
\r
637 checkrules_leaderfrags = 0;
\r
639 checkrules_leaderfrags = floor(checkrules_leaderfrags);
\r
640 if (checkrules_leaderfrags != checkrules_oldleaderfrags)
\r
642 if (checkrules_leaderfrags == fraglimit - 1)
\r
643 sound(world, CHAN_AUTO, "announcer/1fragleft.wav", 1, ATTN_NONE);
\r
644 else if (checkrules_leaderfrags == fraglimit - 2)
\r
645 sound(world, CHAN_AUTO, "announcer/2fragsleft.wav", 1, ATTN_NONE);
\r
646 else if (checkrules_leaderfrags == fraglimit - 3)
\r
647 sound(world, CHAN_AUTO, "announcer/3fragsleft.wav", 1, ATTN_NONE);
\r
649 // if (checkrules_leader != checkrules_oldleader)// && checkrules_leaderfrags > checkrules_oldleaderfrags)
\r
650 // bprint("^1",checkrules_leader.netname, " has taken the lead with ", ftos(checkrules_leaderfrags), " frags\n");
\r