Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
sv_survival.qc File Reference
#include "sv_survival.qh"
Include dependency graph for sv_survival.qc:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define STATUS_SEND_HUNTERS   2
#define STATUS_SEND_RESET   1

Functions

 MUTATOR_HOOKFUNCTION (surv, AddPlayerScore)
 MUTATOR_HOOKFUNCTION (surv, Bot_FixCount, CBC_ORDER_EXCLUSIVE)
 MUTATOR_HOOKFUNCTION (surv, Bot_ForbidAttack)
 MUTATOR_HOOKFUNCTION (surv, CalculateRespawnTime)
 MUTATOR_HOOKFUNCTION (surv, ClientCommand_Spectate)
 MUTATOR_HOOKFUNCTION (surv, ClientDisconnect)
 MUTATOR_HOOKFUNCTION (surv, ClientObituary)
 MUTATOR_HOOKFUNCTION (surv, ForbidSpawn)
 MUTATOR_HOOKFUNCTION (surv, GiveFragsForKill, CBC_ORDER_FIRST)
 MUTATOR_HOOKFUNCTION (surv, MakePlayerObserver)
 MUTATOR_HOOKFUNCTION (surv, MatchEnd_BeforeScores)
 MUTATOR_HOOKFUNCTION (surv, PlayerDies)
 MUTATOR_HOOKFUNCTION (surv, PlayerSpawn)
 MUTATOR_HOOKFUNCTION (surv, PutClientInServer)
 MUTATOR_HOOKFUNCTION (surv, reset_map_global)
 MUTATOR_HOOKFUNCTION (surv, reset_map_players)
 MUTATOR_HOOKFUNCTION (surv, Scores_CountFragsRemaining)
bool Surv_CheckPlayers ()
float Surv_CheckWinner ()
void surv_Initialize ()
bool surv_isEliminated (entity e)
entity surv_LastPlayerForTeam (entity this)
void surv_LastPlayerForTeam_Notify (entity this)
void Surv_RoundStart ()
void Surv_UpdateScores (bool timed_out)
void SurvivalStatuses_Init ()
bool SurvivalStatuses_SendEntity (entity this, entity dest, float sendflags)

Variables

float autocvar_g_survival_hunter_count = 0.25
bool autocvar_g_survival_punish_teamkill = true
bool autocvar_g_survival_reward_survival = true
float autocvar_g_survival_round_enddelay
float autocvar_g_survival_round_timelimit = 120
float autocvar_g_survival_warmup = 10
entity survivalStatuses

Macro Definition Documentation

◆ STATUS_SEND_HUNTERS

#define STATUS_SEND_HUNTERS   2

Definition at line 14 of file sv_survival.qc.

Referenced by Surv_CheckWinner(), and SurvivalStatuses_SendEntity().

◆ STATUS_SEND_RESET

#define STATUS_SEND_RESET   1

Definition at line 13 of file sv_survival.qc.

Referenced by MUTATOR_HOOKFUNCTION(), and Surv_RoundStart().

Function Documentation

◆ MUTATOR_HOOKFUNCTION() [1/17]

MUTATOR_HOOKFUNCTION ( surv ,
AddPlayerScore  )

Definition at line 446 of file sv_survival.qc.

447{
448 entity scorefield = M_ARGV(0, entity);
449 if(scorefield == SP_KILLS || scorefield == SP_DEATHS || scorefield == SP_SUICIDES || scorefield == SP_DMG || scorefield == SP_DMGTAKEN)
450 M_ARGV(1, float) = 0; // don't report that the player has killed or been killed, that would out them as a hunter!
451}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define M_ARGV(x, type)
Definition events.qh:17

References entity(), and M_ARGV.

◆ MUTATOR_HOOKFUNCTION() [2/17]

MUTATOR_HOOKFUNCTION ( surv ,
Bot_FixCount ,
CBC_ORDER_EXCLUSIVE  )

Definition at line 459 of file sv_survival.qc.

460{
462 if (IS_PLAYER(it) || INGAME_JOINED(it))
463 ++M_ARGV(0, int);
464 ++M_ARGV(1, int);
465 });
466 return true;
467}
#define IS_PLAYER(s)
Definition player.qh:242
#define INGAME_JOINED(it)
Definition sv_rules.qh:25
#define IS_REAL_CLIENT(v)
Definition utils.qh:17
#define FOREACH_CLIENT(cond, body)
Definition utils.qh:52

