Xonotic
sv_domination.qc
Go to the documentation of this file.
1 #include "sv_domination.qh"
2 
3 #include <server/client.qh>
4 #include <server/command/vote.qh>
5 #include <server/damage.qh>
6 #include <server/gamelog.qh>
7 #include <server/items/items.qh>
8 #include <server/teamplay.qh>
9 #include <server/world.qh>
12 
14 
23 
24 void dom_EventLog(string mode, float team_before, entity actor) // use an alias for easy changing and quick editing later
25 {
27  GameLogEcho(strcat(":dom:", mode, ":", ftos(team_before), ((actor != NULL) ? (strcat(":", ftos(actor.playerid))) : "")));
28 }
29 
31 {
32  STAT(DOM_TOTAL_PPS, e) = total_pps;
33  STAT(DOM_PPS_RED, e) = pps_red;
34  STAT(DOM_PPS_BLUE, e) = pps_blue;
35  if(domination_teams >= 3)
36  STAT(DOM_PPS_YELLOW, e) = pps_yellow;
37  if(domination_teams >= 4)
38  STAT(DOM_PPS_PINK, e) = pps_pink;
39 }
40 
42 {
43  float old_delay, old_team, real_team;
44 
45  // now that the delay has expired, switch to the latest team to lay claim to this point
46  entity head = this.owner;
47 
48  real_team = this.cnt;
49  this.cnt = -1;
50 
51  dom_EventLog("taken", this.team, this.dmg_inflictor);
52  this.dmg_inflictor = NULL;
53 
54  this.goalentity = head;
55  this.model = head.mdl;
56  this.modelindex = head.dmg;
57  this.skin = head.skin;
58 
59  float points, wait_time;
62  else
63  points = this.frags;
66  else
67  wait_time = this.wait;
68 
70  bprint(sprintf("^3%s^3%s\n", head.netname, this.message));
71  else
72  Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_DOMINATION_CAPTURE_TIME, head.netname, this.message, points, wait_time);
73 
74  if(this.enemy.playerid == this.enemy_playerid)
75  GameRules_scoring_add(this.enemy, DOM_TAKES, 1);
76  else
77  this.enemy = NULL;
78 
79  if (head.noise != "")
80  {
81  if(this.enemy)
82  _sound(this.enemy, CH_TRIGGER, head.noise, VOL_BASE, ATTEN_NORM);
83  else
84  _sound(this, CH_TRIGGER, head.noise, VOL_BASE, ATTEN_NORM);
85  }
86  if (head.noise1 != "")
87  play2all(head.noise1);
88 
89  this.delay = time + wait_time;
90 
91  // do trigger work
92  old_delay = this.delay;
93  old_team = this.team;
94  this.team = real_team;
95  this.delay = 0;
96  SUB_UseTargets (this, this, NULL);
97  this.delay = old_delay;
98  this.team = old_team;
99 
100  entity msg = WP_DomNeut;
101  switch(real_team)
102  {
103  case NUM_TEAM_1: msg = WP_DomRed; break;
104  case NUM_TEAM_2: msg = WP_DomBlue; break;
105  case NUM_TEAM_3: msg = WP_DomYellow; break;
106  case NUM_TEAM_4: msg = WP_DomPink; break;
107  }
108 
109  WaypointSprite_UpdateSprites(this.sprite, msg, WP_Null, WP_Null);
110 
111  total_pps = 0, pps_red = 0, pps_blue = 0, pps_yellow = 0, pps_pink = 0;
112  IL_EACH(g_dompoints, true,
113  {
116  else
117  points = it.frags;
120  else
121  wait_time = it.wait;
122  switch(it.goalentity.team)
123  {
124  case NUM_TEAM_1: pps_red += points/wait_time; break;
125  case NUM_TEAM_2: pps_blue += points/wait_time; break;
126  case NUM_TEAM_3: pps_yellow += points/wait_time; break;
127  case NUM_TEAM_4: pps_pink += points/wait_time; break;
128  }
129  total_pps += points/wait_time;
130  });
131 
132  WaypointSprite_UpdateTeamRadar(this.sprite, RADARICON_DOMPOINT, colormapPaletteColor(this.goalentity.team - 1, 0));
133  WaypointSprite_Ping(this.sprite);
134 
135  this.captime = time;
136 
138 }
139 
141 {
142  if(this.pain_finished > time)
143  return;
144  this.pain_finished = time + this.t_width;
145  if(this.nextthink > this.pain_finished)
146  this.nextthink = this.pain_finished;
147 
148  this.frame = this.frame + 1;
149  if(this.frame > this.t_length)
150  this.frame = 0;
151 }
152 
154 {
155  float fragamt;
156 
157  this.nextthink = time + 0.1;
158 
159  //this.frame = this.frame + 1;
160  //if(this.frame > 119)
161  // this.frame = 0;
162  AnimateDomPoint(this);
163 
164  // give points
165 
166  if (game_stopped || this.delay > time || time < game_starttime) // game has ended, don't keep giving points
167  return;
168 
171  else
172  this.delay = time + this.wait;
173 
174  // give credit to the team
175  // NOTE: this defaults to 0
177  if (this.goalentity.netname != "")
178  {
181  else
182  fragamt = this.frags;
183  TeamScore_AddToTeam(this.goalentity.team, ST_SCORE, fragamt);
184  TeamScore_AddToTeam(this.goalentity.team, ST_DOM_TICKS, fragamt);
185 
186  // give credit to the individual player, if he is still there
187  if (this.enemy.playerid == this.enemy_playerid)
188  {
189  GameRules_scoring_add(this.enemy, SCORE, fragamt);
190  GameRules_scoring_add(this.enemy, DOM_TICKS, fragamt);
191  }
192  else
193  this.enemy = NULL;
194  }
195 }
196 
197 void dompointtouch(entity this, entity toucher)
198 {
199  if(!IS_PLAYER(toucher))
200  return;
201  if(GetResource(toucher, RES_HEALTH) < 1)
202  return;
203 
205  return;
206 
207  if(time < this.captime + 0.3)
208  return;
209 
210  // only valid teams can claim it
211  entity head = find(NULL, classname, "dom_team");
212  while (head && head.team != toucher.team)
213  head = find(head, classname, "dom_team");
214  if (!head || head.netname == "" || head == this.goalentity)
215  return;
216 
217  // delay capture
218 
219  this.team = this.goalentity.team; // this stores the PREVIOUS team!
220 
221  this.cnt = toucher.team;
222  this.owner = head; // team to switch to after the delay
223  this.dmg_inflictor = toucher;
224 
225  // this.state = 1;
226  // this.delay = time + cvar("g_domination_point_capturetime");
227  //this.nextthink = time + cvar("g_domination_point_capturetime");
228  //this.think = dompoint_captured;
229 
230  // go to neutral team in the mean time
231  head = find(NULL, classname, "dom_team");
232  while (head && head.netname != "")
233  head = find(head, classname, "dom_team");
234  if(head == NULL)
235  return;
236 
237  WaypointSprite_UpdateSprites(this.sprite, WP_DomNeut, WP_Null, WP_Null);
238  WaypointSprite_UpdateTeamRadar(this.sprite, RADARICON_DOMPOINT, '0 1 1');
239  WaypointSprite_Ping(this.sprite);
240 
241  this.goalentity = head;
242  this.model = head.mdl;
243  this.modelindex = head.dmg;
244  this.skin = head.skin;
245 
246  this.enemy = toucher; // individual player scoring
247  this.enemy_playerid = toucher.playerid;
248  dompoint_captured(this);
249 }
250 
252 {
253  entity head;
254  // find the spawnfunc_dom_team representing unclaimed points
255  head = find(NULL, classname, "dom_team");
256  while(head && head.netname != "")
257  head = find(head, classname, "dom_team");
258  if (!head)
259  objerror(this, "no spawnfunc_dom_team with netname \"\" found\n");
260 
261  // copy important properties from spawnfunc_dom_team entity
262  this.goalentity = head;
263  _setmodel(this, head.mdl); // precision already set
264  this.skin = head.skin;
265 
266  this.cnt = -1;
267 
268  if(this.message == "")
269  this.message = " has captured a control point";
270 
271  if(this.frags <= 0)
272  this.frags = 1;
273  if(this.wait <= 0)
274  this.wait = 5;
275 
276  float points, waittime;
279  else
280  points = this.frags;
283  else
284  waittime = this.wait;
285 
286  total_pps += points/waittime;
287 
288  if(!this.t_width)
289  this.t_width = 0.02; // frame animation rate
290  if(!this.t_length)
291  this.t_length = 239; // maximum frame
292 
293  setthink(this, dompointthink);
294  this.nextthink = time;
295  settouch(this, dompointtouch);
296  this.solid = SOLID_TRIGGER;
297  if(!this.flags & FL_ITEM)
298  IL_PUSH(g_items, this);
299  this.flags = FL_ITEM;
300  setsize(this, '-32 -32 -32', '32 32 32');
301  setorigin(this, this.origin + '0 0 20');
302  droptofloor(this);
303 
304  waypoint_spawnforitem(this);
305  WaypointSprite_SpawnFixed(WP_DomNeut, this.origin + '0 0 32', this, sprite, RADARICON_DOMPOINT);
306 }
307 
310 {
312  for (int i = 1; i <= NUM_TEAMS; ++i)
313  {
315  }
316  IL_EACH(g_dompoints, true,
317  {
319  if (!Entity_HasValidTeam(it.goalentity))
320  {
321  continue;
322  }
323  entity team_ = Entity_GetTeam(it.goalentity);
324  int num_control_points = Team_GetNumberOfOwnedItems(team_);
325  ++num_control_points;
326  Team_SetNumberOfOwnedItems(team_, num_control_points);
327  });
328 }
329 
331 {
333  {
334  Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_OVER);
335  Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_OVER);
336 
337  game_stopped = true;
339  return true;
340  }
341 
344  if (winner_team == -1)
345  return 0;
346 
347  if(winner_team > 0)
348  {
349  Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, APP_TEAM_NUM(winner_team, CENTER_ROUND_TEAM_WIN));
350  Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(winner_team, INFO_ROUND_TEAM_WIN));
351  TeamScore_AddToTeam(winner_team, ST_DOM_CAPS, +1);
352  }
353 
354  game_stopped = true;
356 
357  return true;
358 }
359 
361 {
362  return true;
363 }
364 
366 {
367  FOREACH_CLIENT(IS_PLAYER(it), { it.player_blocked = false; });
368 }
369 
370 //go to best items, or control points you don't own
371 void havocbot_goalrating_controlpoints(entity this, float ratingscale, vector org, float sradius)
372 {
373  IL_EACH(g_dompoints, vdist((((it.absmin + it.absmax) * 0.5) - org), <, sradius),
374  {
375  if(it.cnt > -1) // this is just being fought
376  navigation_routerating(this, it, ratingscale, 5000);
377  else if(it.goalentity.cnt == 0) // unclaimed
378  navigation_routerating(this, it, ratingscale, 5000);
379  else if(it.goalentity.team != this.team) // other team's point
380  navigation_routerating(this, it, ratingscale, 5000);
381  });
382 }
383 
385 {
386  if(IS_DEAD(this))
387  return;
388 
390  {
392  havocbot_goalrating_controlpoints(this, 10000, this.origin, 15000);
393  havocbot_goalrating_items(this, 20000, this.origin, 8000);
394  //havocbot_goalrating_enemyplayers(this, 1500, this.origin, 2000);
395  havocbot_goalrating_waypoints(this, 1, this.origin, 3000);
397 
399  }
400 }
401 
403 {
404  // fallback?
405  M_ARGV(0, float) = domination_teams;
406  string ret_string = "dom_team";
407 
408  entity head = find(NULL, classname, ret_string);
409  while(head)
410  {
411  if(head.netname != "")
412  {
413  if (Team_IsValidTeam(head.team))
414  {
415  M_ARGV(0, float) |= Team_TeamToBit(head.team);
416  }
417  }
418 
419  head = find(head, classname, ret_string);
420  }
421 
422  M_ARGV(1, string) = string_null;
423 
424  return true;
425 }
426 
427 MUTATOR_HOOKFUNCTION(dom, reset_map_players)
428 {
429  total_pps = 0, pps_red = 0, pps_blue = 0, pps_yellow = 0, pps_pink = 0;
431  PutClientInServer(it);
433  it.player_blocked = 1;
434  if(IS_REAL_CLIENT(it))
435  set_dom_state(it);
436  });
437  return true;
438 }
439 
440 MUTATOR_HOOKFUNCTION(dom, PlayerSpawn)
441 {
442  entity player = M_ARGV(0, entity);
443 
445  player.player_blocked = !round_handler_IsRoundStarted();
446 }
447 
449 {
450  entity player = M_ARGV(0, entity);
451 
452  set_dom_state(player);
453 }
454 
455 MUTATOR_HOOKFUNCTION(dom, HavocBot_ChooseRole)
456 {
457  entity bot = M_ARGV(0, entity);
458 
459  bot.havocbot_role = havocbot_role_dom;
460  return true;
461 }
462 
463 /*QUAKED spawnfunc_dom_controlpoint (0 .5 .8) (-16 -16 -24) (16 16 32)
464 Control point for Domination gameplay.
465 */
466 spawnfunc(dom_controlpoint)
467 {
468  if(!g_domination)
469  {
470  delete(this);
471  return;
472  }
474  this.nextthink = time + 0.1;
475  this.reset = dom_controlpoint_setup;
476 
477  if(!this.scale)
478  this.scale = 0.6;
479 
480  this.effects = this.effects | EF_LOWPRECISION;
482  this.effects |= EF_FULLBRIGHT;
483 
484  IL_PUSH(g_dompoints, this);
485 }
486 
487 /*QUAKED spawnfunc_dom_team (0 .5 .8) (-32 -32 -24) (32 32 32)
488 Team declaration for Domination gameplay, this allows you to decide what team
489 names and control point models are used in your map.
490 
491 Note: If you use spawnfunc_dom_team entities you must define at least 3 and only two
492 can have netname set! The nameless team owns all control points at start.
493 
494 Keys:
495 "netname"
496  Name of the team (for example Red Team, Blue Team, Green Team, Yellow Team, Life, Death, etc)
497 "cnt"
498  Scoreboard color of the team (for example 4 is red and 13 is blue)
499 "model"
500  Model to use for control points owned by this team (for example
501  "progs/b_g_key.mdl" is a gold keycard, and "progs/b_s_key.mdl" is a silver
502  keycard)
503 "skin"
504  Skin of the model to use (for team skins on a single model)
505 "noise"
506  Sound to play when this team captures a point.
507  (this is a localized sound, like a small alarm or other effect)
508 "noise1"
509  Narrator speech to play when this team captures a point.
510  (this is a global sound, like "Red team has captured a control point")
511 */
512 
513 spawnfunc(dom_team)
514 {
516  {
517  delete(this);
518  return;
519  }
520  precache_model(this.model);
521  if (this.noise != "")
522  precache_sound(this.noise);
523  if (this.noise1 != "")
524  precache_sound(this.noise1);
525  _setmodel(this, this.model); // precision not needed
526  this.mdl = this.model;
527  this.dmg = this.modelindex;
528  this.model = "";
529  this.modelindex = 0;
530  // this would have to be changed if used in quakeworld
531  if(this.cnt)
532  this.team = this.cnt + 1; // WHY are these different anyway?
533 }
534 
535 // scoreboard setup
537 {
539  {
541  field_team(ST_DOM_CAPS, "caps", SFL_SORT_PRIO_PRIMARY);
542  field(SP_DOM_TAKES, "takes", 0);
543  });
544  }
545  else
546  {
547  float sp_domticks, sp_score;
548  sp_score = sp_domticks = 0;
550  sp_domticks = SFL_SORT_PRIO_PRIMARY;
551  else
552  sp_score = SFL_SORT_PRIO_PRIMARY;
553  GameRules_scoring(teams, sp_score, sp_score, {
554  field_team(ST_DOM_TICKS, "ticks", sp_domticks);
555  field(SP_DOM_TICKS, "ticks", sp_domticks);
556  field(SP_DOM_TAKES, "takes", 0);
557  });
558  }
559 }
560 
561 // code from here on is just to support maps that don't have control point and team entities
562 void dom_spawnteam(string teamname, float teamcolor, string pointmodel, float pointskin, Sound capsound, string capnarration, string capmessage)
563 {
564  TC(Sound, capsound);
565  entity e = new_pure(dom_team);
566  e.netname = strzone(teamname);
567  e.cnt = teamcolor;
568  e.model = pointmodel;
569  e.skin = pointskin;
570  e.noise = strzone(Sound_fixpath(capsound));
571  e.noise1 = strzone(capnarration);
572  e.message = strzone(capmessage);
573 
574  // this code is identical to spawnfunc_dom_team
575  _setmodel(e, e.model); // precision not needed
576  e.mdl = e.model;
577  e.dmg = e.modelindex;
578  e.model = "";
579  e.modelindex = 0;
580  // this would have to be changed if used in quakeworld
581  e.team = e.cnt + 1;
582 
583  //eprint(e);
584 }
585 
587 {
588  entity e = spawn();
589  setthink(e, spawnfunc_dom_controlpoint);
590  e.nextthink = time;
591  setorigin(e, org);
592  spawnfunc_dom_controlpoint(e);
593 }
594 
595 // spawn some default teams if the map is not set up for domination
597 {
598  TC(int, teams);
599  dom_spawnteam(Team_ColoredFullName(NUM_TEAM_1), NUM_TEAM_1-1, "models/domination/dom_red.md3", 0, SND_DOM_CLAIM, "", "Red team has captured a control point");
600  dom_spawnteam(Team_ColoredFullName(NUM_TEAM_2), NUM_TEAM_2-1, "models/domination/dom_blue.md3", 0, SND_DOM_CLAIM, "", "Blue team has captured a control point");
601  if(teams >= 3)
602  dom_spawnteam(Team_ColoredFullName(NUM_TEAM_3), NUM_TEAM_3-1, "models/domination/dom_yellow.md3", 0, SND_DOM_CLAIM, "", "Yellow team has captured a control point");
603  if(teams >= 4)
604  dom_spawnteam(Team_ColoredFullName(NUM_TEAM_4), NUM_TEAM_4-1, "models/domination/dom_pink.md3", 0, SND_DOM_CLAIM, "", "Pink team has captured a control point");
605  dom_spawnteam("", 0, "models/domination/dom_unclaimed.md3", 0, SND_Null, "", "");
606 }
607 
608 void dom_DelayedInit(entity this) // Do this check with a delay so we can wait for teams to be set up.
609 {
610  // if no teams are found, spawn defaults
611  if(find(NULL, classname, "dom_team") == NULL || autocvar_g_domination_teams_override >= 2)
612  {
613  LOG_TRACE("No \"dom_team\" entities found on this map, creating them anyway.");
615  if (domination_teams < 2)
619  }
620 
622  int teams = TeamBalance_GetAllowedTeams(balance);
623  TeamBalance_Destroy(balance);
625 
627 
629 
631  {
634  }
635 }
636 
638 {
639  g_domination = true;
640  g_dompoints = IL_NEW();
641 
642  InitializeEntity(NULL, dom_DelayedInit, INITPRIO_GAMETYPE);
643 }
const int NUM_TEAMS
Number of teams in the game.
Definition: teams.qh:3
bool autocvar_g_domination_disable_frags
int Team_GetWinnerTeam_WithOwnedItems(int min_control_points)
Returns the winner team.
Definition: teamplay.qc:123
int autocvar_g_domination_point_amt
#define APP_TEAM_NUM(num, prefix)
Definition: all.qh:85
#define round_handler_IsActive()
#define GameRules_scoring(teams, spprio, stprio, fields)
Definition: sv_rules.qh:53
#define IL_EACH(this, cond, body)
void Domination_RoundStart()
void navigation_goalrating_start(entity this)
Definition: navigation.qc:1830
entity sprite
Definition: sv_assault.qc:11
float autocvar_g_domination_round_timelimit
string string_null
Definition: nil.qh:9
const int NUM_TEAM_2
Definition: teams.qh:19
void havocbot_goalrating_items(entity this, float ratingscale, vector org, float sradius)
Definition: roles.qc:106
void Domination_count_controlpoints()
skin
Definition: ent_cs.qc:143
void ClientConnect(entity this)
ClientConnect
Definition: client.qc:1096
string noise
Definition: progsdefs.qc:209
const int ST_SCORE
Definition: scores.qh:151
void navigation_goalrating_end(entity this)
Definition: navigation.qc:1845
IntrusiveList g_dompoints
Definition: sv_domination.qh:9
#define Sound_fixpath(this)
Definition: sound.qh:141
void ScoreRules_dom(int teams)
void round_handler_Spawn(bool() canRoundStart_func, bool() canRoundEnd_func, void() roundStart_func)
float modelindex
Definition: csprogsdefs.qc:91
const float ST_DOM_CAPS
int team
Definition: main.qh:157
bool autocvar_g_domination_roundbased
Definition: sv_domination.qh:5
#define IL_NEW()
float TeamScore_AddToTeam(int t, float scorefield, float score)
Adds a score to the given team.
Definition: scores.qc:108
void TeamBalance_Destroy(entity balance)
Destroy the team balance entity.
Definition: teamplay.qc:627
entity() spawn
#define FOREACH_CLIENT(cond, body)
Definition: utils.qh:49
#define GameRules_scoring_add(client, fld, value)
Definition: sv_rules.qh:78
void SUB_UseTargets(entity this, entity actor, entity trigger)
Definition: triggers.qc:366
const int SFL_SORT_PRIO_PRIMARY
Definition: scores.qh:127
int total_control_points
bool autocvar_g_domination_point_fullbright
float autocvar_g_domination_point_rate
float dmg
Definition: platforms.qh:6
origin
Definition: ent_cs.qc:114
#define droptofloor
Definition: pre.qh:5
string classname
Definition: csprogsdefs.qc:107
#define round_handler_IsRoundStarted()
float FL_ITEM
Definition: progsdefs.qc:239
float total_pps
int autocvar_g_domination_teams_override
float effects
Definition: csprogsdefs.qc:111
int Team_GetNumberOfOwnedItems(entity team_ent)
Returns the number of items owned by a team.
Definition: teamplay.qc:138
entity Entity_GetTeam(entity this)
Returns the team entity of the given entity.
Definition: teamplay.qc:181
entity owner
Definition: main.qh:73
string model
Definition: csprogsdefs.qc:108
void Team_SetNumberOfOwnedItems(entity team_ent, int number)
Sets the number of items owned by a team.
Definition: teamplay.qc:143
void havocbot_role_dom(entity this)
#define IS_REAL_CLIENT(v)
Definition: utils.qh:17
bool g_domination
entity teams
Definition: main.qh:44
float pps_yellow
RES_HEALTH
Definition: ent_cs.qc:126
bool Entity_HasValidTeam(entity this)
Returns whether the given entity belongs to a valid team.
Definition: teamplay.qc:171
const float EF_FULLBRIGHT
Definition: csprogsdefs.qc:303
float domination_teams
float domination_roundbased
entity enemy
Definition: sv_ctf.qh:143
int TeamBalance_GetAllowedTeams(entity balance)
Returns the bitmask of allowed teams.
Definition: teamplay.qc:640
float cnt
Definition: powerups.qc:24
float pps_pink
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
entity dmg_inflictor
Definition: progsdefs.qc:200
void dom_EventLog(string mode, float team_before, entity actor)
bool navigation_goalrating_timeout(entity this)
Definition: navigation.qc:43
spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 f1 s1 strcat(_("Level %s: "), "^BG%s\3\, _("^BGPress ^F2%s^BG to enter the game"))
void dompointthink(entity this)
const int CH_TRIGGER
Definition: sound.qh:12
spawnfunc(dom_controlpoint)
IntrusiveList g_items
Definition: items.qh:126
entity goalentity
Definition: progsdefs.qc:189
float wait
Definition: subs.qh:39
float delay
Definition: subs.qh:38
string noise1
Definition: progsdefs.qc:209
void dom_spawnpoint(vector org)
string message
Definition: powerups.qc:19
#define NULL
Definition: post.qh:17
int autocvar_g_domination_default_teams
const float VOL_BASE
Definition: sound.qh:36
#define TC(T, sym)
Definition: _all.inc:82
frags
Definition: ent_cs.qc:151
MUTATOR_HOOKFUNCTION(dom, TeamBalance_CheckAllowedTeams)
#define round_handler_GetEndTime()
void dom_Initialize()
void GameLogEcho(string s)
Definition: gamelog.qc:12
const float ST_DOM_TICKS
Definition: sound.qh:119
#define M_ARGV(x, type)
Definition: events.qh:17
#define IS_DEAD(s)
Definition: utils.qh:26
const float ATTEN_NORM
Definition: sound.qh:30
entity Team_GetTeamFromIndex(int index)
Returns the global team entity at the given index.
Definition: teamplay.qc:57
float nextthink
Definition: csprogsdefs.qc:121
void navigation_goalrating_timeout_set(entity this)
Definition: navigation.qc:19
void dompointtouch(entity this, entity toucher)
float scale
Definition: projectile.qc:14
vector(float skel, float bonenum) _skel_get_boneabs_hidden
float t_width
Definition: subs.qh:33
const int NUM_TEAM_4
Definition: teams.qh:21
void dompoint_captured(entity this)
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
Definition: cl_resources.qc:10
float pain_finished
float flags
Definition: csprogsdefs.qc:129
void InitializeEntity(entity e, void(entity this) func, int order)
Definition: world.qc:2146
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition: vector.qh:8
void dom_DelayedInit(entity this)
#define LOG_TRACE(...)
Definition: log.qh:81
void havocbot_goalrating_controlpoints(entity this, float ratingscale, vector org, float sradius)
float pps_red
#define _sound(e, c, s, v, a)
Definition: sound.qh:50
float autocvar_g_domination_warmup
const float SOLID_TRIGGER
Definition: csprogsdefs.qc:245
void havocbot_goalrating_waypoints(entity this, float ratingscale, vector org, float sradius)
Definition: roles.qc:16
float frame
primary framegroup animation (strength = 1 - lerpfrac - lerpfrac3 - lerpfrac4)
Definition: anim.qh:6
bool Domination_CheckWinner()
bool Domination_CheckPlayers()
#define new_pure(class)
purely logical entities (.origin doesn&#39;t work)
Definition: oo.qh:62
setorigin(ent, v)
#define setthink(e, f)
PutClientInServer(this)
const int NUM_TEAM_1
Definition: teams.qh:18
float captime
entity TeamBalance_CheckAllowedTeams(entity for_whom)
Checks whether the player can join teams according to global configuration and mutator settings...
Definition: teamplay.qc:487
void set_dom_state(entity e)
void dom_spawnteams(int teams)
void waypoint_spawnforitem(entity e)
Definition: waypoints.qc:2007
bool autocvar_sv_eventlog
Definition: gamelog.qh:3
float enemy_playerid
float t_length
Definition: subs.qh:33
float time
Definition: csprogsdefs.qc:16
void AnimateDomPoint(entity this)
void round_handler_Init(float the_delay, float the_count, float the_round_timelimit)
#define Team_ColoredFullName(teamid)
Definition: teams.qh:230
float pps_blue
void dom_spawnteam(string teamname, float teamcolor, string pointmodel, float pointskin, Sound capsound, string capnarration, string capmessage)
int Team_TeamToBit(int team_num)
Converts team value into bit value that is used in team bitmasks.
Definition: teams.qh:199
bool Team_IsValidTeam(int team_num)
Returns whether team value is valid.
Definition: teams.qh:133
void dom_controlpoint_setup(entity this)
#define IS_PLAYER(v)
Definition: utils.qh:9
#define colormapPaletteColor(c, isPants)
Definition: color.qh:5
float EF_LOWPRECISION
const int NUM_TEAM_3
Definition: teams.qh:20
float solid
Definition: csprogsdefs.qc:99