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, BotShouldAttack)
 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 448 of file sv_survival.qc.

449{
450 entity scorefield = M_ARGV(0, entity);
451 if(scorefield == SP_KILLS || scorefield == SP_DEATHS || scorefield == SP_SUICIDES || scorefield == SP_DMG || scorefield == SP_DMGTAKEN)
452 M_ARGV(1, float) = 0; // don't report that the player has killed or been killed, that would out them as a hunter!
453}
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 461 of file sv_survival.qc.

462{
464 if (IS_PLAYER(it) || INGAME_JOINED(it))
465 ++M_ARGV(0, int);
466 ++M_ARGV(1, int);
467 });
468 return true;
469}
#define IS_PLAYER(s)
Definition player.qh:243
#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:50

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

◆ MUTATOR_HOOKFUNCTION() [3/17]

MUTATOR_HOOKFUNCTION ( surv ,
BotShouldAttack  )

Definition at line 486 of file sv_survival.qc.

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

References entity(), and M_ARGV.

◆ MUTATOR_HOOKFUNCTION() [4/17]

MUTATOR_HOOKFUNCTION ( surv ,
CalculateRespawnTime  )

Definition at line 455 of file sv_survival.qc.

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

◆ MUTATOR_HOOKFUNCTION() [5/17]

MUTATOR_HOOKFUNCTION ( surv ,
ClientCommand_Spectate  )

Definition at line 471 of file sv_survival.qc.

472{
473 entity player = M_ARGV(0, entity);
474
475 if (INGAME(player))
476 {
477 // they're going to spec, we can do other checks
478 if (autocvar_sv_spectate && (IS_SPEC(player) || IS_OBSERVER(player)))
479 Send_Notification(NOTIF_ONE_ONLY, player, MSG_INFO, INFO_CA_LEAVE);
480 return MUT_SPECCMD_FORCE;
481 }
482
484}
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 400 of file sv_survival.qc.

401{
402 entity player = M_ARGV(0, entity);
403
404 if (IS_PLAYER(player) && !IS_DEAD(player))
406 return true;
407}
#define IS_DEAD(s)
Definition player.qh:245
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 258 of file sv_survival.qc.

259{
260 // in survival, announcing a frag would tell everyone who the hunter is
261 entity frag_attacker = M_ARGV(1, entity);
263 if(IS_PLAYER(frag_attacker) && frag_attacker != frag_target)
264 {
265 float frag_deathtype = M_ARGV(3, float);
266 entity wep_ent = M_ARGV(4, entity);
267 // "team" kill, a point is awarded to the player by default so we must take it away plus an extra one
268 // unless the player is going to be punished for suicide, in which case just remove one
269 if(frag_attacker.survival_status == frag_target.survival_status)
270 GiveFrags(frag_attacker, frag_target, ((autocvar_g_survival_punish_teamkill) ? -1 : -2), frag_deathtype, wep_ent.weaponentity_fld);
271 }
272
273 if(frag_attacker.survival_status == SURV_STATUS_HUNTER)
274 M_ARGV(5, bool) = true; // anonymous attacker
275}
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:2321
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 288 of file sv_survival.qc.

289{
290 entity player = M_ARGV(0, entity);
291
292 // spectators / observers that weren't playing can join; they are
293 // immediately forced to observe in the PutClientInServer hook
294 // this way they are put in a team and can play in the next round
295 if (!allowed_to_spawn && INGAME(player))
296 return true;
297 return false;
298}
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 439 of file sv_survival.qc.

440{
441 entity frag_attacker = M_ARGV(0, entity);
443 frag_attacker.survival_validkills += M_ARGV(2, float);
444 M_ARGV(2, float) = 0; // score will be given to the winner when the round ends
445 return true;
446}
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 409 of file sv_survival.qc.

410{
411 entity player = M_ARGV(0, entity);
412 bool is_forced = M_ARGV(1, bool);
413 if (is_forced && INGAME(player))
414 INGAME_STATUS_CLEAR(player);
415
416 if (IS_PLAYER(player) && !IS_DEAD(player))
418 if (player.killindicator_teamchange == -2) // player wants to spectate
419 INGAME_STATUS_CLEAR(player);
420 if (INGAME(player))
421 player.frags = FRAGS_PLAYER_OUT_OF_GAME;
422 if (!warmup_stage)
423 eliminatedPlayers.SendFlags |= 1;
424 if (!INGAME(player))
425 {
426 player.survival_validkills = 0;
427 player.survival_status = 0;
428 return false; // allow team reset
429 }
430 return true; // prevent team reset
431}
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 341 of file sv_survival.qc.

342{
344 return true;
345}
void MatchEnd_RestoreSpectatorStatus()
Definition world.qc:1375

References MatchEnd_RestoreSpectatorStatus().

◆ MUTATOR_HOOKFUNCTION() [12/17]

MUTATOR_HOOKFUNCTION ( surv ,
PlayerDies  )