References CBC_ORDER_EXCLUSIVE, FOREACH_CLIENT, INGAME_JOINED, IS_PLAYER, IS_REAL_CLIENT, and M_ARGV.

◆ MUTATOR_HOOKFUNCTION() [3/17]

MUTATOR_HOOKFUNCTION ( surv ,
Bot_ForbidAttack  )

Definition at line 484 of file sv_survival.qc.

485{
486 entity bot = M_ARGV(0, entity);
487 entity targ = M_ARGV(1, entity);
488
489 if(targ.survival_status == bot.survival_status)
490 return true;
491}

References entity(), and M_ARGV.

◆ MUTATOR_HOOKFUNCTION() [4/17]

MUTATOR_HOOKFUNCTION ( surv ,
CalculateRespawnTime  )

Definition at line 453 of file sv_survival.qc.

454{
455 // no respawn calculations needed, player is forced to spectate anyway
456 return true;
457}

◆ MUTATOR_HOOKFUNCTION() [5/17]

MUTATOR_HOOKFUNCTION ( surv ,
ClientCommand_Spectate  )

Definition at line 469 of file sv_survival.qc.

470{
471 entity player = M_ARGV(0, entity);
472
473 if (INGAME(player))
474 {
475 // they're going to spec, we can do other checks
476 if (autocvar_sv_spectate && (IS_SPEC(player) || IS_OBSERVER(player)))
477 Send_Notification(NOTIF_ONE_ONLY, player, MSG_INFO, INFO_CA_LEAVE);
478 return MUT_SPECCMD_FORCE;
479 }
480
482}
void Send_Notification(NOTIF broadcast, entity client, MSG net_type, Notification net_name,...count)
Definition all.qc:1573
bool autocvar_sv_spectate
Definition client.qh:57
@ MUT_SPECCMD_FORCE
Definition events.qh:1006
@ MUT_SPECCMD_CONTINUE
Definition events.qh:1004
#define INGAME(it)
Definition sv_rules.qh:24
#define IS_OBSERVER(v)
Definition utils.qh:11
#define IS_SPEC(v)
Definition utils.qh:10

References autocvar_sv_spectate, entity(), INGAME, IS_OBSERVER, IS_SPEC, M_ARGV, MUT_SPECCMD_CONTINUE, MUT_SPECCMD_FORCE, and Send_Notification().

◆ MUTATOR_HOOKFUNCTION() [6/17]

MUTATOR_HOOKFUNCTION ( surv ,
ClientDisconnect  )

Definition at line 398 of file sv_survival.qc.

399{
400 entity player = M_ARGV(0, entity);
401
402 if (IS_PLAYER(player) && !IS_DEAD(player))
404 return true;
405}
#define IS_DEAD(s)
Definition player.qh:244
void surv_LastPlayerForTeam_Notify(entity this)

References ClientDisconnect, entity(), IS_DEAD, IS_PLAYER, M_ARGV, and surv_LastPlayerForTeam_Notify().

◆ MUTATOR_HOOKFUNCTION() [7/17]

MUTATOR_HOOKFUNCTION ( surv ,
ClientObituary  )

Definition at line 256 of file sv_survival.qc.

257{
258 // in survival, announcing a frag would tell everyone who the hunter is
259 entity frag_attacker = M_ARGV(1, entity);
261 if(IS_PLAYER(frag_attacker) && frag_attacker != frag_target)
262 {
263 float frag_deathtype = M_ARGV(3, float);
264 entity wep_ent = M_ARGV(4, entity);
265 // "team" kill, a point is awarded to the player by default so we must take it away plus an extra one
266 // unless the player is going to be punished for suicide, in which case just remove one
267 if(frag_attacker.survival_status == frag_target.survival_status)
268 GiveFrags(frag_attacker, frag_target, ((autocvar_g_survival_punish_teamkill) ? -1 : -2), frag_deathtype, wep_ent.weaponentity_fld);
269 }
270
271 if(frag_attacker.survival_status == SURV_STATUS_HUNTER)
272 M_ARGV(5, bool) = true; // anonymous attacker
273}
void GiveFrags(entity attacker, entity targ, float f, int deathtype,.entity weaponentity)
Definition damage.qc:43
const int SURV_STATUS_HUNTER
Definition survival.qh:38
entity frag_target
Definition sv_ctf.qc:2314
bool autocvar_g_survival_punish_teamkill
Definition sv_survival.qc:6

