]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/server/domination.qc
Get the swallow model working as intended. Adjustments still needed however
[voretournament/voretournament.git] / data / qcsrc / server / domination.qc
1 \r
2 /*\r
3 Domination as a plugin for netquake mods\r
4 by LordHavoc (lordhavoc@ghdigital.com)\r
5 \r
6 How to add domination points to a mod:\r
7 1. Add this line to progs.src above world.qc:\r
8 domination.qc\r
9 2. Comment out all lines in ClientObituary in client.qc that begin with targ.frags  or attacker.frags.\r
10 3. Add this above spawnfunc_worldspawn in world.qc:\r
11 void() dom_init;\r
12 4. Add this line to the end of spawnfunc_worldspawn in world.qc:\r
13 dom_init();\r
14 \r
15 Note: The only teams who can use dom control points are identified by spawnfunc_dom_team entities (if none exist these default to red and blue and use only quake models/sounds).\r
16 */\r
17 \r
18 #define DOMPOINTFRAGS frags\r
19 \r
20 .float enemy_playerid;\r
21 .entity sprite;\r
22 .float captime;\r
23 \r
24 void() dom_controlpoint_setup;\r
25 \r
26 void LogDom(string mode, float team_before, entity actor)\r
27 {\r
28         string s;\r
29         if(!cvar("sv_eventlog"))\r
30                 return;\r
31         s = strcat(":dom:", mode);\r
32         s = strcat(s, ":", ftos(team_before));\r
33         s = strcat(s, ":", ftos(actor.playerid));\r
34         GameLogEcho(s);\r
35 }\r
36 \r
37 void() dom_spawnteams;\r
38 \r
39 void dompoint_captured ()\r
40 {\r
41         local entity head;\r
42         local float old_delay, old_team, real_team;\r
43 \r
44         // now that the delay has expired, switch to the latest team to lay claim to this point\r
45         head = self.owner;\r
46 \r
47         real_team = self.cnt;\r
48         self.cnt = -1;\r
49 \r
50         LogDom("taken", self.team, self.dmg_inflictor);\r
51         self.dmg_inflictor = world;\r
52 \r
53         self.goalentity = head;\r
54         self.model = head.mdl;\r
55         self.modelindex = head.dmg;\r
56         self.skin = head.skin;\r
57 \r
58         //bprint(head.message);\r
59         //bprint("\n");\r
60 \r
61         //bprint(^3head.netname);\r
62         //bprint(head.netname);\r
63         //bprint(self.message);\r
64         //bprint("\n");\r
65 \r
66         bprint("^3", head.netname, "^3", self.message, "\n");\r
67         if(self.enemy.playerid == self.enemy_playerid)\r
68                 PlayerScore_Add(self.enemy, SP_DOM_TAKES, 1);\r
69         else\r
70                 self.enemy = world;\r
71 \r
72         if (head.noise != "")\r
73                 if(self.enemy)\r
74                         sound(self.enemy, CHAN_AUTO, head.noise, VOL_BASE, ATTN_NORM);\r
75                 else\r
76                         sound(self, CHAN_TRIGGER, head.noise, VOL_BASE, ATTN_NORM);\r
77         if (head.noise1 != "")\r
78                 play2all(head.noise1);\r
79 \r
80         //self.nextthink = time + cvar("g_domination_point_rate");\r
81         //self.think = dompointthink;\r
82 \r
83         if(cvar("g_domination_point_rate"))\r
84                 self.delay = time + cvar("g_domination_point_rate");\r
85         else\r
86                 self.delay = time + self.wait;\r
87 \r
88         // do trigger work\r
89         old_delay = self.delay;\r
90         old_team = self.team;\r
91         self.team = real_team;\r
92         self.delay = 0;\r
93         activator = self;\r
94         SUB_UseTargets ();\r
95         self.delay = old_delay;\r
96         self.team = old_team;\r
97 \r
98         switch(self.goalentity.team)\r
99         {\r
100                 case COLOR_TEAM1:\r
101                         WaypointSprite_UpdateSprites(self.sprite, "dom-red", "", "");\r
102                         break;\r
103                 case COLOR_TEAM2:\r
104                         WaypointSprite_UpdateSprites(self.sprite, "dom-blue", "", "");\r
105                         break;\r
106                 case COLOR_TEAM3:\r
107                         WaypointSprite_UpdateSprites(self.sprite, "dom-yellow", "", "");\r
108                         break;\r
109                 case COLOR_TEAM4:\r
110                         WaypointSprite_UpdateSprites(self.sprite, "dom-pink", "", "");\r
111                         break;\r
112         }\r
113         WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, colormapPaletteColor(self.goalentity.team - 1, 0));\r
114         WaypointSprite_Ping(self.sprite);\r
115 \r
116         self.captime = time;\r
117 };\r
118 \r
119 void AnimateDomPoint()\r
120 {\r
121         if(self.pain_finished > time)\r
122                 return;\r
123         self.pain_finished = time + self.t_width;\r
124         if(self.nextthink > self.pain_finished)\r
125                 self.nextthink = self.pain_finished;\r
126 \r
127         self.frame = self.frame + 1;\r
128         if(self.frame > self.t_length)\r
129                 self.frame = 0;\r
130 }\r
131 \r
132 void dompointthink()\r
133 {\r
134         local float waittime;\r
135         local float fragamt;\r
136 \r
137         self.nextthink = time + 0.1;\r
138 \r
139         //self.frame = self.frame + 1;\r
140         //if(self.frame > 119)\r
141         //      self.frame = 0;\r
142         AnimateDomPoint();\r
143 \r
144         // give points\r
145 \r
146         if (gameover || self.delay > time || time < game_starttime)     // game has ended, don't keep giving points\r
147                 return;\r
148 \r
149         waittime = cvar("g_domination_point_rate");\r
150         if(!waittime)\r
151                 waittime = self.wait;\r
152         self.delay = time + waittime;\r
153 \r
154         // give credit to the team\r
155         // NOTE: this defaults to 0\r
156         if (self.goalentity.netname != "")\r
157         {\r
158                 fragamt = cvar("g_domination_point_amt");\r
159                 if(!fragamt)\r
160                         fragamt = self.DOMPOINTFRAGS;\r
161                 TeamScore_AddToTeam(self.goalentity.team, ST_SCORE, fragamt);\r
162                 TeamScore_AddToTeam(self.goalentity.team, ST_DOM_TICKS, fragamt);\r
163 \r
164                 // give credit to the individual player, if he is still there\r
165                 if (self.enemy.playerid == self.enemy_playerid)\r
166                 {\r
167                         PlayerScore_Add(self.enemy, SP_SCORE, fragamt);\r
168                         PlayerScore_Add(self.enemy, SP_DOM_TICKS, fragamt);\r
169                 }\r
170                 else\r
171                         self.enemy = world;\r
172         }\r
173 }\r
174 \r
175 void dompointtouch()\r
176 {\r
177         local entity head;\r
178         if (other.classname != "player")\r
179                 return;\r
180         if (other.health < 1)\r
181                 return;\r
182 \r
183         if(time < self.captime + 0.3)\r
184                 return;\r
185 \r
186         // only valid teams can claim it\r
187         head = find(world, classname, "dom_team");\r
188         while (head && head.team != other.team)\r
189                 head = find(head, classname, "dom_team");\r
190         if (!head || head.netname == "" || head == self.goalentity)\r
191                 return;\r
192 \r
193         // delay capture\r
194 \r
195         self.team = self.goalentity.team; // this stores the PREVIOUS team!\r
196 \r
197         self.cnt = other.team;\r
198         self.owner = head; // team to switch to after the delay\r
199         self.dmg_inflictor = other;\r
200 \r
201         // self.state = 1;\r
202         // self.delay = time + cvar("g_domination_point_capturetime");\r
203         //self.nextthink = time + cvar("g_domination_point_capturetime");\r
204         //self.think = dompoint_captured;\r
205 \r
206         // go to neutral team in the mean time\r
207         head = find(world, classname, "dom_team");\r
208         while (head && head.netname != "")\r
209                 head = find(head, classname, "dom_team");\r
210         if(head == world)\r
211                 return;\r
212 \r
213         WaypointSprite_UpdateSprites(self.sprite, "dom-neut", "", "");\r
214         WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, '0 1 1');\r
215         WaypointSprite_Ping(self.sprite);\r
216 \r
217         self.goalentity = head;\r
218         self.model = head.mdl;\r
219         self.modelindex = head.dmg;\r
220         self.skin = head.skin;\r
221 \r
222         self.enemy = other; // individual player scoring\r
223         self.enemy_playerid = other.playerid;\r
224         dompoint_captured();\r
225 };\r
226 \r
227 /*QUAKED spawnfunc_dom_team (0 .5 .8) (-32 -32 -24) (32 32 32)\r
228 Team declaration for Domination gameplay, this allows you to decide what team\r
229 names and control point models are used in your map.\r
230 \r
231 Note: If you use spawnfunc_dom_team entities you must define at least 3 and only two\r
232 can have netname set!  The nameless team owns all control points at start.\r
233 \r
234 Keys:\r
235 "netname"\r
236  Name of the team (for example Red Team, Blue Team, Green Team, Yellow Team, Life, Death, etc)\r
237 "cnt"\r
238  Scoreboard color of the team (for example 4 is red and 13 is blue)\r
239 "model"\r
240  Model to use for control points owned by this team (for example\r
241  "progs/b_g_key.mdl" is a gold keycard, and "progs/b_s_key.mdl" is a silver\r
242  keycard)\r
243 "skin"\r
244  Skin of the model to use (for team skins on a single model)\r
245 "noise"\r
246  Sound to play when this team captures a point.\r
247  (this is a localized sound, like a small alarm or other effect)\r
248 "noise1"\r
249  Narrator speech to play when this team captures a point.\r
250  (this is a global sound, like "Red team has captured a control point")\r
251 */\r
252 \r
253 void spawnfunc_dom_team()\r
254 {\r
255         if(!g_domination || cvar("g_domination_teams_override") >= 2)\r
256         {\r
257                 remove(self);\r
258                 return;\r
259         }\r
260         precache_model(self.model);\r
261         if (self.noise != "")\r
262                 precache_sound(self.noise);\r
263         if (self.noise1 != "")\r
264                 precache_sound(self.noise1);\r
265         self.classname = "dom_team";\r
266         setmodel(self, self.model); // precision not needed\r
267         self.mdl = self.model;\r
268         self.dmg = self.modelindex;\r
269         self.model = "";\r
270         self.modelindex = 0;\r
271         // this would have to be changed if used in quakeworld\r
272         if(self.cnt)\r
273                 self.team = self.cnt + 1; // WHY are these different anyway?\r
274 };\r
275 \r
276 void dom_controlpoint_setup()\r
277 {\r
278         local entity head;\r
279         // find the spawnfunc_dom_team representing unclaimed points\r
280         head = find(world, classname, "dom_team");\r
281         while(head && head.netname != "")\r
282                 head = find(head, classname, "dom_team");\r
283         if (!head)\r
284                 objerror("no spawnfunc_dom_team with netname \"\" found\n");\r
285 \r
286         // copy important properties from spawnfunc_dom_team entity\r
287         self.goalentity = head;\r
288         setmodel(self, head.mdl); // precision already set\r
289         self.skin = head.skin;\r
290 \r
291         self.cnt = -1;\r
292 \r
293         if(!self.message)\r
294                 self.message = " has captured a control point";\r
295 \r
296         if(!self.DOMPOINTFRAGS)\r
297                 self.DOMPOINTFRAGS = 1;\r
298         if(!self.wait)\r
299                 self.wait = 5;\r
300 \r
301         if(!self.t_width)\r
302                 self.t_width = 0.02; // frame animation rate\r
303         if(!self.t_length)\r
304                 self.t_length = 239; // maximum frame\r
305 \r
306         self.think = dompointthink;\r
307         self.nextthink = time;\r
308         self.touch = dompointtouch;\r
309         self.solid = SOLID_TRIGGER;\r
310         self.flags = FL_ITEM;\r
311         setsize(self, '-32 -32 -32', '32 32 32');\r
312         setorigin(self, self.origin + '0 0 20');\r
313         droptofloor();\r
314 \r
315         waypoint_spawnforitem(self);\r
316         WaypointSprite_SpawnFixed("dom-neut", self.origin + '0 0 32', self, sprite);\r
317         WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, '0 1 1');\r
318 };\r
319 \r
320 \r
321 \r
322 // player has joined game, get him on a team\r
323 // depreciated\r
324 /*void dom_player_join_team(entity pl)\r
325 {\r
326         entity head;\r
327         float c1, c2, c3, c4, totalteams, smallestteam, smallestteam_count, selectedteam;\r
328         float balance_teams, force_balance, balance_type;\r
329 \r
330         balance_teams = cvar("g_balance_teams");\r
331         balance_teams = cvar("g_balance_teams_force");\r
332 \r
333         c1 = c2 = c3 = c4 = -1;\r
334         totalteams = 0;\r
335 \r
336         // first find out what teams are allowed\r
337         head = find(world, classname, "dom_team");\r
338         while(head)\r
339         {\r
340                 if(head.netname != "")\r
341                 {\r
342                         //if(head.team == pl.team)\r
343                         //      selected = head;\r
344                         if(head.team == COLOR_TEAM1)\r
345                         {\r
346                                         c1 = 0;\r
347                         }\r
348                         if(head.team == COLOR_TEAM2)\r
349                         {\r
350                                         c2 = 0;\r
351                         }\r
352                         if(head.team == COLOR_TEAM3)\r
353                         {\r
354                                         c3 = 0;\r
355                         }\r
356                         if(head.team == COLOR_TEAM4)\r
357                         {\r
358                                         c4 = 0;\r
359                         }\r
360                 }\r
361                 head = find(head, classname, "dom_team");\r
362         }\r
363 \r
364         // make sure there are at least 2 teams to join\r
365         if(c1 >= 0)\r
366                 totalteams = totalteams + 1;\r
367         if(c2 >= 0)\r
368                 totalteams = totalteams + 1;\r
369         if(c3 >= 0)\r
370                 totalteams = totalteams + 1;\r
371         if(c4 >= 0)\r
372                 totalteams = totalteams + 1;\r
373 \r
374         if(totalteams <= 1)\r
375                 error("dom_player_join_team: Too few teams available for domination\n");\r
376 \r
377         // whichever teams that are available are set to 0 instead of -1\r
378 \r
379         // if we don't care what team he ends up on, put him on whatever team he entered as.\r
380         // if he's not on a valid team, then put him on the smallest team\r
381         if(!balance_teams && !force_balance)\r
382         {\r
383                 if(     c1 >= 0 && pl.team == COLOR_TEAM1)\r
384                         selectedteam = pl.team;\r
385                 else if(c2 >= 0 && pl.team == COLOR_TEAM2)\r
386                         selectedteam = pl.team;\r
387                 else if(c3 >= 0 && pl.team == COLOR_TEAM3)\r
388                         selectedteam = pl.team;\r
389                 else if(c4 >= 0 && pl.team == COLOR_TEAM4)\r
390                         selectedteam = pl.team;\r
391                 else\r
392                         selectedteam = -1;\r
393                 if(selectedteam > 0)\r
394                 {\r
395                         SetPlayerColors(pl, selectedteam - 1);\r
396                         return;\r
397                 }\r
398                 // otherwise end up on the smallest team (handled below)\r
399         }\r
400 \r
401         // now count how many players are on each team already\r
402 \r
403         head = find(world, classname, "player");\r
404         while(head)\r
405         {\r
406                 //if(head.netname != "")\r
407                 {\r
408                         if(head.team == COLOR_TEAM1)\r
409                         {\r
410                                 if(c1 >= 0)\r
411                                         c1 = c1 + 1;\r
412                         }\r
413                         if(head.team == COLOR_TEAM2)\r
414                         {\r
415                                 if(c2 >= 0)\r
416                                         c2 = c2 + 1;\r
417                         }\r
418                         if(head.team == COLOR_TEAM3)\r
419                         {\r
420                                 if(c3 >= 0)\r
421                                         c3 = c3 + 1;\r
422                         }\r
423                         if(head.team == COLOR_TEAM4)\r
424                         {\r
425                                 if(c4 >= 0)\r
426                                         c4 = c4 + 1;\r
427                         }\r
428                 }\r
429                 head = find(head, classname, "player");\r
430         }\r
431 \r
432         // c1...c4 now have counts of each team\r
433         // figure out which is smallest, giving priority to the team the player is already on as a tie-breaker\r
434 \r
435         smallestteam = 0;\r
436         smallestteam_count = 999;\r
437 \r
438         // 2 gives priority to what team you're already on, 1 goes in order\r
439         balance_type = 1;\r
440 \r
441         if(balance_type == 1)\r
442         {\r
443                 if(c1 >= 0 && c1 < smallestteam_count)\r
444                 {\r
445                         smallestteam = 1;\r
446                         smallestteam_count = c1;\r
447                 }\r
448                 if(c2 >= 0 && c2 < smallestteam_count)\r
449                 {\r
450                         smallestteam = 2;\r
451                         smallestteam_count = c2;\r
452                 }\r
453                 if(c3 >= 0 && c3 < smallestteam_count)\r
454                 {\r
455                         smallestteam = 3;\r
456                         smallestteam_count = c3;\r
457                 }\r
458                 if(c4 >= 0 && c4 < smallestteam_count)\r
459                 {\r
460                         smallestteam = 4;\r
461                         smallestteam_count = c4;\r
462                 }\r
463         }\r
464         else\r
465         {\r
466                 if(c1 >= 0 && (c1 < smallestteam_count ||\r
467                                         (c1 == smallestteam_count && self.team == COLOR_TEAM1) ) )\r
468                 {\r
469                         smallestteam = 1;\r
470                         smallestteam_count = c1;\r
471                 }\r
472                 if(c2 >= 0 && c2 < (c2 < smallestteam_count ||\r
473                                         (c2 == smallestteam_count && self.team == COLOR_TEAM2) ) )\r
474                 {\r
475                         smallestteam = 2;\r
476                         smallestteam_count = c2;\r
477                 }\r
478                 if(c3 >= 0 && c3 < (c3 < smallestteam_count ||\r
479                                         (c3 == smallestteam_count && self.team == COLOR_TEAM3) ) )\r
480                 {\r
481                         smallestteam = 3;\r
482                         smallestteam_count = c3;\r
483                 }\r
484                 if(c4 >= 0 && c4 < (c4 < smallestteam_count ||\r
485                                         (c4 == smallestteam_count && self.team == COLOR_TEAM4) ) )\r
486                 {\r
487                         smallestteam = 4;\r
488                         smallestteam_count = c4;\r
489                 }\r
490         }\r
491 \r
492         if(smallestteam == 1)\r
493         {\r
494                 selectedteam = COLOR_TEAM1 - 1;\r
495         }\r
496         if(smallestteam == 2)\r
497         {\r
498                 selectedteam = COLOR_TEAM2 - 1;\r
499         }\r
500         if(smallestteam == 3)\r
501         {\r
502                 selectedteam = COLOR_TEAM3 - 1;\r
503         }\r
504         if(smallestteam == 4)\r
505         {\r
506                 selectedteam = COLOR_TEAM4 - 1;\r
507         }\r
508 \r
509         SetPlayerColors(pl, selectedteam);\r
510 }\r
511 */\r
512 /*QUAKED spawnfunc_dom_controlpoint (0 .5 .8) (-16 -16 -24) (16 16 32)\r
513 Control point for Domination gameplay.\r
514 */\r
515 void spawnfunc_dom_controlpoint()\r
516 {\r
517         if(!g_domination)\r
518         {\r
519                 remove(self);\r
520                 return;\r
521         }\r
522         self.think = dom_controlpoint_setup;\r
523         self.nextthink = time + 0.1;\r
524         self.reset = dom_controlpoint_setup;\r
525 \r
526         if(!self.scale)\r
527                 self.scale = 0.6;\r
528 \r
529         //if(!self.glow_size)\r
530         //      self.glow_size = cvar("g_domination_point_glow");\r
531         self.effects = self.effects | EF_LOWPRECISION;\r
532         if (cvar("g_domination_point_fullbright"))\r
533                 self.effects |= EF_FULLBRIGHT;\r
534 };\r
535 \r
536 // code from here on is just to support maps that don't have control point and team entities\r
537 void dom_spawnteam (string teamname, float teamcolor, string pointmodel, float pointskin, string capsound, string capnarration, string capmessage)\r
538 {\r
539         local entity oldself;\r
540         oldself = self;\r
541         self = spawn();\r
542         self.classname = "dom_team";\r
543         self.netname = teamname;\r
544         self.cnt = teamcolor;\r
545         self.model = pointmodel;\r
546         self.skin = pointskin;\r
547         self.noise = capsound;\r
548         self.noise1 = capnarration;\r
549         self.message = capmessage;\r
550 \r
551         // this code is identical to spawnfunc_dom_team\r
552         setmodel(self, self.model); // precision not needed\r
553         self.mdl = self.model;\r
554         self.dmg = self.modelindex;\r
555         self.model = "";\r
556         self.modelindex = 0;\r
557         // this would have to be changed if used in quakeworld\r
558         self.team = self.cnt + 1;\r
559 \r
560         //eprint(self);\r
561         self = oldself;\r
562 };\r
563 \r
564 void dom_spawnpoint(vector org)\r
565 {\r
566         local entity oldself;\r
567         oldself = self;\r
568         self = spawn();\r
569         self.classname = "dom_controlpoint";\r
570         self.think = spawnfunc_dom_controlpoint;\r
571         self.nextthink = time;\r
572         setorigin(self, org);\r
573         spawnfunc_dom_controlpoint();\r
574         self = oldself;\r
575 };\r
576 \r
577 // spawn some default teams if the map is not set up for domination\r
578 void dom_spawnteams()\r
579 {\r
580         float numteams;\r
581         if(cvar("g_domination_teams_override") < 2)\r
582                 numteams = cvar("g_domination_default_teams");\r
583         else\r
584                 numteams = cvar("g_domination_teams_override");\r
585         // LordHavoc: edit this if you want to change defaults\r
586         dom_spawnteam("Red", COLOR_TEAM1-1, "models/domination/dom_red.md3", 0, "domination/claim.wav", "", "Red team has captured a control point");\r
587         dom_spawnteam("Blue", COLOR_TEAM2-1, "models/domination/dom_blue.md3", 0, "domination/claim.wav", "", "Blue team has captured a control point");\r
588         if(numteams > 2)\r
589                 dom_spawnteam("Yellow", COLOR_TEAM3-1, "models/domination/dom_yellow.md3", 0, "domination/claim.wav", "", "Yellow team has captured a control point");\r
590         if(numteams > 3)\r
591                 dom_spawnteam("Pink", COLOR_TEAM4-1, "models/domination/dom_pink.md3", 0, "domination/claim.wav", "", "Pink team has captured a control point");\r
592         dom_spawnteam("", 0, "models/domination/dom_unclaimed.md3", 0, "", "", "");\r
593 };\r
594 \r
595 void dom_delayedinit()\r
596 {\r
597         local entity head;\r
598 \r
599         // if no teams are found, spawn defaults, if custom teams are set, use them\r
600         if (find(world, classname, "dom_team") == world || cvar("g_domination_teams_override") >= 2)\r
601                 dom_spawnteams();\r
602         // if no control points are found, spawn defaults\r
603         if (find(world, classname, "dom_controlpoint") == world)\r
604         {\r
605                 // here follow default domination points for each map\r
606                 /*\r
607                 if (world.model == "maps/e1m1.bsp")\r
608                 {\r
609                         dom_spawnpoint('0 0 0');\r
610                 }\r
611                 else\r
612                 */\r
613                 {\r
614                         // if no supported map was found, make every deathmatch spawn a point\r
615                         head = find(world, classname, "info_player_deathmatch");\r
616                         while (head)\r
617                         {\r
618                                 dom_spawnpoint(head.origin);\r
619                                 head = find(head, classname, "info_player_deathmatch");\r
620                         }\r
621                 }\r
622         }\r
623 \r
624         ScoreRules_dom();\r
625 };\r
626 \r
627 void dom_init()\r
628 {\r
629         // we have to precache default models/sounds even if they might not be\r
630         // used because spawnfunc_worldspawn is executed before any other entities are read,\r
631         // so we don't even know yet if this map is set up for domination...\r
632         precache_model("models/domination/dom_red.md3");\r
633         precache_model("models/domination/dom_blue.md3");\r
634         precache_model("models/domination/dom_yellow.md3");\r
635         precache_model("models/domination/dom_pink.md3");\r
636         precache_model("models/domination/dom_unclaimed.md3");\r
637         precache_sound("domination/claim.wav");\r
638         InitializeEntity(world, dom_delayedinit, INITPRIO_GAMETYPE);\r
639 \r
640         // teamplay is always on in domination, defaults to hurt self but not teammates\r
641         //if(!teams_matter)\r
642         //      cvar_set("teamplay", "3");\r
643 };\r
644 \r