Definition at line 372 of file sv_survival.qc.

373{
374 entity frag_attacker = M_ARGV(1, entity);
376 float frag_deathtype = M_ARGV(3, float);
377
379 if (!allowed_to_spawn)
380 {
381 frag_target.respawn_flags = RESPAWN_SILENT;
382 // prevent unwanted sudden rejoin as spectator and movement of spectator camera
383 frag_target.respawn_time = time + 2;
384 }
385 frag_target.respawn_flags |= RESPAWN_FORCE;
386 if (!warmup_stage)
387 {
388 eliminatedPlayers.SendFlags |= 1;
391 }
392
393 // killed an ally! punishment is death
394 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))
395 if(!warmup_stage && round_handler_IsActive() && round_handler_IsRoundStarted()) // don't autokill if the round hasn't started yet
396 Damage(frag_attacker, frag_attacker, frag_attacker, 100000, DEATH_MIRRORDAMAGE.m_id, DMG_NOWEP, frag_attacker.origin, '0 0 0');
397 return true;
398}
float time
void Damage(entity targ, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
Definition damage.qc:503
#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:129
#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 277 of file sv_survival.qc.

278{
279 entity player = M_ARGV(0, entity);
280
281 player.survival_status = 0;
282 player.survival_validkills = 0;
284 if (!warmup_stage)
285 eliminatedPlayers.SendFlags |= 1;
286}
#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 300 of file sv_survival.qc.

301{
302 entity player = M_ARGV(0, entity);
303
304 if (!allowed_to_spawn && IS_PLAYER(player)) // this is true even when player is trying to join
305 {
306 TRANSMUTE(Observer, player);
307 if (CS(player).jointime != time && !INGAME(player)) // not when connecting
308 {
310 Send_Notification(NOTIF_ONE_ONLY, player, MSG_INFO, INFO_CA_JOIN_LATE);
311 }
312 }
313
314 if (!warmup_stage)
315 eliminatedPlayers.SendFlags |= 1;
316}
#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 335 of file sv_survival.qc.

336{
337 allowed_to_spawn = true;
338 return true;
339}

References allowed_to_spawn.

◆ MUTATOR_HOOKFUNCTION() [16/17]

MUTATOR_HOOKFUNCTION ( surv ,
reset_map_players  )

Definition at line 318 of file sv_survival.qc.

319{
320 FOREACH_CLIENT(true, {
321 CS(it).killcount = 0;
322 it.survival_status = 0;
323 if (INGAME(it) || IS_BOT_CLIENT(it))
324 {
325 TRANSMUTE(Player, it);
328 }
329 });
332 return true;
333}
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 433 of file sv_survival.qc.

434{
435 // announce remaining frags?
436 return true;
437}

◆ Surv_CheckPlayers()

bool Surv_CheckPlayers ( )

Definition at line 197 of file sv_survival.qc.

198{
199 static int prev_missing_players;
200 allowed_to_spawn = true;
201 int playercount = 0;
202 FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
203 {
204 ++playercount;
205 });
206 // NOTE missing_teams_mask stat is used for missing players in ffa games
207 if (playercount >= 2)
208 {
209 if(prev_missing_players > 0)
211 prev_missing_players = -1;
212 return true;
213 }
214 if(playercount == 0)
215 {
216 if(prev_missing_players > 0)
218 prev_missing_players = -1;
219 return false;
220 }
221 // if we get here, only 1 player is missing
222 if(prev_missing_players != 1)
223 {
225 prev_missing_players = 1;
226 }
227 return false;
228}
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 78 of file sv_survival.qc.

79{
82 {
83 // if the match times out, survivors win too!
84 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_SURVIVAL_SURVIVOR_WIN);
85 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_SURVIVAL_SURVIVOR_WIN);
88 });
89
91
92 allowed_to_spawn = false;
93 game_stopped = true;
96 return 1;
97 }
98
99 int survivor_count = 0, hunter_count = 0;
100 FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
101 {
102 if(it.survival_status == SURV_STATUS_PREY)
103 survivor_count++;
104 else if(it.survival_status == SURV_STATUS_HUNTER)
105 hunter_count++;
106 });
107 if(survivor_count > 0 && hunter_count > 0)
108 {
109 // Dr. Jaska:
110 // reset delay time here only for consistency
111 // Survival players currently have no known ways to resurrect
113 return 0;
114 }
115
116 // delay round ending a bit
119 && round_handler_GetEndTime() - time > 0) // don't delay past timelimit
120 {
122 {
124 return 0;
125 }
127 {
128 return 0;
129 }
130 }
131
132 if(hunter_count > 0) // hunters win
133 {
134 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_SURVIVAL_HUNTER_WIN);
135 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_SURVIVAL_HUNTER_WIN);
136 }
137 else if(survivor_count > 0) // survivors win
138 {
139 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_SURVIVAL_SURVIVOR_WIN);
140 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_SURVIVAL_SURVIVOR_WIN);
141 }
142 else
143 {
144 Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_TIED);
145 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_TIED);
146 }
147
148 Surv_UpdateScores(false);
149
150 allowed_to_spawn = false;
151 game_stopped = true;
154
157 });
158
159 return 1;
160}
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)
Definition sv_nades.qc:885
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 239 of file sv_survival.qc.