References autocvar_g_survival_punish_teamkill, entity(), frag_target, GiveFrags(), IS_PLAYER, M_ARGV, and SURV_STATUS_HUNTER.

◆ MUTATOR_HOOKFUNCTION() [8/17]

MUTATOR_HOOKFUNCTION ( surv ,
ForbidSpawn  )

Definition at line 286 of file sv_survival.qc.

287{
288 entity player = M_ARGV(0, entity);
289
290 // spectators / observers that weren't playing can join; they are
291 // immediately forced to observe in the PutClientInServer hook
292 // this way they are put in a team and can play in the next round
293 if (!allowed_to_spawn && INGAME(player))
294 return true;
295 return false;
296}
bool allowed_to_spawn

References allowed_to_spawn, entity(), INGAME, and M_ARGV.

◆ MUTATOR_HOOKFUNCTION() [9/17]

MUTATOR_HOOKFUNCTION ( surv ,
GiveFragsForKill ,
CBC_ORDER_FIRST  )

Definition at line 437 of file sv_survival.qc.

438{
439 entity frag_attacker = M_ARGV(0, entity);
441 frag_attacker.survival_validkills += M_ARGV(2, float);
442 M_ARGV(2, float) = 0; // score will be given to the winner when the round ends
443 return true;
444}
bool warmup_stage
Definition main.qh:120
#define round_handler_IsActive()
#define round_handler_IsRoundStarted()

References CBC_ORDER_FIRST, entity(), M_ARGV, round_handler_IsActive, round_handler_IsRoundStarted, and warmup_stage.

◆ MUTATOR_HOOKFUNCTION() [10/17]

MUTATOR_HOOKFUNCTION ( surv ,
MakePlayerObserver  )

Definition at line 407 of file sv_survival.qc.

408{
409 entity player = M_ARGV(0, entity);
410 bool is_forced = M_ARGV(1, bool);
411 if (is_forced && INGAME(player))
412 INGAME_STATUS_CLEAR(player);
413
414 if (IS_PLAYER(player) && !IS_DEAD(player))
416 if (player.killindicator_teamchange == -2) // player wants to spectate
417 INGAME_STATUS_CLEAR(player);
418 if (INGAME(player))
419 player.frags = FRAGS_PLAYER_OUT_OF_GAME;
420 if (!warmup_stage)
421 eliminatedPlayers.SendFlags = 0xFFFFFF;
422 if (!INGAME(player))
423 {
424 player.survival_validkills = 0;
425 player.survival_status = 0;
426 return false; // allow team reset
427 }
428 return true; // prevent team reset
429}
const int FRAGS_PLAYER_OUT_OF_GAME
Definition constants.qh:5
entity eliminatedPlayers
Definition elimination.qh:3
#define INGAME_STATUS_CLEAR(it)
Definition sv_rules.qh:22

References eliminatedPlayers, entity(), FRAGS_PLAYER_OUT_OF_GAME, INGAME, INGAME_STATUS_CLEAR, IS_DEAD, IS_PLAYER, M_ARGV, surv_LastPlayerForTeam_Notify(), and warmup_stage.

◆ MUTATOR_HOOKFUNCTION() [11/17]

MUTATOR_HOOKFUNCTION ( surv ,
MatchEnd_BeforeScores  )

Definition at line 339 of file sv_survival.qc.

340{
342 return true;
343}
void MatchEnd_RestoreSpectatorStatus()
Definition world.qc:1396

References MatchEnd_RestoreSpectatorStatus().

◆ MUTATOR_HOOKFUNCTION() [12/17]

MUTATOR_HOOKFUNCTION ( surv ,
PlayerDies  )

Definition at line 370 of file sv_survival.qc.

