Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
sv_lms.qc
Go to the documentation of this file.
1#include "sv_lms.qh"
2
4#include <server/campaign.qh>
6#include <server/world.qh>
8
29
33bool lms_visible_leaders = true; // triggers lms_visible_leaders_time update in the first frame
36
37// main functions
39{
40 int fl = floor(autocvar_fraglimit);
41 if(fl == 0 || fl > 999)
42 fl = 999;
43
44 // first player has left the game for dying too much? Nobody else can get in.
45 if(lms_lowest_lives < 1)
46 return 0;
47
50 return 0;
51
52 return bound(1, lms_lowest_lives, fl);
53}
54
55void ClearWinners();
56
57// LMS winning condition: game terminates if and only if there's at most one
58// one player who's living lives. Top two scores being equal cancels the time
59// limit.
61{
63 return WINNING_NO;
64
65 entity first_player = NULL;
66 int totalplayers = 0;
67 int totalplayed = 0;
68 FOREACH_CLIENT(true, {
69 if (IS_PLAYER(it) && it.frags == FRAGS_PLAYER)
70 {
71 if (!totalplayers)
72 first_player = it;
73 ++totalplayers;
74 }
75 else if (GameRules_scoring_add(it, LMS_RANK, 0))
76 ++totalplayed;
77 });
78
79 if (totalplayers)
80 {
81 if (totalplayers > 1)
82 {
83 // two or more active players - continue with the game
84
86 {
88 float pl_lives = GameRules_scoring_add(it, LMS_LIVES, 0);
89 if (!pl_lives)
90 return WINNING_YES; // human player lost, game over
91 break;
92 });
93 }
94 }
95 else
96 {
97 // exactly one player?
98
100
101 if (LMS_NewPlayerLives())
102 {
103 if (totalplayed && game_starttime > 0 && time > game_starttime + autocvar_g_lms_forfeit_min_match_time) // give players time to join
104 {
105 GameRules_scoring_add(first_player, LMS_RANK, 1);
106 first_player.winning = 1;
107 return WINNING_YES;
108 }
109 // game still running (that is, nobody got removed from the game by a frag yet)? then continue
110 return WINNING_NO;
111 }
112 else
113 {
114 // a winner!
115 // and assign them their first place
116 GameRules_scoring_add(first_player, LMS_RANK, 1);
117 first_player.winning = 1;
118 return WINNING_YES;
119 }
120 }
121 }
122 else
123 {
124 // nobody is playing at all...
125 if (LMS_NewPlayerLives())
126 {
127 if (totalplayed && game_starttime > 0 && time > game_starttime + autocvar_g_lms_forfeit_min_match_time) // give players time to join
128 {
129 ClearWinners();
130 return WINNING_YES;
131 }
132 // wait for players...
133 }
134 else
135 {
136 // SNAFU (maybe a draw game?)
137 ClearWinners();
138 LOG_TRACE("No players, ending game.");
139 return WINNING_YES;
140 }
141 }
142
143 // When we get here, we have at least two players who are actually LIVING,
144 // now check if the top two players have equal score.
146
147 ClearWinners();
149 WinningConditionHelper_winner.winning = true;
151 return WINNING_NEVER;
152
153 // Top two have different scores? Way to go for our beloved TIMELIMIT!
154 return WINNING_NO;
155}
156
157// runs on waypoints which are attached to leaders, updates once per frame
159{
160 if(view.lms_leader)
161 if(IS_SPEC(player))
162 return false; // we don't want spectators of leaders to see the attached waypoint on the top of their screen
163
165 return false;
166
167 return true;
168}
169
172{
173 int max_lives = 0;
174 int pl_cnt = 0;
176 int lives = GameRules_scoring_add(it, LMS_LIVES, 0);
177 if (lives > max_lives)
178 max_lives = lives;
179 pl_cnt++;
180 });
181
182 int second_max_lives = 0;
183 int pl_cnt_with_max_lives = 0;
185 int lives = GameRules_scoring_add(it, LMS_LIVES, 0);
186 if (lives == max_lives)
187 pl_cnt_with_max_lives++;
188 else if (lives > second_max_lives)
189 second_max_lives = lives;
190 });
191
192 lms_leaders_lives_diff = max_lives - second_max_lives;
193
194 int lives_diff = autocvar_g_lms_leader_lives_diff;
195 if (lms_leaders_lives_diff >= lives_diff && pl_cnt_with_max_lives <= pl_cnt * autocvar_g_lms_leader_minpercent)
197 int lives = GameRules_scoring_add(it, LMS_LIVES, 0);
198 if (lives == max_lives)
199 {
200 if (!it.lms_leader)
201 it.lms_leader = true;
202 }
203 else
204 {
205 it.lms_leader = false;
206 }
207 });
208 else
210 if (it.waypointsprite_attachedforcarrier)
211 WaypointSprite_Kill(it.waypointsprite_attachedforcarrier);
212 it.lms_leader = false;
213 });
214}
215
216// mutator hooks
217MUTATOR_HOOKFUNCTION(lms, reset_map_global)
218{
219 lms_lowest_lives = 999;
220}
221
222MUTATOR_HOOKFUNCTION(lms, reset_map_players)
223{
224 FOREACH_CLIENT(true, {
225 if (it.frags == FRAGS_PLAYER_OUT_OF_GAME)
226 it.frags = FRAGS_PLAYER;
227
228 CS(it).killcount = 0;
230 it.lms_spectate = false;
231 GameRules_scoring_add(it, LMS_RANK, -GameRules_scoring_add(it, LMS_RANK, 0));
232 GameRules_scoring_add(it, LMS_LIVES, -GameRules_scoring_add(it, LMS_LIVES, 0));
233
234 if (it.frags != FRAGS_PLAYER)
235 continue;
236
237 TRANSMUTE(Player, it);
239 it.lms_leader = false;
240 if (it.waypointsprite_attachedforcarrier)
241 WaypointSprite_Kill(it.waypointsprite_attachedforcarrier);
242 });
243}
244
245// FIXME add support for sv_ready_restart_after_countdown
246// that is find a way to respawn/reset players IN GAME without setting lives to 0
247MUTATOR_HOOKFUNCTION(lms, ReadLevelCvars)
248{
249 // incompatible
251}
252
253// returns true if player is added to the game
255{
256 if (!INGAME(player))
257 {
258 int lives = GameRules_scoring_add(player, LMS_LIVES, LMS_NewPlayerLives());
259 if(lives <= 0)
260 return false;
261 if (time < game_starttime)
263 else
264 INGAME_STATUS_SET(player, INGAME_STATUS_JOINING); // this is just to delay setting health and armor that can't be done here
265 }
267 {
268 player.lms_spectate = false;
269 GameRules_scoring_add(player, LMS_RANK, -GameRules_scoring_add(player, LMS_RANK, 0));
270 int lives = GameRules_scoring_add(player, LMS_LIVES, 0);
271 if(lives <= 0)
272 GameRules_scoring_add(player, LMS_LIVES, LMS_NewPlayerLives());
273 }
274 else
275 {
276 if(GameRules_scoring_add(player, LMS_LIVES, 0) <= 0)
277 {
278 Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_LMS_NOLIVES);
279 return false;
280 }
281 }
282 return true;
283}
284
286{
287 entity player = M_ARGV(0, entity);
288 if (!warmup_stage && (IS_BOT_CLIENT(player) || CS(player).jointime != time))
289 {
290 if (GameRules_scoring_add(player, LMS_RANK, 0) || !lms_AddPlayer(player))
291 TRANSMUTE(Observer, player);
292 }
293}
294
298MUTATOR_HOOKFUNCTION(lms, PlayerSpawn)
299{
300 entity player = M_ARGV(0, entity);
301
303 return true;
304
305 if (INGAME_JOINING(player))
306 {
307 // spawn player with the same amount of health / armor
308 // as the least healthy player with the least number of lives
309 int pl_lives = GameRules_scoring_add(player, LMS_LIVES, 0);
310 float min_health = start_health;
311 float min_armorvalue = start_armorvalue;
312 if (last_forfeiter_lives == pl_lives)
313 {
314 min_health = last_forfeiter_health;
315 min_armorvalue = last_forfeiter_armorvalue;
316 }
317 FOREACH_CLIENT(it != player && IS_PLAYER(it) && !IS_DEAD(it) && GameRules_scoring_add(it, LMS_LIVES, 0) == pl_lives, {
318 if (GetResource(it, RES_HEALTH) < min_health)
319 min_health = GetResource(it, RES_HEALTH);
320 if (GetResource(it, RES_ARMOR) < min_armorvalue)
321 min_armorvalue = GetResource(it, RES_ARMOR);
322 });
323 if (min_health != start_health)
324 SetResource(player, RES_HEALTH, max(1, min_health));
325 if (min_armorvalue != start_armorvalue)
326 SetResource(player, RES_ARMOR, min_armorvalue);
328 }
329}
330
331MUTATOR_HOOKFUNCTION(lms, ForbidSpawn)
332{
333 entity player = M_ARGV(0, entity);
334
335 if (warmup_stage || lms_AddPlayer(player))
336 return false;
337
338 return true;
339}
340
342{
344 return;
345
346 float player_rank = GameRules_scoring_add(player, LMS_RANK, 0);
347 if (!player_rank)
348 {
349 if (!player.lms_spectate)
350 {
351 player.frags = FRAGS_PLAYER_OUT_OF_GAME;
352 int pl_cnt = 0;
353 FOREACH_CLIENT(IS_PLAYER(it) && it.frags == FRAGS_PLAYER, {
354 pl_cnt++;
355 });
356 GameRules_scoring_add(player, LMS_RANK, pl_cnt + 1);
357 }
358 else if (INGAME(player))
359 {
360 FOREACH_CLIENT(it != player, {
361 // update rank of other players
362 if (it.frags == FRAGS_PLAYER_OUT_OF_GAME)
363 GameRules_scoring_add(it, LMS_RANK, -1);
364 });
365 int rank = GameRules_scoring_add(player, LMS_RANK, 0);
366 GameRules_scoring_add(player, LMS_RANK, -rank);
367 if(!warmup_stage)
368 {
369 int pl_lives = GameRules_scoring_add(player, LMS_LIVES, 0);
370 float pl_health = IS_DEAD(player) ? start_health : GetResource(player, RES_HEALTH);
371 float pl_armor = IS_DEAD(player) ? start_armorvalue : GetResource(player, RES_ARMOR);
373 {
374 last_forfeiter_lives = pl_lives;
375 last_forfeiter_health = pl_health;
376 last_forfeiter_armorvalue = pl_armor;
377 }
378 else if (pl_lives == last_forfeiter_lives)
379 {
380 // these values actually can belong to a different forfeiter
383 }
384 GameRules_scoring_add(player, LMS_LIVES, -pl_lives);
385 }
386 player.frags = FRAGS_SPECTATOR;
387 TRANSMUTE(Observer, player);
388 INGAME_STATUS_CLEAR(player);
389 player.lms_spectate = false;
390 CS(player).killcount = FRAGS_SPECTATOR;
391 }
394 }
395
396 if (CS(player).killcount != FRAGS_SPECTATOR)
397 {
398 if (GameRules_scoring_add(player, LMS_RANK, 0) > 0)
399 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_LMS_NOLIVES, player.netname);
400 }
401}
402
404{
405 entity player = M_ARGV(0, entity);
406
407 player.lms_spectate = true;
408
409 lms_RemovePlayer(player);
410 INGAME_STATUS_CLEAR(player);
411}
412
413MUTATOR_HOOKFUNCTION(lms, MakePlayerObserver)
414{
415 entity player = M_ARGV(0, entity);
416 bool is_forced = M_ARGV(1, bool);
417
418 if (!IS_PLAYER(player))
419 return true;
420
422 {
423 GameRules_scoring_add(player, LMS_LIVES, -GameRules_scoring_add(player, LMS_LIVES, 0));
424 player.frags = FRAGS_SPECTATOR;
425 TRANSMUTE(Observer, player);
426 INGAME_STATUS_CLEAR(player);
427 }
428 else
429 {
430 if (is_forced || player.killindicator_teamchange == -2) // player is forced or wants to spectate
431 player.lms_spectate = true;
432 if (!GameRules_scoring_add(player, LMS_RANK, 0))
433 lms_RemovePlayer(player);
434 }
435 return true; // prevent team reset
436}
437
439{
440 entity player = M_ARGV(0, entity);
441 player.frags = FRAGS_SPECTATOR;
442}
443
445{
446 entity player = M_ARGV(0, entity);
447
448 // recycled REDALIVE and BLUEALIVE to avoid adding a dedicated stat
449 STAT(REDALIVE, player) = lms_leaders;
450 STAT(BLUEALIVE, player) = lms_leaders_lives_diff;
451
452 if(player.deadflag == DEAD_DYING)
453 player.deadflag = DEAD_RESPAWNING;
454}
455
456MUTATOR_HOOKFUNCTION(lms, SV_StartFrame)
457{
459 return;
460
461 lms_leaders = 0;
462 FOREACH_CLIENT(true, {
463 if (IS_PLAYER(it) && it.frags != FRAGS_PLAYER_OUT_OF_GAME && it.lms_leader)
464 lms_leaders++;
465 });
466
467 float leader_time = autocvar_g_lms_leader_wp_time;
468 float leader_interval = leader_time + autocvar_g_lms_leader_wp_interval;
473
474 FOREACH_CLIENT(true, {
475 STAT(OBJECTIVE_STATUS, it) = lms_visible_leaders;
476 if (IS_PLAYER(it) && it.frags != FRAGS_PLAYER_OUT_OF_GAME)
477 {
478 if (it.lms_leader)
479 {
480 if (!it.waypointsprite_attachedforcarrier)
481 {
482 WaypointSprite_AttachCarrier(WP_LmsLeader, it, RADARICON_FLAGCARRIER);
483 it.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = lms_waypointsprite_visible_for_player;
484 WaypointSprite_UpdateRule(it.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
485 vector pl_color = colormapPaletteColor(it.clientcolors & 0x0F, false);
486 WaypointSprite_UpdateTeamRadar(it.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, pl_color);
487 WaypointSprite_Ping(it.waypointsprite_attachedforcarrier);
488 }
490 Send_Notification(NOTIF_ONE, it, MSG_CENTER, CENTER_LMS_VISIBLE_LEADER);
491 }
492 else // if (!it.lms_leader)
493 {
494 if (IS_PLAYER(it) && it.frags != FRAGS_PLAYER_OUT_OF_GAME)
495 {
497 Send_Notification(NOTIF_ONE, it, MSG_CENTER, CENTER_LMS_VISIBLE_OTHER);
498 }
499 if (it.waypointsprite_attachedforcarrier)
500 WaypointSprite_Kill(it.waypointsprite_attachedforcarrier);
501 }
502 }
503 });
504}
505
506MUTATOR_HOOKFUNCTION(lms, PlayerRegen)
507{
509 M_ARGV(2, float) = 0;
511 M_ARGV(3, float) = 0;
513}
514
515MUTATOR_HOOKFUNCTION(lms, PlayerPowerups)
516{
517 entity player = M_ARGV(0, entity);
518 if (player.waypointsprite_attachedforcarrier)
519 player.effects |= (EF_ADDITIVE | EF_FULLBRIGHT);
520 else
521 player.effects &= ~(EF_ADDITIVE | EF_FULLBRIGHT);
522}
523
524MUTATOR_HOOKFUNCTION(lms, ForbidThrowCurrentWeapon)
525{
526 // forbode!
527 return true;
528}
529
530MUTATOR_HOOKFUNCTION(lms, Damage_Calculate)
531{
533 return;
534
535 entity frag_attacker = M_ARGV(1, entity);
537 float frag_damage = M_ARGV(4, float);
538
539 if (IS_PLAYER(frag_attacker) && !IS_DEAD(frag_attacker)
540 && IS_PLAYER(frag_target) && !IS_DEAD(frag_target) && frag_attacker != frag_target)
541 {
542 float vampire_factor = 0;
543
544 int frag_attacker_lives = GameRules_scoring_add(frag_attacker, LMS_LIVES, 0);
545 int frag_target_lives = GameRules_scoring_add(frag_target, LMS_LIVES, 0);
546 int diff = frag_target_lives - frag_attacker_lives - autocvar_g_lms_dynamic_vampire_min_lives_diff;
547
548 if (diff >= 0)
550 if (vampire_factor > 0)
551 {
552 vampire_factor = min(vampire_factor, autocvar_g_lms_dynamic_vampire_factor_max);
553 SetResourceExplicit(frag_attacker, RES_HEALTH,
554 min(GetResource(frag_attacker, RES_HEALTH) + frag_damage * vampire_factor, start_health));
555 }
556 }
557}
558
564
565MUTATOR_HOOKFUNCTION(lms, CalculateRespawnTime)
566{
567 entity player = M_ARGV(0, entity);
568 player.respawn_flags |= RESPAWN_FORCE;
569
570 int pl_lives = GameRules_scoring_add(player, LMS_LIVES, 0);
571 if (pl_lives <= 0)
572 {
573 player.respawn_flags = RESPAWN_SILENT;
574 // prevent unwanted sudden rejoin as spectator and movement of spectator camera
575 player.respawn_time = time + 2;
576 return true;
577 }
578
580 return false;
581
582 int max_lives = 0;
583 int pl_cnt = 0;
584 FOREACH_CLIENT(it != player && IS_PLAYER(it) && it.frags != FRAGS_PLAYER_OUT_OF_GAME, {
585 int lives = GameRules_scoring_add(it, LMS_LIVES, 0);
586 if (lives > max_lives)
587 max_lives = lives;
588 pl_cnt++;
589 });
590
591 // min delay with only 2 players
592 if (pl_cnt == 1) // player wasn't counted
593 max_lives = 0;
594
596 autocvar_g_lms_dynamic_respawn_delay_increase * max(0, max_lives - pl_lives);
597 player.respawn_time = time + min(autocvar_g_lms_dynamic_respawn_delay_max, dlay);
598 return true;
599}
600
601MUTATOR_HOOKFUNCTION(lms, GiveFragsForKill)
602{
604
606 {
607 // remove a life
608 int tl = GameRules_scoring_add(frag_target, LMS_LIVES, -1);
609 if(tl < lms_lowest_lives)
610 lms_lowest_lives = tl;
611 if(tl <= 0)
612 {
613 int pl_cnt = 0;
614 FOREACH_CLIENT(IS_PLAYER(it) && it.frags == FRAGS_PLAYER, {
615 pl_cnt++;
616 });
618 GameRules_scoring_add(frag_target, LMS_RANK, pl_cnt);
619 }
620 }
621 M_ARGV(2, float) = 0; // frag score
622
623 return true;
624}
625
626MUTATOR_HOOKFUNCTION(lms, SetStartItems)
627{
629 if(!cvar("g_use_ammunition"))
631
632 start_health = warmup_start_health = cvar("g_lms_start_health");
633 start_armorvalue = warmup_start_armorvalue = cvar("g_lms_start_armor");
634 start_ammo_shells = warmup_start_ammo_shells = cvar("g_lms_start_ammo_shells");
635 start_ammo_nails = warmup_start_ammo_nails = cvar("g_lms_start_ammo_nails");
636 start_ammo_rockets = warmup_start_ammo_rockets = cvar("g_lms_start_ammo_rockets");
637 start_ammo_cells = warmup_start_ammo_cells = cvar("g_lms_start_ammo_cells");
638 start_ammo_fuel = warmup_start_ammo_fuel = cvar("g_lms_start_ammo_fuel");
639}
640
641MUTATOR_HOOKFUNCTION(lms, ForbidPlayerScore_Clear)
642{
643 // don't clear player score
644 return true;
645}
646
647MUTATOR_HOOKFUNCTION(lms, FilterItemDefinition)
648{
650 return false;
651
652 entity def = M_ARGV(0, entity);
653 if (autocvar_g_powerups && autocvar_g_lms_extra_lives && (def == ITEM_ExtraLife || def == ITEM_HealthMega))
654 return false;
655
656 return true;
657}
658
660{
661 entity e = new(item_extralife);
662 Item_CopyFields(this, e);
663
664 StartItem(e, ITEM_ExtraLife);
665}
666
667MUTATOR_HOOKFUNCTION(lms, FilterItem)
668{
669 entity item = M_ARGV(0, entity);
670 entity def = item.itemdef;
671 if(def == ITEM_HealthMega && !(autocvar_g_lms_items || autocvar_g_pickup_items > 0))
672 {
675 return true;
676 }
677
678 return false;
679}
680
681MUTATOR_HOOKFUNCTION(lms, ItemTouch)
682{
683 if(MUTATOR_RETURNVALUE) return false;
684
685 entity item = M_ARGV(0, entity);
687
688 if(item.itemdef == ITEM_ExtraLife)
689 {
690 Send_Notification(NOTIF_ONE, toucher, MSG_CENTER, CENTER_EXTRALIVES, autocvar_g_lms_extra_lives);
692 Inventory_pickupitem(item.itemdef, toucher);
694 }
695
697}
698
700{
702 if (INGAME(it))
703 ++M_ARGV(0, int); // activerealplayers
704 ++M_ARGV(1, int); // realplayers
705 });
706
707 return true;
708}
709
710MUTATOR_HOOKFUNCTION(lms, ClientCommand_Spectate)
711{
712 entity player = M_ARGV(0, entity);
713 if(player.frags != FRAGS_SPECTATOR && player.frags != FRAGS_PLAYER_OUT_OF_GAME)
715 // ranked players (out of game) can no longer become real spectators
716 return MUT_SPECCMD_RETURN;
717}
718
720{
721 M_ARGV(0, float) = WinningCondition_LMS();
722 return true;
723}
724
725MUTATOR_HOOKFUNCTION(lms, SetWeaponArena)
726{
727 if(M_ARGV(0, string) == "0" || M_ARGV(0, string) == "")
729}
730
731MUTATOR_HOOKFUNCTION(lms, AddPlayerScore)
732{
733 if(game_stopped)
734 if(M_ARGV(0, entity) == SP_LMS_RANK) // score field
735 return true; // allow writing to this field in intermission as it is needed for newly joining players
736}
737
739{
740 lms_lowest_lives = 999;
741}
#define MUTATOR_HOOKFUNCTION(...)
Definition base.qh:335
const int CBC_ORDER_EXCLUSIVE
Definition base.qh:12
#define MUTATOR_RETURNVALUE
Definition base.qh:328
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
void SetResource(entity e, Resource res_type, float amount)
Sets the current amount of resource the given entity will have.
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
bool SetResourceExplicit(entity e, Resource res_type, float amount)
Sets the resource amount of an entity without calling any hooks.
bool warmup_stage
Definition main.qh:120
#define colormapPaletteColor(c, isPants)
Definition color.qh:5
const int IT_UNLIMITED_AMMO
Definition item.qh:23
const int IT_UNLIMITED_SUPERWEAPONS
Definition item.qh:24
#define M_ARGV(x, type)
Definition events.qh:17
#define IS_DEAD(s)
Definition player.qh:245
#define IS_PLAYER(s)
Definition player.qh:243
#define autocvar_fraglimit
Definition stats.qh:90
float game_starttime
Definition stats.qh:82
float game_stopped
Definition stats.qh:81
const int FRAGS_PLAYER_OUT_OF_GAME
Definition constants.qh:5
const int FRAGS_PLAYER
Definition constants.qh:3
const int FRAGS_SPECTATOR
Definition constants.qh:4
const float EF_ADDITIVE
const float EF_FULLBRIGHT
float time
RES_ARMOR
Definition ent_cs.qc:130
bool intermission_running
void Inventory_pickupitem(Pickup this, entity player)
Definition inventory.qh:161
#define ClientConnect
Definition _all.inc:238
#define PlayerPreThink
Definition _all.inc:254
#define PutClientInServer
Definition _all.inc:246
#define ClientDisconnect
Definition _all.inc:242
#define STAT(...)
Definition stats.qh:82
#define LOG_TRACE(...)
Definition log.qh:76
bool autocvar_g_campaign
Definition menu.qc:747
float bound(float min, float value, float max)
float cvar(string name)
float random(void)
float min(float f,...)
float floor(float f)
float max(float f,...)
void Send_Notification(NOTIF broadcast, entity client, MSG net_type, Notification net_name,...count)
Definition all.qc:1573
#define TRANSMUTE(cname, this,...)
Definition oo.qh:136
#define NULL
Definition post.qh:14
float DEAD_DYING
Definition progsdefs.qc:275
float DEAD_RESPAWNING
Definition progsdefs.qc:278
void WinningConditionHelper(entity this)
Sets the following results for the current scores entities.
Definition scores.qc:443
vector
Definition self.qh:92
entity entity toucher
Definition self.qh:72
bool campaign_bots_may_start
campaign mode: bots shall spawn but wait for the player to spawn before they do anything in other gam...
Definition campaign.qh:26
int killcount
Definition client.qh:315
const int RESPAWN_SILENT
Definition client.qh:327
float jointime
Definition client.qh:66
const int RESPAWN_FORCE
Definition client.qh:326
void Item_CopyFields(entity this, entity to)
Definition items.qc:850
void StartItem(entity this, entity def)
Definition items.qc:1004
int autocvar_g_pickup_items
Definition items.qh:10
@ MUT_ITEMTOUCH_PICKUP
Definition events.qh:736
@ MUT_ITEMTOUCH_CONTINUE
Definition events.qh:734
@ MUT_SPECCMD_RETURN
Definition events.qh:1005
@ MUT_SPECCMD_CONTINUE
Definition events.qh:1004
float WinningConditionHelper_secondscore
second highest score
Definition scores.qh:108
entity WinningConditionHelper_winner
the winning player, or NULL if none
Definition scores.qh:112
float WinningConditionHelper_topscore
highest score
Definition scores.qh:107
ClientState CS(Client this)
Definition state.qh:47
float frag_damage
Definition sv_ctf.qc:2322
entity frag_target
Definition sv_ctf.qc:2321
int autocvar_g_lms_last_join
Definition sv_lms.qc:12
int autocvar_g_lms_leader_lives_diff
Definition sv_lms.qc:15
void lms_RemovePlayer(entity player)
Definition sv_lms.qc:341
float autocvar_g_lms_dynamic_vampire_factor_base
Definition sv_lms.qc:25
float autocvar_g_lms_dynamic_vampire_factor_increase
Definition sv_lms.qc:26
void lms_UpdateLeaders()
Definition sv_lms.qc:171
void ClearWinners()
Definition world.qc:1534
int LMS_NewPlayerLives()
Definition sv_lms.qc:38
bool autocvar_g_lms_rot
Definition sv_lms.qc:35
bool lms_AddPlayer(entity player)
Definition sv_lms.qc:254
bool autocvar_g_lms_dynamic_vampire
Definition sv_lms.qc:24
float autocvar_g_lms_dynamic_respawn_delay_increase
Definition sv_lms.qc:22
bool lms_visible_leaders_prev
Definition sv_lms.qc:34
float autocvar_g_lms_dynamic_respawn_delay_base
Definition sv_lms.qc:21
float autocvar_g_lms_dynamic_vampire_factor_max
Definition sv_lms.qc:27
void lms_replace_with_extralife(entity this)
Definition sv_lms.qc:659
float autocvar_g_lms_leader_minpercent
Definition sv_lms.qc:16
bool autocvar_g_lms_items
Definition sv_lms.qc:13
float lms_visible_leaders_time
Definition sv_lms.qc:32
float last_forfeiter_health
Definition sv_lms.qc:296
int lms_leaders_lives_diff
Definition sv_lms.qc:170
float autocvar_g_lms_dynamic_respawn_delay_max
Definition sv_lms.qc:23
void lms_Initialize()
Definition sv_lms.qc:738
int autocvar_g_lms_extra_lives
Definition sv_lms.qc:9
float autocvar_g_lms_dynamic_respawn_delay
Definition sv_lms.qc:20
float autocvar_g_lms_forfeit_min_match_time
Definition sv_lms.qc:10
int last_forfeiter_lives
Definition sv_lms.qc:295
bool autocvar_g_lms_join_anytime
Definition sv_lms.qc:11
bool autocvar_g_lms_regenerate
Definition sv_lms.qc:14
float autocvar_g_lms_leader_wp_interval_jitter
Definition sv_lms.qc:18
float lms_leader
Definition sv_lms.qc:30
float autocvar_g_lms_leader_wp_time
Definition sv_lms.qc:19
int WinningCondition_LMS()
Definition sv_lms.qc:60
int lms_leaders
Definition sv_lms.qc:31
float autocvar_g_lms_leader_wp_interval
Definition sv_lms.qc:17
bool lms_waypointsprite_visible_for_player(entity this, entity player, entity view)
Definition sv_lms.qc:158
float last_forfeiter_armorvalue
Definition sv_lms.qc:297
int autocvar_g_lms_dynamic_vampire_min_lives_diff
Definition sv_lms.qc:28
bool lms_visible_leaders
Definition sv_lms.qc:33
string autocvar_g_lms_weaponarena
Definition sv_lms.qh:11
int lms_lowest_lives
Definition sv_lms.qh:35
int autocvar_g_powerups
Definition sv_powerups.qh:7
#define INGAME_STATUS_JOINED
Definition sv_rules.qh:17
#define INGAME_STATUS_JOINING
Definition sv_rules.qh:16
#define INGAME(it)
Definition sv_rules.qh:24
#define GameRules_scoring_add(client, fld, value)
Definition sv_rules.qh:85
#define INGAME_STATUS_CLEAR(it)
Definition sv_rules.qh:22
#define INGAME_STATUS_SET(it, s)
Definition sv_rules.qh:21
#define INGAME_JOINING(it)
Definition sv_rules.qh:26
#define IS_SPEC(v)
Definition utils.qh:10
#define IS_REAL_CLIENT(v)
Definition utils.qh:17
#define FOREACH_CLIENT(cond, body)
Definition utils.qh:50
#define IS_BOT_CLIENT(v)
want: (IS_CLIENT(v) && !IS_REAL_CLIENT(v))
Definition utils.qh:15
void WaypointSprite_Kill(entity wp)
void WaypointSprite_UpdateTeamRadar(entity e, entity icon, vector col)
void WaypointSprite_Ping(entity e)
entity WaypointSprite_AttachCarrier(entity spr, entity carrier, entity icon)
void WaypointSprite_UpdateRule(entity e, float t, float r)
const int SPRITERULE_DEFAULT
void CheckRules_World()
Definition world.qc:1705
const int WINNING_NEVER
Definition world.qh:134
float warmup_start_ammo_cells
Definition world.qh:105
float start_ammo_shells
Definition world.qh:84
float warmup_start_ammo_rockets
Definition world.qh:104
float warmup_start_ammo_shells
Definition world.qh:102
float start_ammo_fuel
Definition world.qh:88
int start_items
Definition world.qh:83
float warmup_start_ammo_nails
Definition world.qh:103
const int WINNING_NO
Definition world.qh:132
float start_ammo_cells
Definition world.qh:87
float warmup_start_health
Definition world.qh:107
float start_ammo_rockets
Definition world.qh:86
float start_armorvalue
Definition world.qh:97
float warmup_start_ammo_fuel
Definition world.qh:106
const int WINNING_YES
Definition world.qh:133
float start_health
Definition world.qh:96
bool sv_ready_restart_after_countdown
Definition world.qh:116
float warmup_start_armorvalue
Definition world.qh:108
float start_ammo_nails
Definition world.qh:85