240{
242 field(SP_SURV_SURVIVALS, "survivals", 0);
243 field(SP_SURV_HUNTS, "hunts", SFL_SORT_PRIO_SECONDARY);
244 });
245
246 allowed_to_spawn = true;
251}
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 230 of file sv_survival.qc.

231{
232 if(INGAME_JOINED(e) && (IS_DEAD(e) || e.frags == FRAGS_PLAYER_OUT_OF_GAME))
233 return true;
234 if(INGAME_JOINING(e))
235 return true;
236 return false;
237}
#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 347 of file sv_survival.qc.

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

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 362 of file sv_survival.qc.

363{
365 {
367 if (pl)
368 Send_Notification(NOTIF_ONE_ONLY, pl, MSG_CENTER, CENTER_ALONE);
369 }
370}
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 162 of file sv_survival.qc.

163{
165 int playercount = 0;
166 FOREACH_CLIENT(true,
167 {
168 if(IS_PLAYER(it) && !IS_DEAD(it))
169 {
170 ++playercount;
171 it.survival_status = SURV_STATUS_PREY;
172 }
173 else
174 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!
175 it.survival_validkills = 0;
176 });
177 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
178 int total_hunters = 0;
180 {
181 if(total_hunters >= hunter_count)
182 break;
183 total_hunters++;
184 it.survival_status = SURV_STATUS_HUNTER;
185 });
187
188 FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
189 {
190 if(it.survival_status == SURV_STATUS_PREY)
191 Send_Notification(NOTIF_ONE_ONLY, it, MSG_CENTER, CENTER_SURVIVAL_SURVIVOR);
192 else if(it.survival_status == SURV_STATUS_HUNTER)
193 Send_Notification(NOTIF_ONE_ONLY, it, MSG_CENTER, CENTER_SURVIVAL_HUNTER);
194 });
195}
#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:56

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 56 of file sv_survival.qc.

57{
58 // give players their hard-earned kills now that the round is over
59 FOREACH_CLIENT(true,
60 {
61 it.totalfrags += it.survival_validkills;
62 if(it.survival_validkills)
63 GameRules_scoring_add(it, SCORE, it.survival_validkills);
64 it.survival_validkills = 0;
65 // player survived the round
66 if(IS_PLAYER(it) && !IS_DEAD(it))
67 {
68 if(autocvar_g_survival_reward_survival && timed_out && it.survival_status == SURV_STATUS_PREY)
69 GameRules_scoring_add(it, SCORE, 1); // reward survivors who make it to the end of the round time limit
70 if(it.survival_status == SURV_STATUS_PREY)
71 GameRules_scoring_add(it, SURV_SURVIVALS, 1);
72 else if(it.survival_status == SURV_STATUS_HUNTER)
73 GameRules_scoring_add(it, SURV_HUNTS, 1);
74 }
75 });
76}
#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 46 of file sv_survival.qc.

47{
49 {
50 backtrace("Can't spawn survivalStatuses again!");
51 return;
52 }
54}
void Net_LinkEntity(entity e, bool docull, float dt, bool(entity this, entity to, int sendflags) sendfunc)
Definition net.qh:123
#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 Stream out = MSG_ENTITY;
19 WriteHeader(out, ENT_CLIENT_SURVIVALSTATUSES);
20
21 // always send hunters their own status and their allies
22 if (dest.survival_status == SURV_STATUS_HUNTER)
23 sendflags |= STATUS_SEND_HUNTERS;
24
25 serialize(byte, out, sendflags);
26 if (sendflags & STATUS_SEND_HUNTERS)
27 {
28 for (int i = 1; i <= maxclients; i += 8)
29 {
30 int f = 0;
31 entity e = edict_num(i);
32
33 for (int b = 0; b < 8; ++b, e = nextent(e))
34 {
35 bool is_hunter = (INGAME(e) && e.survival_status == SURV_STATUS_HUNTER);
36 if (is_hunter)
37 f |= BIT(b);
38 }
39 serialize(byte, out, f);
40 }
41 }
42 //print(sprintf("sent flags %f to %s\n", sendflags, dest.netname));
43 return true;
44}
#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
int Stream
Definition net.qh:234
#define serialize(T, stream,...)
Definition net.qh:243
const int MSG_ENTITY
Definition net.qh:115
#define WriteHeader(to, id)
Definition net.qh:221
entity nextent(entity e)

References BIT, dest, entity(), INGAME, maxclients, MSG_ENTITY, nextent(), serialize, STATUS_SEND_HUNTERS, SURV_STATUS_HUNTER, 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