371{
372 entity frag_attacker = M_ARGV(1, entity);
374 float frag_deathtype = M_ARGV(3, float);
375
377 if (!allowed_to_spawn)
378 {
379 frag_target.respawn_flags = RESPAWN_SILENT;
380 // prevent unwanted sudden rejoin as spectator and movement of spectator camera
381 frag_target.respawn_time = time + 2;
382 }
383 frag_target.respawn_flags |= RESPAWN_FORCE;
384 if (!warmup_stage)
385 {
386 eliminatedPlayers.SendFlags = 0xFFFFFF;
389 }
390
391 // killed an ally! punishment is death
392 if(autocvar_g_survival_punish_teamkill && frag_attacker != frag_target && IS_PLAYER(frag_attacker) && IS_PLAYER(frag_target) && frag_attacker.survival_status == frag_target.survival_status && !ITEM_DAMAGE_NEEDKILL(frag_deathtype))
393 if(!warmup_stage && round_handler_IsActive() && round_handler_IsRoundStarted()) // don't autokill if the round hasn't started yet
394 Damage(frag_attacker, frag_attacker, frag_attacker, 100000, DEATH_MIRRORDAMAGE.m_id, DMG_NOWEP, frag_attacker.origin, '0 0 0');
395 return true;
396}
float time
void Damage(entity targ, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
Definition damage.qc:493
#define DMG_NOWEP
Definition damage.qh:104
void bot_clearqueue(entity bot)
Definition scripting.qc:21
const int RESPAWN_SILENT
Definition client.qh:327
const int RESPAWN_FORCE
Definition client.qh:326
#define ITEM_DAMAGE_NEEDKILL(dt)
Definition items.qh:123
#define IS_BOT_CLIENT(v)
want: (IS_CLIENT(v) && !IS_REAL_CLIENT(v))
Definition utils.qh:15

References allowed_to_spawn, autocvar_g_survival_punish_teamkill, bot_clearqueue(), Damage(), DMG_NOWEP, eliminatedPlayers, entity(), frag_target, IS_BOT_CLIENT, IS_PLAYER, ITEM_DAMAGE_NEEDKILL, M_ARGV, RESPAWN_FORCE, RESPAWN_SILENT, round_handler_IsActive, round_handler_IsRoundStarted, surv_LastPlayerForTeam_Notify(), time, and warmup_stage.

◆ MUTATOR_HOOKFUNCTION() [13/17]

MUTATOR_HOOKFUNCTION ( surv ,
PlayerSpawn  )

Definition at line 275 of file sv_survival.qc.

276{
277 entity player = M_ARGV(0, entity);
278
279 player.survival_status = 0;
280 player.survival_validkills = 0;
282 if (!warmup_stage)
283 eliminatedPlayers.SendFlags = 0xFFFFFF;
284}
#define INGAME_STATUS_JOINED
Definition sv_rules.qh:17
#define INGAME_STATUS_SET(it, s)
Definition sv_rules.qh:21

References eliminatedPlayers, entity(), INGAME_STATUS_JOINED, INGAME_STATUS_SET, M_ARGV, and warmup_stage.

◆ MUTATOR_HOOKFUNCTION() [14/17]

MUTATOR_HOOKFUNCTION ( surv ,
PutClientInServer  )

Definition at line 298 of file sv_survival.qc.

299{
300 entity player = M_ARGV(0, entity);
301
302 if (!allowed_to_spawn && IS_PLAYER(player)) // this is true even when player is trying to join
303 {
304 TRANSMUTE(Observer, player);
305 if (CS(player).jointime != time && !INGAME(player)) // not when connecting
306 {
308 Send_Notification(NOTIF_ONE_ONLY, player, MSG_INFO, INFO_CA_JOIN_LATE);
309 }
310 }
311
312 if (!warmup_stage)
313 eliminatedPlayers.SendFlags = 0xFFFFFF;
314}
#define TRANSMUTE(cname, this,...)
Definition oo.qh:136
float jointime
Definition client.qh:66
ClientState CS(Client this)
Definition state.qh:47
#define INGAME_STATUS_JOINING
Definition sv_rules.qh:16

References allowed_to_spawn, CS(), eliminatedPlayers, entity(), INGAME, INGAME_STATUS_JOINING, INGAME_STATUS_SET, IS_PLAYER, jointime, M_ARGV, PutClientInServer, Send_Notification(), time, TRANSMUTE, and warmup_stage.

◆ MUTATOR_HOOKFUNCTION() [15/17]

MUTATOR_HOOKFUNCTION ( surv ,
reset_map_global  )

Definition at line 333 of file sv_survival.qc.

334{
335 allowed_to_spawn = true;
336 return true;
337}

References allowed_to_spawn.

◆ MUTATOR_HOOKFUNCTION() [16/17]

MUTATOR_HOOKFUNCTION ( surv ,
reset_map_players  )

Definition at line 316 of file sv_survival.qc.

317{
318 FOREACH_CLIENT(true, {
319 CS(it).killcount = 0;
320 it.survival_status = 0;
321 if (INGAME(it) || IS_BOT_CLIENT(it))
322 {
323 TRANSMUTE(Player, it);
326 }
327 });
330 return true;
331}
void bot_relinkplayerlist()
Definition bot.qc:424
#define PutClientInServer
Definition _all.inc:246
#define STATUS_SEND_RESET
entity survivalStatuses

References bot_relinkplayerlist(), CS(), FOREACH_CLIENT, INGAME, INGAME_STATUS_JOINED, INGAME_STATUS_SET, IS_BOT_CLIENT, PutClientInServer, STATUS_SEND_RESET, survivalStatuses, and TRANSMUTE.

◆ MUTATOR_HOOKFUNCTION() [17/17]

MUTATOR_HOOKFUNCTION ( surv ,
Scores_CountFragsRemaining  )

Definition at line 431 of file sv_survival.qc.

432{
433 // announce remaining frags?
434 return true;
435}

◆ Surv_CheckPlayers()

bool Surv_CheckPlayers ( )

Definition at line 195 of file sv_survival.qc.

196{
197 static int prev_missing_players;
198 allowed_to_spawn = true;
199 int playercount = 0;
200 FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
201 {
202 ++playercount;
203 });
204 // NOTE missing_teams_mask stat is used for missing players in ffa games
205 if (playercount >= 2)
206 {
207 if(prev_missing_players > 0)
209 prev_missing_players = -1;
210 return true;
211 }
212 if(playercount == 0)
213 {
214 if(prev_missing_players > 0)
216 prev_missing_players = -1;
217 return false;
218 }
219 // if we get here, only 1 player is missing
220 if(prev_missing_players != 1)
221 {
223 prev_missing_players = 1;
224 }
225 return false;
226}
int missing_teams_mask
Definition stats.qh:85

References allowed_to_spawn, FOREACH_CLIENT, IS_DEAD, IS_PLAYER, and missing_teams_mask.

Referenced by surv_Initialize().

◆ Surv_CheckWinner()

float Surv_CheckWinner ( )

Definition at line 76 of file sv_survival.qc.

77{
80 {
81 // if the match times out, survivors win too!
82 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_SURVIVAL_SURVIVOR_WIN);
83 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_SURVIVAL_SURVIVOR_WIN);
86 });
87
89
90 allowed_to_spawn = false;
91 game_stopped = true;
94 return 1;
95 }
96
97 int survivor_count = 0, hunter_count = 0;
99 {
100 if(it.survival_status == SURV_STATUS_PREY)
101 ++survivor_count;
102 else if(it.survival_status == SURV_STATUS_HUNTER)
103 ++hunter_count;
104 });
105 if(survivor_count > 0 && hunter_count > 0)
106 {
107 // Dr. Jaska:
108 // reset delay time here only for consistency
109 // Survival players currently have no known ways to resurrect
111 return 0;
112 }
113
114 // delay round ending a bit
117 && round_handler_GetEndTime() - time > 0) // don't delay past timelimit
118 {
120 {
122 return 0;
123 }
125 {
126 return 0;
127 }
128 }
129
130 if(hunter_count > 0) // hunters win
131 {
132 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_SURVIVAL_HUNTER_WIN);
133 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_SURVIVAL_HUNTER_WIN);
134 }
135 else if(survivor_count > 0) // survivors win
136 {
137 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_SURVIVAL_SURVIVOR_WIN);
138 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_SURVIVAL_SURVIVOR_WIN);
139 }
140 else
141 {
142 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_TIED);
143 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_TIED);
144 }
145
146 Surv_UpdateScores(false);
147
148 allowed_to_spawn = false;
149 game_stopped = true;
152
155 });
156
157 return 1;
158}
float game_stopped
Definition stats.qh:81
float min(float f,...)
#define NULL
Definition post.qh:14
void round_handler_Init(float the_delay, float the_count, float the_round_timelimit)
#define round_handler_GetEndTime()
#define round_handler_SetEndDelayTime(t)
#define round_handler_GetEndDelayTime()
#define round_handler_ResetEndDelayTime()
const int SURV_STATUS_PREY
Definition survival.qh:37
void nades_RemovePlayer(entity this)
Remove nades and bonus nades from a player.
Definition sv_nades.qc:914
float autocvar_g_survival_round_enddelay
Definition sv_survival.qc:8
float autocvar_g_survival_warmup
Definition sv_survival.qc:5
float autocvar_g_survival_round_timelimit
Definition sv_survival.qc:4
void Surv_UpdateScores(bool timed_out)
#define STATUS_SEND_HUNTERS

References allowed_to_spawn, autocvar_g_survival_round_enddelay, autocvar_g_survival_round_timelimit, autocvar_g_survival_warmup, FOREACH_CLIENT, game_stopped, IS_DEAD, IS_PLAYER, min(), nades_RemovePlayer(), NULL, round_handler_GetEndDelayTime, round_handler_GetEndTime, round_handler_Init(), round_handler_ResetEndDelayTime, round_handler_SetEndDelayTime, Send_Notification(), STATUS_SEND_HUNTERS, SURV_STATUS_HUNTER, SURV_STATUS_PREY, Surv_UpdateScores(), survivalStatuses, and time.

Referenced by surv_Initialize().

◆ surv_Initialize()

void surv_Initialize ( )

Definition at line 237 of file sv_survival.qc.

238{
240 field(SP_SURV_SURVIVALS, "survivals", 0);
241 field(SP_SURV_HUNTS, "hunts", SFL_SORT_PRIO_SECONDARY);
242 });
243
244 allowed_to_spawn = true;
249}
const int SFL_SORT_PRIO_SECONDARY
Scoring priority (NOTE: PRIMARY is used for fraglimit) NOTE: SFL_SORT_PRIO_SECONDARY value must be lo...
Definition scores.qh:133
const int SFL_SORT_PRIO_PRIMARY
Definition scores.qh:134
void EliminatedPlayers_Init(float(entity) isEliminated_func)
void round_handler_Spawn(bool() canRoundStart_func, bool() canRoundEnd_func, void() roundStart_func)
#define GameRules_scoring(teams, spprio, stprio, fields)
Definition sv_rules.qh:58
bool surv_isEliminated(entity e)
bool Surv_CheckPlayers()
void Surv_RoundStart()
float Surv_CheckWinner()
void SurvivalStatuses_Init()

References allowed_to_spawn, autocvar_g_survival_round_timelimit, autocvar_g_survival_warmup, EliminatedPlayers_Init(), GameRules_scoring, round_handler_Init(), round_handler_Spawn(), SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_SECONDARY, Surv_CheckPlayers(), Surv_CheckWinner(), surv_isEliminated(), Surv_RoundStart(), and SurvivalStatuses_Init().

Referenced by REGISTER_MUTATOR().

◆ surv_isEliminated()

bool surv_isEliminated ( entity e)

Definition at line 228 of file sv_survival.qc.

229{
230 if(INGAME_JOINED(e) && (IS_DEAD(e) || e.frags == FRAGS_PLAYER_OUT_OF_GAME))
231 return true;
232 if(INGAME_JOINING(e))
233 return true;
234 return false;
235}
#define INGAME_JOINING(it)
Definition sv_rules.qh:26

References entity(), FRAGS_PLAYER_OUT_OF_GAME, INGAME_JOINED, INGAME_JOINING, and IS_DEAD.

Referenced by surv_Initialize().

◆ surv_LastPlayerForTeam()

entity surv_LastPlayerForTeam ( entity this)

Definition at line 345 of file sv_survival.qc.

346{
347 entity last_pl = NULL;
348 FOREACH_CLIENT(IS_PLAYER(it) && it != this, {
349 if (!IS_DEAD(it) && this.survival_status == it.survival_status)
350 {
351 if (!last_pl)
352 last_pl = it;
353 else
354 return NULL;
355 }
356 });
357 return last_pl;
358}
int survival_status
Definition main.qc:567

References entity(), FOREACH_CLIENT, IS_DEAD, IS_PLAYER, NULL, and survival_status.

Referenced by surv_LastPlayerForTeam_Notify().

◆ surv_LastPlayerForTeam_Notify()

void surv_LastPlayerForTeam_Notify ( entity this)

Definition at line 360 of file sv_survival.qc.

361{
363 {
365 if (pl)
366 Send_Notification(NOTIF_ONE_ONLY, pl, MSG_CENTER, CENTER_ALONE);
367 }
368}
entity surv_LastPlayerForTeam(entity this)

References entity(), round_handler_IsActive, round_handler_IsRoundStarted, Send_Notification(), surv_LastPlayerForTeam(), and warmup_stage.

Referenced by MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), and MUTATOR_HOOKFUNCTION().

◆ Surv_RoundStart()

void Surv_RoundStart ( )

Definition at line 160 of file sv_survival.qc.

161{
163 int playercount = 0;
164 FOREACH_CLIENT(true,
165 {
166 if(IS_PLAYER(it) && !IS_DEAD(it))
167 {
168 ++playercount;
169 it.survival_status = SURV_STATUS_PREY;
170 }
171 else
172 it.survival_status = 0; // this is mostly a safety check; if a client manages to somehow maintain a survival status, clear it before the round starts!
173 it.survival_validkills = 0;
174 });
175 int hunter_count = bound(1, ((autocvar_g_survival_hunter_count >= 1) ? autocvar_g_survival_hunter_count : floor(playercount * autocvar_g_survival_hunter_count)), playercount - 1); // 20%, but ensure at least 1 and less than total
176 int total_hunters = 0;
178 {
179 if(total_hunters >= hunter_count)
180 break;
181 ++total_hunters;
182 it.survival_status = SURV_STATUS_HUNTER;
183 });
185
186 FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
187 {
188 if(it.survival_status == SURV_STATUS_PREY)
189 Send_Notification(NOTIF_ONE_ONLY, it, MSG_CENTER, CENTER_SURVIVAL_SURVIVOR);
190 else if(it.survival_status == SURV_STATUS_HUNTER)
191 Send_Notification(NOTIF_ONE_ONLY, it, MSG_CENTER, CENTER_SURVIVAL_HUNTER);
192 });
193}
#define boolean(value)
Definition bool.qh:9
float bound(float min, float value, float max)
float floor(float f)
float autocvar_g_survival_hunter_count
Definition sv_survival.qc:3
#define FOREACH_CLIENT_RANDOM(cond, body)
Definition utils.qh:58

References allowed_to_spawn, autocvar_g_survival_hunter_count, boolean, bound(), floor(), FOREACH_CLIENT, FOREACH_CLIENT_RANDOM, IS_DEAD, IS_PLAYER, Send_Notification(), STATUS_SEND_RESET, SURV_STATUS_HUNTER, SURV_STATUS_PREY, survivalStatuses, and warmup_stage.

Referenced by surv_Initialize().

◆ Surv_UpdateScores()

void Surv_UpdateScores ( bool timed_out)

Definition at line 54 of file sv_survival.qc.

55{
56 // give players their hard-earned kills now that the round is over
57 FOREACH_CLIENT(true,
58 {
59 it.totalfrags += it.survival_validkills;
60 if(it.survival_validkills)
61 GameRules_scoring_add(it, SCORE, it.survival_validkills);
62 it.survival_validkills = 0;
63 // player survived the round
64 if(IS_PLAYER(it) && !IS_DEAD(it))
65 {
66 if(autocvar_g_survival_reward_survival && timed_out && it.survival_status == SURV_STATUS_PREY)
67 GameRules_scoring_add(it, SCORE, 1); // reward survivors who make it to the end of the round time limit
68 if(it.survival_status == SURV_STATUS_PREY)
69 GameRules_scoring_add(it, SURV_SURVIVALS, 1);
70 else if(it.survival_status == SURV_STATUS_HUNTER)
71 GameRules_scoring_add(it, SURV_HUNTS, 1);
72 }
73 });
74}
#define GameRules_scoring_add(client, fld, value)
Definition sv_rules.qh:85
bool autocvar_g_survival_reward_survival
Definition sv_survival.qc:7

References autocvar_g_survival_reward_survival, FOREACH_CLIENT, GameRules_scoring_add, IS_DEAD, IS_PLAYER, SURV_STATUS_HUNTER, and SURV_STATUS_PREY.

Referenced by Surv_CheckWinner().

◆ SurvivalStatuses_Init()

void SurvivalStatuses_Init ( )

Definition at line 44 of file sv_survival.qc.

45{
47 {
48 backtrace("Can't spawn survivalStatuses again!");
49 return;
50 }
52}
void Net_LinkEntity(entity e, bool docull, float dt, bool(entity this, entity to, int sendflags) sendfunc)
Definition net.qh:167
#define backtrace(msg)
Definition log.qh:99
#define new_pure(class)
purely logical entities (not linked to the area grid)
Definition oo.qh:67
bool SurvivalStatuses_SendEntity(entity this, entity dest, float sendflags)

References backtrace, Net_LinkEntity(), new_pure, survivalStatuses, and SurvivalStatuses_SendEntity().

Referenced by surv_Initialize().

◆ SurvivalStatuses_SendEntity()

bool SurvivalStatuses_SendEntity ( entity this,
entity dest,
float sendflags )

Definition at line 16 of file sv_survival.qc.

17{
18 // always send hunters their own status and their allies
19 if (dest.survival_status == SURV_STATUS_HUNTER)
20 sendflags |= STATUS_SEND_HUNTERS;
21
22 WriteHeader(MSG_ENTITY, ENT_CLIENT_SURVIVALSTATUSES);
23 WriteByte(MSG_ENTITY, sendflags);
24 if (sendflags & STATUS_SEND_HUNTERS)
25 {
26 for (int i = 1; i <= maxclients; i += 8)
27 {
28 int f = 0;
29 entity e = edict_num(i);
30
31 for (int b = 0; b < 8; ++b, e = nextent(e))
32 {
33 bool is_hunter = (INGAME(e) && e.survival_status == SURV_STATUS_HUNTER);
34 if (is_hunter)
35 f |= BIT(b);
36 }
38 }
39 }
40 //print(sprintf("sent flags %f to %s\n", sendflags, dest.netname));
41 return true;
42}
#define BIT(n)
Only ever assign into the first 24 bits in QC (so max is BIT(23)).
Definition bits.qh:8
float maxclients
vector dest
Definition jumppads.qh:54
const int MSG_ENTITY
Definition net.qh:156
#define WriteHeader(to, id)
Definition net.qh:265
entity nextent(entity e)
void WriteByte(float data, float dest, float desto)

References BIT, dest, entity(), INGAME, maxclients, MSG_ENTITY, nextent(), STATUS_SEND_HUNTERS, SURV_STATUS_HUNTER, WriteByte(), and WriteHeader.

Referenced by SurvivalStatuses_Init().

Variable Documentation

◆ autocvar_g_survival_hunter_count

float autocvar_g_survival_hunter_count = 0.25

Definition at line 3 of file sv_survival.qc.

Referenced by Surv_RoundStart().

◆ autocvar_g_survival_punish_teamkill

bool autocvar_g_survival_punish_teamkill = true

Definition at line 6 of file sv_survival.qc.

Referenced by MUTATOR_HOOKFUNCTION(), and MUTATOR_HOOKFUNCTION().

◆ autocvar_g_survival_reward_survival

bool autocvar_g_survival_reward_survival = true

Definition at line 7 of file sv_survival.qc.

Referenced by Surv_UpdateScores().

◆ autocvar_g_survival_round_enddelay

float autocvar_g_survival_round_enddelay

Definition at line 8 of file sv_survival.qc.

Referenced by Surv_CheckWinner().

◆ autocvar_g_survival_round_timelimit

float autocvar_g_survival_round_timelimit = 120

Definition at line 4 of file sv_survival.qc.

Referenced by Surv_CheckWinner(), and surv_Initialize().

◆ autocvar_g_survival_warmup

float autocvar_g_survival_warmup = 10

Definition at line 5 of file sv_survival.qc.

Referenced by Surv_CheckWinner(), and surv_Initialize().

◆ survivalStatuses

entity survivalStatuses