Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
client.qh File Reference
#include "utils.qh"
#include <server/intermission.qh>
#include <common/replicate.qh>
#include <common/sounds/all.qh>
Include dependency graph for client.qh:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  Client
class  Observer
class  Player
class  Spectator

Macros

#define GAMETYPE_DEFAULTED_SETTING(str)
#define INDEPENDENT_PLAYERS   (autocvar__independent_players ? (autocvar__independent_players > 0) : independent_players)
#define IS_INDEPENDENT_PLAYER(e)
#define MAKE_INDEPENDENT_PLAYER(e)
#define SPECTATE_COPY()
#define SPECTATE_COPYFIELD(fld)
#define UNWIND(class)

Functions

void calculate_player_respawn_time (entity this)
void ClientData_Touch (entity e, bool to_spectators_too)
void ClientInit_misc (entity this)
void ClientInit_Spawn ()
void ClientState_attach (entity this)
void FixClientCvars (entity e)
void FixPlayermodel (entity player)
int GetPlayerLimit ()
void GiveWarmupResources (entity this)
void Join (entity this, bool queued_join)
 it's assumed this isn't called for bots (campaign_bots_may_start, centreprints)
bool joinAllowed (entity this, int team_index)
int nJoinAllowed (entity this)
 Determines how many player slots are free.
void play_countdown (entity this, float finished, Sound samp)
void player_powerups_remove_all (entity this, bool allow_poweroff_sound)
void PlayerFrame (entity this)
bool PlayerInIDList (entity p, string idlist)
bool PlayerInIPList (entity p, string iplist)
bool PlayerInList (entity player, string list)
void PlayerUseKey (entity this)
void PutObserverInServer (entity this, bool is_forced, bool use_spawnpoint)
 putting a client as observer in the server
void RotRegen (entity this, entity current, float limit_mod, float regenstable, float regenfactor, float regenlinear, float regenframetime, float rotstable, float rotfactor, float rotlinear, float rotframetime)
void SendWelcomeMessage (entity this, int msg_type)
void SetSpectatee (entity this, entity spectatee)
void SetSpectatee_status (entity this, int spectatee_num)
bool Spectate (entity this, entity pl)
 STATIC_INIT (client_lists)
 void (entity this, entity player) init_for_player

Variables

float alivetime_start
int autocvar__independent_players
bool autocvar__notarget
int autocvar_g_balance_armor_start
float autocvar_g_balance_pause_armor_rot_spawn
float autocvar_g_balance_pause_fuel_rot_spawn
float autocvar_g_balance_pause_health_regen_spawn
float autocvar_g_balance_pause_health_rot_spawn
bool autocvar_g_botclip_collisions
bool autocvar_g_forced_respawn
bool autocvar_g_fullbrightplayers
int autocvar_g_maxplayers
float autocvar_g_maxplayers_spectator_blocktime
string autocvar_g_mutatormsg
bool autocvar_g_nodepthtestplayers
float autocvar_g_player_alpha
float autocvar_g_player_brightness
float autocvar_g_player_damageforcescale = 2
bool autocvar_g_playerclip_collisions
bool autocvar_g_respawn_delay_forced
float autocvar_g_respawn_delay_large
int autocvar_g_respawn_delay_large_count
float autocvar_g_respawn_delay_max
float autocvar_g_respawn_delay_small
int autocvar_g_respawn_delay_small_count
bool autocvar_g_respawn_ghosts
float autocvar_g_respawn_ghosts_alpha = 1
float autocvar_g_respawn_ghosts_fadetime = 1.5
float autocvar_g_respawn_ghosts_speed
float autocvar_g_respawn_ghosts_time = 4.5
int autocvar_g_respawn_waves
string autocvar_g_xonoticversion
float autocvar_gameversion
float autocvar_gameversion_max
float autocvar_gameversion_min
string autocvar_hostname
int autocvar_spawn_debug
float autocvar_sv_foginterval
float autocvar_sv_maxidle
bool autocvar_sv_maxidle_alsokickspectators
int autocvar_sv_maxidle_minplayers = 2
float autocvar_sv_maxidle_playertospectator = 60
int autocvar_sv_maxidle_slots
bool autocvar_sv_maxidle_slots_countbots
string autocvar_sv_motd
int autocvar_sv_name_maxlength = 64
float autocvar_sv_player_scale
string autocvar_sv_quickmenu_file
bool autocvar_sv_servermodelsonly
bool autocvar_sv_show_entnum
bool autocvar_sv_showspectators
bool autocvar_sv_spectate
bool autocvar_sv_teamnagger
entity clientdata
float death_time
IntrusiveList g_initforplayer
IntrusiveList g_observepoints
bool independent_players
float jointime
bool just_joined
int killcount
const int MAX_SPECTATORS = 7
const int MIN_SPEC_TIME = 1
float pauseregen_finished
float pauserotarmor_finished
float pauserotfuel_finished
float pauserothealth_finished
bool player_blocked
int playerid
string playermodel
string playerskin
int pressedkeys
float respawn_countdown
const int RESPAWN_DENY = BIT(2)
int respawn_flags
const int RESPAWN_FORCE = BIT(0)
const int RESPAWN_SILENT = BIT(1)
float respawn_time
float respawn_time_max
int spectatee_status
float spectatortime
float startplaytime
const int SVC_SETVIEW = 5
int team_selected
int wants_join
string weaponorder_byimpulse
bool zoomstate

Macro Definition Documentation

◆ GAMETYPE_DEFAULTED_SETTING

#define GAMETYPE_DEFAULTED_SETTING ( str)
Value:
((gametype_setting_tmp = cvar(strcat("g_", GetGametype(), "_" #str))), \
(gametype_setting_tmp < 0) ? 0 \
: (gametype_setting_tmp == 0 || autocvar_g_respawn_delay_forced) ? max(0, autocvar_g_##str) \
: gametype_setting_tmp)
string GetGametype()
float cvar(string name)
float max(float f,...)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
bool autocvar_g_respawn_delay_forced
Definition client.qh:27

Definition at line 347 of file client.qh.

347#define GAMETYPE_DEFAULTED_SETTING(str) \
348 ((gametype_setting_tmp = cvar(strcat("g_", GetGametype(), "_" #str))), \
349 (gametype_setting_tmp < 0) ? 0 \
350 : (gametype_setting_tmp == 0 || autocvar_g_respawn_delay_forced) ? max(0, autocvar_g_##str) \
351 : gametype_setting_tmp)

Referenced by calculate_player_respawn_time().

◆ INDEPENDENT_PLAYERS

Definition at line 311 of file client.qh.

Referenced by PutPlayerInServer(), and ScoreRules_basics().

◆ IS_INDEPENDENT_PLAYER

◆ MAKE_INDEPENDENT_PLAYER

#define MAKE_INDEPENDENT_PLAYER ( e)
Value:
(((e).solid = SOLID_TRIGGER), ((e).frags = FRAGS_PLAYER_OUT_OF_GAME))
const int FRAGS_PLAYER_OUT_OF_GAME
Definition constants.qh:5

Definition at line 313 of file client.qh.

Referenced by PutPlayerInServer(), race_AbandonRaceCheck(), and race_SendTime().

◆ SPECTATE_COPY

#define SPECTATE_COPY ( )
Value:
ACCUMULATE void SpectateCopy(entity this, entity spectatee)
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define ACCUMULATE
Definition _all.inc:31
void SpectateCopy(entity this, entity spectatee)
Definition client.qc:1794

Definition at line 410 of file client.qh.

◆ SPECTATE_COPYFIELD

#define SPECTATE_COPYFIELD ( fld)
Value:
SPECTATE_COPY() { this.(fld) = spectatee.(fld); }
#define SPECTATE_COPY()
Definition client.qh:410

Definition at line 411 of file client.qh.

◆ UNWIND

#define UNWIND ( class)
Value:
MACRO_BEGIN if (this.instanceOf##class) { METHOD_REFERENCE(class, dtorimpl)(this); } MACRO_END
#define MACRO_END
Definition macro.qh:7
#define MACRO_BEGIN
Definition macro.qh:6
#define METHOD_REFERENCE(cname, name)
Definition oo.qh:322

Referenced by Client::m_unwind().

Function Documentation

◆ calculate_player_respawn_time()

void calculate_player_respawn_time ( entity this)

Definition at line 1394 of file client.qc.

1395{
1396 if(MUTATOR_CALLHOOK(CalculateRespawnTime, this))
1397 return;
1398
1399 float gametype_setting_tmp;
1400 float sdelay_max = GAMETYPE_DEFAULTED_SETTING(respawn_delay_max);
1401 float sdelay_small = GAMETYPE_DEFAULTED_SETTING(respawn_delay_small);
1402 float sdelay_large = GAMETYPE_DEFAULTED_SETTING(respawn_delay_large);
1403 float sdelay_small_count = GAMETYPE_DEFAULTED_SETTING(respawn_delay_small_count);
1404 float sdelay_large_count = GAMETYPE_DEFAULTED_SETTING(respawn_delay_large_count);
1405 float waves = GAMETYPE_DEFAULTED_SETTING(respawn_waves);
1406
1407 float pcount = 1; // Include myself whether or not team is already set right and I'm a "player".
1408 if (teamplay)
1409 {
1410 FOREACH_CLIENT(IS_PLAYER(it) && it != this,
1411 {
1412 if(it.team == this.team)
1413 ++pcount;
1414 });
1415 if (sdelay_small_count == 0)
1416 sdelay_small_count = 1;
1417 if (sdelay_large_count == 0)
1418 sdelay_large_count = 1;
1419 }
1420 else
1421 {
1422 FOREACH_CLIENT(IS_PLAYER(it) && it != this,
1423 {
1424 ++pcount;
1425 });
1426 if (sdelay_small_count == 0)
1427 {
1428 if (IS_INDEPENDENT_PLAYER(this))
1429 {
1430 // Players play independently. No point in requiring enemies.
1431 sdelay_small_count = 1;
1432 }
1433 else
1434 {
1435 // Players play AGAINST each other. Enemies required.
1436 sdelay_small_count = 2;
1437 }
1438 }
1439 if (sdelay_large_count == 0)
1440 {
1441 if (IS_INDEPENDENT_PLAYER(this))
1442 {
1443 // Players play independently. No point in requiring enemies.
1444 sdelay_large_count = 1;
1445 }
1446 else
1447 {
1448 // Players play AGAINST each other. Enemies required.
1449 sdelay_large_count = 2;
1450 }
1451 }
1452 }
1453
1454 float sdelay;
1455
1456 if (pcount <= sdelay_small_count)
1457 sdelay = sdelay_small;
1458 else if (pcount >= sdelay_large_count)
1459 sdelay = sdelay_large;
1460 else // NOTE: this case implies sdelay_large_count > sdelay_small_count.
1461 sdelay = sdelay_small + (sdelay_large - sdelay_small) * (pcount - sdelay_small_count) / (sdelay_large_count - sdelay_small_count);
1462
1463 if(waves)
1464 this.respawn_time = ceil((time + sdelay) / waves) * waves;
1465 else
1466 this.respawn_time = time + sdelay;
1467
1468 if(sdelay < sdelay_max)
1469 this.respawn_time_max = time + sdelay_max;
1470 else
1471 this.respawn_time_max = this.respawn_time;
1472
1473 if((sdelay + waves >= 5.0) && (this.respawn_time - time > 1.75))
1474 this.respawn_countdown = 10; // first number to count down from is 10
1475 else
1476 this.respawn_countdown = -1; // do not count down
1477
1480}
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
#define IS_PLAYER(s)
Definition player.qh:242
float time
float ceil(float f)
float respawn_time_max
Definition client.qh:322
int respawn_flags
Definition client.qh:320
bool autocvar_g_forced_respawn
Definition client.qh:43
#define IS_INDEPENDENT_PLAYER(e)
Definition client.qh:312
float respawn_time
Definition client.qh:321
#define GAMETYPE_DEFAULTED_SETTING(str)
Definition client.qh:347
float respawn_countdown
Definition client.qh:324
const int RESPAWN_FORCE
Definition client.qh:326
bool teamplay
Definition teams.qh:59
#define FOREACH_CLIENT(cond, body)
Definition utils.qh:52

References autocvar_g_forced_respawn, ceil(), entity(), FOREACH_CLIENT, GAMETYPE_DEFAULTED_SETTING, IS_INDEPENDENT_PLAYER, IS_PLAYER, MUTATOR_CALLHOOK, respawn_countdown, respawn_flags, RESPAWN_FORCE, respawn_time, respawn_time_max, teamplay, and time.

Referenced by PlayerDamage().

◆ ClientData_Touch()

void ClientData_Touch ( entity e,
bool to_spectators_too )

Definition at line 185 of file client.qc.

186{
187 entity cd = CS(e).clientdata;
188 if (cd) cd.SendFlags = 1;
189
190 if (to_spectators_too)
191 FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != e && IS_SPEC(it) && it.enemy == e,
192 {
193 entity cd_spec = CS(it).clientdata;
194 if (cd_spec) cd_spec.SendFlags = cd.SendFlags;
195 });
196}
ClientState CS(Client this)
Definition state.qh:47
#define IS_SPEC(v)
Definition utils.qh:10
#define IS_REAL_CLIENT(v)
Definition utils.qh:17

References CS(), entity(), FOREACH_CLIENT, IS_REAL_CLIENT, and IS_SPEC.

Referenced by ignore_list_send(), race_AbandonRaceCheck(), race_SendTime(), ReadyRestart_force(), SetSpectatee(), SetSpectatee_status(), SetZoomState(), and SpectateSet().

◆ ClientInit_misc()

void ClientInit_misc ( entity this)

Definition at line 907 of file client.qc.

908{
909 int channel = MSG_ONE;
910 WriteHeader(channel, ENT_CLIENT_INIT);
911 WriteByte(channel, g_nexball_meter_period * 32);
912 WriteInt24_t(channel, compressShotOrigin(hook_shotorigin[0]));
913 WriteInt24_t(channel, compressShotOrigin(hook_shotorigin[1]));
914 WriteInt24_t(channel, compressShotOrigin(hook_shotorigin[2]));
915 WriteInt24_t(channel, compressShotOrigin(hook_shotorigin[3]));
916 WriteInt24_t(channel, compressShotOrigin(arc_shotorigin[0]));
917 WriteInt24_t(channel, compressShotOrigin(arc_shotorigin[1]));
918 WriteInt24_t(channel, compressShotOrigin(arc_shotorigin[2]));
919 WriteInt24_t(channel, compressShotOrigin(arc_shotorigin[3]));
920
921 if(autocvar_sv_foginterval && world.fog != "")
922 WriteString(channel, world.fog);
923 else
924 WriteString(channel, "");
925 WriteByte(channel, this.count * 255.0); // g_balance_armor_blockpercent
926 WriteByte(channel, this.cnt * 255.0); // g_balance_damagepush_speedfactor
927 WriteByte(channel, serverflags);
929}
vector arc_shotorigin[4]
Definition arc.qh:108
float cnt
Definition powerups.qc:24
float count
Definition powerups.qc:22
int serverflags
Definition main.qh:211
vector hook_shotorigin[4]
Definition main.qh:205
float compressShotOrigin(vector v)
Definition util.qc:1348
#define WriteHeader(to, id)
Definition net.qh:265
float MSG_ONE
Definition menudefs.qc:56
void WriteString(string data, float dest, float desto)
void WriteCoord(float data, float dest, float desto)
void WriteByte(float data, float dest, float desto)
#define world
Definition post.qh:15
float autocvar_sv_foginterval
Definition client.qh:36
float g_nexball_meter_period
Definition sv_nexball.qh:54
float autocvar_g_trueaim_minrange
Definition tracing.qh:17

References arc_shotorigin, autocvar_g_trueaim_minrange, autocvar_sv_foginterval, cnt, compressShotOrigin(), count, entity(), g_nexball_meter_period, hook_shotorigin, MSG_ONE, serverflags, world, WriteByte(), WriteCoord(), WriteHeader, and WriteString().

Referenced by ClientInit_SendEntity().

◆ ClientInit_Spawn()

void ClientInit_Spawn ( )

Definition at line 946 of file client.qc.

947{
948 entity e = new_pure(clientinit);
951
953}
void Net_LinkEntity(entity e, bool docull, float dt, bool(entity this, entity to, int sendflags) sendfunc)
Definition net.qh:167
#define new_pure(class)
purely logical entities (not linked to the area grid)
Definition oo.qh:67
#define setthink(e, f)
void ClientInit_CheckUpdate(entity this)
Definition client.qc:931
bool ClientInit_SendEntity(entity this, entity to, int sf)
Definition client.qc:895

References ClientInit_CheckUpdate(), ClientInit_SendEntity(), entity(), Net_LinkEntity(), new_pure, and setthink.

Referenced by spawnfunc().

◆ ClientState_attach()

void ClientState_attach ( entity this)

Definition at line 46 of file state.qc.

47{
48 this._cs = NEW(ClientState, this);
49
50 // TODO: fold all of these into ClientState
51
52 DecodeLevelParms(this);
53
57 accuracy_init(this);
58 entcs_attach(this);
59 anticheat_init(this);
60 W_HitPlotOpen(this);
63}
Purpose: common client state, usable on client and server Client: singleton representing the viewed p...
Definition state.qh:29
#define NEW(cname,...)
Definition oo.qh:117
void PlayerStats_PlayerBasic_CheckUpdate(entity joiningplayer)
void accuracy_init(entity this)
init/free
Definition accuracy.qc:50
void anticheat_init(entity this)
Definition anticheat.qc:255
void PlayerScore_Attach(entity this)
Definition scores.qc:331
void InventoryStorage_attach(PlayerState this)
void entcs_attach(entity this)
Definition ent_cs.qc:251
void ClientData_Attach(entity this)
Definition client.qc:172
void DecodeLevelParms(entity this)
Definition client.qc:986
void W_HitPlotOpen(entity this)
Definition hitplot.qc:82
ClientState _cs
Definition state.qh:42
void StatusEffectsStorage_attach(entity e)

References _cs, accuracy_init(), anticheat_init(), ClientData_Attach(), DecodeLevelParms(), entcs_attach(), entity(), InventoryStorage_attach(), NEW, PlayerScore_Attach(), PlayerStats_PlayerBasic_CheckUpdate(), StatusEffectsStorage_attach(), and W_HitPlotOpen().

Referenced by Client::Client().

◆ FixClientCvars()

void FixClientCvars ( entity e)

Definition at line 999 of file client.qc.

1000{
1001 // send prediction settings to the client
1002 if(autocvar_g_antilag == 3) // client side hitscan
1003 stuffcmd(e, "cl_cmd settemp cl_prydoncursor_notrace 0\n");
1004 if(autocvar_sv_gentle)
1005 stuffcmd(e, "cl_cmd settemp cl_gentle 1\n");
1006
1007 stuffcmd(e, sprintf("\ncl_jumpspeedcap_min \"%s\"\n", autocvar_sv_jumpspeedcap_min));
1008 stuffcmd(e, sprintf("\ncl_jumpspeedcap_max \"%s\"\n", autocvar_sv_jumpspeedcap_max));
1009
1010 stuffcmd(e, sprintf("\ncl_shootfromfixedorigin \"%s\"\n", autocvar_g_shootfromfixedorigin));
1011
1013}
int autocvar_g_antilag
Definition antilag.qh:3
float autocvar_sv_jumpspeedcap_min
Definition player.qh:49
float autocvar_sv_jumpspeedcap_max
Definition player.qh:47
#define stuffcmd(cl,...)
Definition progsdefs.qh:23
void FixClientCvars(entity e)
Definition client.qc:999
string autocvar_g_shootfromfixedorigin
Definition all.qh:442

References autocvar_g_antilag, autocvar_g_shootfromfixedorigin, autocvar_sv_jumpspeedcap_max, autocvar_sv_jumpspeedcap_min, entity(), FixClientCvars(), MUTATOR_CALLHOOK, and stuffcmd.

Referenced by ClientConnect(), FixClientCvars(), MapVote_Finished(), MUTATOR_HOOKABLE(), MUTATOR_HOOKFUNCTION(), and MUTATOR_HOOKFUNCTION().

◆ FixPlayermodel()

void FixPlayermodel ( entity player)

Definition at line 454 of file client.qc.

455{
456 string defaultmodel = "";
457 int defaultskin = 0;
459 {
460 if(teamplay)
461 {
462 switch(player.team)
463 {
468 }
469 }
470
471 if(defaultmodel == "")
472 {
473 defaultmodel = autocvar_sv_defaultplayermodel;
474 defaultskin = autocvar_sv_defaultplayerskin;
475 }
476
477 int n = tokenize_console(defaultmodel);
478 if(n > 0)
479 {
480 defaultmodel = argv(floor(n * CS(player).model_randomizer));
481 // However, do NOT randomize if the player-selected model is in the list.
482 for (int i = 0; i < n; ++i)
483 if ((argv(i) == player.playermodel && defaultskin == stof(player.playerskin)) || argv(i) == strcat(player.playermodel, ":", player.playerskin))
484 defaultmodel = argv(i);
485 }
486
487 int i = strstrofs(defaultmodel, ":", 0);
488 if(i >= 0)
489 {
490 defaultskin = stof(substring(defaultmodel, i+1, -1));
491 defaultmodel = substring(defaultmodel, 0, i);
492 }
493 }
494 if(autocvar_sv_defaultcharacterskin && !defaultskin)
495 {
496 if(teamplay)
497 {
498 switch(player.team)
499 {
500 case NUM_TEAM_1: defaultskin = autocvar_sv_defaultplayerskin_red; break;
501 case NUM_TEAM_2: defaultskin = autocvar_sv_defaultplayerskin_blue; break;
502 case NUM_TEAM_3: defaultskin = autocvar_sv_defaultplayerskin_yellow; break;
503 case NUM_TEAM_4: defaultskin = autocvar_sv_defaultplayerskin_pink; break;
504 }
505 }
506
507 if(!defaultskin)
508 defaultskin = autocvar_sv_defaultplayerskin;
509 }
510
511 MUTATOR_CALLHOOK(FixPlayermodel, defaultmodel, defaultskin, player);
512 defaultmodel = M_ARGV(0, string);
513 defaultskin = M_ARGV(1, int);
514
515 bool chmdl = false;
516 int oldskin;
517 if(defaultmodel != "")
518 {
519 if (defaultmodel != player.model)
520 {
521 vector m1 = player.mins;
522 vector m2 = player.maxs;
523 setplayermodel (player, defaultmodel);
524 setsize (player, m1, m2);
525 chmdl = true;
526 }
527
528 oldskin = player.skin;
529 player.skin = defaultskin;
530 }
531 else
532 {
533 if (player.playermodel != player.model || player.playermodel == "")
534 {
535 player.playermodel = CheckPlayerModel(player.playermodel); // this is never "", so no endless loop
536 vector m1 = player.mins;
537 vector m2 = player.maxs;
538 setplayermodel (player, player.playermodel);
539 setsize (player, m1, m2);
540 chmdl = true;
541 }
542
544 {
545 oldskin = player.skin;
546 player.skin = stof(player.playerskin);
547 }
548 else
549 {
550 oldskin = player.skin;
551 player.skin = defaultskin;
552 }
553 }
554
555 if(chmdl || oldskin != player.skin) // model or skin has changed
556 {
557 player.species = player_getspecies(player); // update species
559 UpdatePlayerSounds(player); // update skin sounds
560 }
561
562 if(!teamplay)
564 if(player.clientcolors != stof(autocvar_sv_defaultplayercolors))
566}
#define M_ARGV(x, type)
Definition events.qh:17
#define strstrofs
#define strlen
#define tokenize_console
void UpdatePlayerSounds(entity this)
bool autocvar_g_debug_globalsounds
Use new sound handling.
Definition globalsound.qh:9
float stof(string val,...)
string substring(string s, float start, float length)
float floor(float f)
string argv(float n)
#define setcolor
Definition pre.qh:11
vector
Definition self.qh:92
int player_getspecies(entity this)
Definition client.qc:444
float model_randomizer
Definition client.qc:453
string CheckPlayerModel(string plyermodel)
Definition client.qc:208
void FixPlayermodel(entity player)
Definition client.qc:454
void setplayermodel(entity e, string modelname)
Definition client.qc:241
string autocvar_sv_defaultplayermodel_blue
Definition player.qh:14
int autocvar_sv_defaultplayerskin_pink
Definition player.qh:9
int autocvar_sv_defaultplayerskin_yellow
Definition player.qh:11
string autocvar_sv_defaultplayermodel_yellow
Definition player.qh:17
string autocvar_sv_defaultplayermodel_red
Definition player.qh:16
string autocvar_sv_defaultplayercolors
Definition player.qh:12
bool autocvar_sv_defaultcharacter
Definition player.qh:6
int autocvar_sv_defaultplayerskin_blue
Definition player.qh:8
int autocvar_sv_defaultplayerskin_red
Definition player.qh:10
int autocvar_sv_defaultplayerskin
Definition player.qh:18
string autocvar_sv_defaultplayermodel
Definition player.qh:13
string autocvar_sv_defaultplayermodel_pink
Definition player.qh:15
bool autocvar_sv_defaultcharacterskin
Definition player.qh:7
int oldskin
const int NUM_TEAM_2
Definition teams.qh:14
const int NUM_TEAM_4
Definition teams.qh:16
const int NUM_TEAM_3
Definition teams.qh:15
const int NUM_TEAM_1
Definition teams.qh:13

References argv(), autocvar_g_debug_globalsounds, autocvar_sv_defaultcharacter, autocvar_sv_defaultcharacterskin, autocvar_sv_defaultplayercolors, autocvar_sv_defaultplayermodel, autocvar_sv_defaultplayermodel_blue, autocvar_sv_defaultplayermodel_pink, autocvar_sv_defaultplayermodel_red, autocvar_sv_defaultplayermodel_yellow, autocvar_sv_defaultplayerskin, autocvar_sv_defaultplayerskin_blue, autocvar_sv_defaultplayerskin_pink, autocvar_sv_defaultplayerskin_red, autocvar_sv_defaultplayerskin_yellow, CheckPlayerModel(), CS(), entity(), FixPlayermodel(), floor(), M_ARGV, model_randomizer, MUTATOR_CALLHOOK, NUM_TEAM_1, NUM_TEAM_2, NUM_TEAM_3, NUM_TEAM_4, oldskin, player_getspecies(), setcolor, setplayermodel(), stof(), strcat(), strlen, strstrofs, substring(), teamplay, tokenize_console, UpdatePlayerSounds(), and vector.

Referenced by FixPlayermodel(), MUTATOR_HOOKABLE(), PlayerThink(), PutObserverInServer(), and PutPlayerInServer().

◆ GetPlayerLimit()

int GetPlayerLimit ( )

Definition at line 2128 of file client.qc.

2129{
2130 if(g_duel)
2131 return 2; // TODO: this workaround is needed since the mutator hook from duel can't be activated before the gametype is loaded (e.g. switching modes via gametype vote screen)
2132 // don't return map_maxplayers during intermission as it would interfere with MapHasRightSize()
2134 MUTATOR_CALLHOOK(GetPlayerLimit, player_limit);
2135 player_limit = M_ARGV(0, int);
2136 return player_limit < maxclients && player_limit > 0 ? player_limit : 0;
2137}
#define g_duel
Definition duel.qh:32
bool intermission_running
int map_maxplayers
Definition mapinfo.qh:191
int GetPlayerLimit()
Definition client.qc:2128
int autocvar_g_maxplayers
Definition client.qh:44

References autocvar_g_maxplayers, g_duel, GetPlayerLimit(), intermission_running, M_ARGV, map_maxplayers, and MUTATOR_CALLHOOK.

Referenced by bot_fixcount(), GameplayMode_DelayedInit(), GetPlayerLimit(), MapHasRightSize(), MUTATOR_HOOKABLE(), MUTATOR_HOOKFUNCTION(), nJoinAllowed(), and SendWelcomeMessage().

◆ GiveWarmupResources()

void GiveWarmupResources ( entity this)

Definition at line 568 of file client.qc.

569{
570 SetResource(this, RES_SHELLS, warmup_start_ammo_shells);
571 SetResource(this, RES_BULLETS, warmup_start_ammo_nails);
572 SetResource(this, RES_ROCKETS, warmup_start_ammo_rockets);
573 SetResource(this, RES_CELLS, warmup_start_ammo_cells);
574 SetResource(this, RES_FUEL, warmup_start_ammo_fuel);
575 SetResource(this, RES_HEALTH, warmup_start_health);
577 STAT(WEAPONS, this) = WARMUP_START_WEAPONS;
578}
void SetResource(entity e, Resource res_type, float amount)
Sets the current amount of resource the given entity will have.
RES_ARMOR
Definition ent_cs.qc:130
#define STAT(...)
Definition stats.qh:82
float warmup_start_ammo_cells
Definition world.qh:105
#define WARMUP_START_WEAPONS
Definition world.qh:101
float warmup_start_ammo_rockets
Definition world.qh:104
float warmup_start_ammo_shells
Definition world.qh:102
float warmup_start_ammo_nails
Definition world.qh:103
float warmup_start_health
Definition world.qh:107
float warmup_start_ammo_fuel
Definition world.qh:106
float warmup_start_armorvalue
Definition world.qh:108

References entity(), RES_ARMOR, SetResource(), STAT, warmup_start_ammo_cells, warmup_start_ammo_fuel, warmup_start_ammo_nails, warmup_start_ammo_rockets, warmup_start_ammo_shells, warmup_start_armorvalue, warmup_start_health, and WARMUP_START_WEAPONS.

Referenced by PutPlayerInServer(), and ReadyCount().

◆ Join()

void Join ( entity this,
bool queued_join )

it's assumed this isn't called for bots (campaign_bots_may_start, centreprints)

Definition at line 2069 of file client.qc.

2070{
2071 entity player_with_dibs = NULL;
2072
2074 {
2076 ReadyRestart(true);
2078 }
2079
2080 if(queued_join
2081 && TeamBalance_AreEqual(this, true)) // if a player couldn't tag in for balance, don't join them here as it would cause a stack
2082 {
2083 // First we must join player(s) queued for specific team(s) (they chose first)
2084 // so TeamBalance_JoinBestTeam() (if necessary) won't select the same team(s).
2085 // Relies on `this` skipping the queue (this.team already set, this.wants_join not set) or using autoselect.
2086 FOREACH_CLIENT(it != this && it.wants_join > 0,
2087 {
2088 // detect any conflict between `this` and a queued player (queuePlayer() handles other conflicts)
2089 if (this.team < 0 && this.team_selected > 0 // `this` can't have their preference
2090 && it.wants_join == this.team_selected) // `it` is the player who already chose the team `this` wanted
2091 player_with_dibs = it;
2092
2093 Join(it, false);
2094 });
2095
2096 // Second pass: queued players whose team will be autoselected
2097 FOREACH_CLIENT(it != this && it.wants_join < 0,
2098 {
2099 Join(it, false);
2100 });
2101 }
2102
2103 Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_PREVENT_JOIN);
2104
2105 TRANSMUTE(Player, this);
2106 PutClientInServer(this);
2107
2108 if(IS_PLAYER(this)) // could be false due to PutClientInServer() mutator hook
2109 {
2110 if (!teamplay)
2111 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_JOIN_PLAY, this.netname);
2112 else if (player_with_dibs)
2113 // limitation: notifications support only 1 translated team name
2114 // so the team `this` preferred can't be mentioned, only the team they got assigned to.
2115 Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, APP_TEAM_NUM(this.team, CENTER_JOIN_PLAY_TEAM_QUEUECONFLICT), player_with_dibs.netname);
2116 else
2117 {
2118 if (this.wants_join && game_starttime < time && !warmup_stage) // No countdown running && not returning to warmup via ReadyRestart_force
2119 Send_Notification(NOTIF_ONE_ONLY, this, MSG_ANNCE, ANNCE_BEGIN); // Get queued player's attention
2120 Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, APP_TEAM_NUM(this.team, CENTER_JOIN_PLAY_TEAM));
2121 }
2122 }
2123
2124 this.team_selected = 0;
2125 this.wants_join = 0;
2126}
string netname
Definition powerups.qc:20
bool warmup_stage
Definition main.qh:120
int team
Definition main.qh:188
float game_starttime
Definition stats.qh:82
float game_stopped
Definition stats.qh:81
int wants_join
Definition ent_cs.qh:73
#define PutClientInServer
Definition _all.inc:246
bool autocvar_g_campaign
Definition menu.qc:752
s1 s2 s1 s2 FLAG s1 s2 FLAG spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 CPID_PREVENT_JOIN
Definition all.inc:732
void Send_Notification(NOTIF broadcast, entity client, MSG net_type, Notification net_name,...count)
Definition all.qc:1573
void Kill_Notification(NOTIF broadcast, entity client, MSG net_type, CPID net_cpid)
Definition all.qc:1537
#define APP_TEAM_NUM(num, prefix)
Definition all.qh:84
#define TRANSMUTE(cname, this,...)
Definition oo.qh:136
#define NULL
Definition post.qh:14
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 team_selected
Definition client.qh:75
void ReadyRestart(bool forceWarmupEnd)
Definition vote.qc:526
bool TeamBalance_AreEqual(entity ignore, bool would_leave)
Definition teamplay.qc:656

References APP_TEAM_NUM, autocvar_g_campaign, campaign_bots_may_start, CPID_PREVENT_JOIN, entity(), FOREACH_CLIENT, game_starttime, game_stopped, IS_PLAYER, Kill_Notification(), netname, NULL, PutClientInServer, ReadyRestart(), Send_Notification(), team, team_selected, TeamBalance_AreEqual(), teamplay, time, TRANSMUTE, wants_join, and warmup_stage.

Referenced by ClientCommand_join(), ObserverOrSpectatorThink(), PlayerPreThink(), ReadyRestart_force(), and TeamBalance_QueuedPlayersTagIn().

◆ joinAllowed()

bool joinAllowed ( entity this,
int team_index )

Definition at line 2231 of file client.qc.

2232{
2233 if (CS(this).version_mismatch)
2234 {
2235 Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_JOIN_PREVENT_VERSIONMISMATCH);
2236 return false;
2237 }
2238 if (time < CS(this).jointime + MIN_SPEC_TIME) return false;
2239 if (teamplay && lockteams)
2240 {
2241 Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_TEAMCHANGE_LOCKED);
2242 return false;
2243 }
2244
2245 if (Player_GetForcedTeamIndex(this) == TEAM_FORCE_SPECTATOR) return false;
2246
2247 if (!INGAME(this) && PlayerInList(this, autocvar_g_playban_list))
2248 {
2249 Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_JOIN_PLAYBAN);
2250 return false;
2251 }
2252
2253 // IS_PLAYER for most gametypes, INGAME for ca, lms, surv
2254 if (autocvar_g_maxping && !(IS_PLAYER(this) || INGAME(this)) && !this.wants_join)
2255 {
2256 if (this.ping <= 0) return false; // too soon
2257 if (this.ping > autocvar_g_maxping)
2258 {
2259 Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_JOIN_PREVENT_PING);
2260 return false;
2261 }
2262 }
2263
2264 if (QueueNeeded(this))
2265 {
2266 if (team_index == 0) // so ClientCommand_selectteam() can check joinAllowed() before calling SetPlayerTeam() without chicken/egg problem
2267 if (ShowTeamSelection(this)) return false; // only needed by callsites other than selectteam
2268 // queuePlayer called here so that only conditions above block queuing (g_maxplayers shouldn't)
2269 if (queuePlayer(this, team_index)) return false;
2270 if (!nJoinAllowed(this)) return false;
2271 }
2272 else
2273 {
2274 if (!nJoinAllowed(this)) return false;
2275 if (team_index == 0) // so ClientCommand_selectteam() can check joinAllowed() before calling SetPlayerTeam() without chicken/egg problem
2276 if (ShowTeamSelection(this)) return false; // only needed by callsites other than selectteam
2277 }
2278
2279 return true;
2280}
string autocvar_g_playban_list
Definition banning.qh:14
float ping
Definition main.qh:169
bool ShowTeamSelection(entity this)
Definition client.qc:2057
float autocvar_g_maxping
Definition client.qc:2230
bool queuePlayer(entity this, int team_index)
Definition client.qc:2182
int nJoinAllowed(entity this)
Determines how many player slots are free.
Definition client.qc:2144
bool PlayerInList(entity player, string list)
Definition client.qc:1047
const int MIN_SPEC_TIME
Definition client.qh:403
float jointime
Definition client.qh:66
#define INGAME(it)
Definition sv_rules.qh:24
bool QueueNeeded(entity ignore)
Definition teamplay.qc:1325
int Player_GetForcedTeamIndex(entity player)
Returns the index of the forced team of the given player.
Definition teamplay.qc:318
@ TEAM_FORCE_SPECTATOR
Force the player to spectator team.
Definition teamplay.qh:137
bool lockteams
Definition teamplay.qh:15

References autocvar_g_maxping, autocvar_g_playban_list, CS(), entity(), INGAME, IS_PLAYER, jointime, lockteams, MIN_SPEC_TIME, nJoinAllowed(), ping, Player_GetForcedTeamIndex(), PlayerInList(), QueueNeeded(), queuePlayer(), Send_Notification(), ShowTeamSelection(), TEAM_FORCE_SPECTATOR, teamplay, time, and wants_join.

Referenced by ClientCommand_join(), ClientCommand_selectteam(), ObserverOrSpectatorThink(), and PlayerPreThink().

◆ nJoinAllowed()

int nJoinAllowed ( entity this)

Determines how many player slots are free.

This depends on cvar g_maxplayers and other limits that apply to all clients which aren't specifically excepted.

Returns
int number of free slots for players, 0 if none

Definition at line 2144 of file client.qc.

2145{
2146 if(!this)
2147 // this is called that way when checking if anyone may be able to join (to build qcstatus)
2148 // so report 0 free slots if restricted
2149 {
2150 if(autocvar_g_forced_team_otherwise == "spectate"
2151 || autocvar_g_forced_team_otherwise == "spectator"
2152 || (teamplay && lockteams))
2153 return 0;
2154 }
2155
2156 int totalClients = 0;
2157 int currentlyPlaying = 0;
2158 FOREACH_CLIENT(it != this,
2159 {
2160 ++totalClients;
2161 if(IS_PLAYER(it) || INGAME(it))
2162 ++currentlyPlaying;
2163 });
2164
2165 int player_limit = GetPlayerLimit();
2166
2167 int free_slots = max(0, (player_limit ? player_limit : maxclients) - currentlyPlaying);
2168 if (this || maxclients - totalClients) // don't add bot slots in the getstatus case if nobody can connect
2169 free_slots += bots_would_leave;
2170 if (!this) // getstatus case
2171 free_slots = min(free_slots, maxclients - totalClients);
2172
2173 if(this && !free_slots)
2174 Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_JOIN_PREVENT, player_limit);
2175
2176 return free_slots;
2177}
int bots_would_leave
how many bots would leave so humans can replace them
Definition api.qh:101
float maxclients
float min(float f,...)
string autocvar_g_forced_team_otherwise
Definition teamplay.qh:13

References autocvar_g_forced_team_otherwise, bots_would_leave, entity(), FOREACH_CLIENT, GetPlayerLimit(), INGAME, IS_PLAYER, lockteams, max(), maxclients, min(), Send_Notification(), and teamplay.

Referenced by joinAllowed(), and WinningConditionHelper().

◆ play_countdown()

void play_countdown ( entity this,
float finished,
Sound samp )

Definition at line 1527 of file client.qc.

1528{
1529 TC(Sound, samp);
1530 float time_left = finished - time;
1531 if(IS_REAL_CLIENT(this) && time_left < 6 && floor(time_left - frametime) != floor(time_left))
1532 sound(this, CH_INFO, samp, VOL_BASE, ATTEN_NORM);
1533}
float frametime
#define TC(T, sym)
Definition _all.inc:82
const float VOL_BASE
Definition sound.qh:36
const int CH_INFO
Definition sound.qh:6
const float ATTEN_NORM
Definition sound.qh:30
#define sound(e, c, s, v, a)
Definition sound.qh:52

References ATTEN_NORM, CH_INFO, entity(), floor(), frametime, IS_REAL_CLIENT, sound, TC, time, and VOL_BASE.

Referenced by player_powerups().

◆ player_powerups_remove_all()

void player_powerups_remove_all ( entity this,
bool allow_poweroff_sound )

Definition at line 1536 of file client.qc.

1537{
1539 {
1540 // don't play the poweroff sound when the game restarts or the player disconnects
1541 if (allow_poweroff_sound && time > game_starttime + 1 && IS_CLIENT(this)
1543 sound(this, CH_INFO, SND_POWEROFF, VOL_BASE, ATTEN_NORM);
1544
1546 stopsound(this, CH_TRIGGER_SINGLE); // get rid of the pickup sound
1547
1549 }
1550}
const int IT_SUPERWEAPON
Definition item.qh:41
const int IT_UNLIMITED_AMMO
Definition item.qh:23
const int IT_UNLIMITED_SUPERWEAPONS
Definition item.qh:24
int items
Definition player.qh:226
#define IS_CLIENT(s)
Definition player.qh:241
const int CH_TRIGGER_SINGLE
Definition sound.qh:13
void stopsound(entity e, int chan)
Definition all.qc:109
int start_items
Definition world.qh:83

References ATTEN_NORM, CH_INFO, CH_TRIGGER_SINGLE, entity(), game_starttime, IS_CLIENT, IT_SUPERWEAPON, IT_UNLIMITED_AMMO, IT_UNLIMITED_SUPERWEAPONS, items, sound, start_items, stopsound(), time, and VOL_BASE.

Referenced by ClientDisconnect(), player_powerups(), PutObserverInServer(), and reset_map().

◆ PlayerFrame()

void PlayerFrame ( entity this)

Definition at line 2817 of file client.qc.

2818{
2819 Physics_UpdateStats(this);
2820
2821 // Don't accumulate alivetime whilst afk as xonstat skill ratings are based on score per second.
2822 // Time accumulated so far (including the 30s) is retained in the event of a move to spec, disconnect, etc.
2823 if (this.alivetime_start && time - CS(this).parm_idlesince >= 30)
2824 this.alivetime_start += frametime;
2825
2826// formerly PreThink code
2827
2828 if (this.score_frame_dmg)
2829 {
2831 GameRules_scoring_add(this, DMG, this.score_frame_dmg);
2832 this.score_frame_dmg = 0;
2833 }
2834 if (this.score_frame_dmgtaken)
2835 {
2837 GameRules_scoring_add(this, DMGTAKEN, this.score_frame_dmgtaken);
2838 this.score_frame_dmgtaken = 0;
2839 }
2840
2841 STAT(GUNALIGN, this) = CS_CVAR(this).cvar_cl_gunalign; // TODO
2842 STAT(MOVEVARS_CL_TRACK_CANJUMP, this) = CS_CVAR(this).cvar_cl_movement_track_canjump;
2843
2844 // physics frames: update anticheat stuff
2845 anticheat_prethink(this);
2846
2847 // Check if spectating is allowed
2848 // cvar hook/callback TODO: make this event-driven
2850 && (IS_SPEC(this) || IS_OBSERVER(this)) && !INGAME(this))
2851 {
2852 float cutoff = CS(this).spectatortime + autocvar_g_maxplayers_spectator_blocktime;
2853 if (time > cutoff + MIN_SPEC_TIME * 0.5 // sv_spectate was disabled recently (or the server was stalled far too long)
2854 || CS(this).autojoin_checked == 0) // or too soon to have tried to autojoin
2855 {
2856 CS(this).spectatortime = time; // reset the grace period
2857 if (CS(this).autojoin_checked) // only notify when sv_spectate was disabled recently, to prevent spam
2858 Send_Notification(NOTIF_ONE_ONLY, this, MSG_MULTI, SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime);
2859 }
2860 else if (time > cutoff)
2861 if (dropclient_schedule(this))
2862 Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_QUIT_KICK_SPECTATING);
2863 }
2864
2865 // Check for nameless players
2866 if (this.netname == "" || this.netname != CS(this).netname_previous)
2867 {
2868 bool assume_unchanged = (CS(this).netname_previous == "");
2869 if (autocvar_sv_name_maxlength > 0 && strlennocol(this.netname) > autocvar_sv_name_maxlength)
2870 {
2871 int new_length = textLengthUpToLength(this.netname, autocvar_sv_name_maxlength, strlennocol);
2872 this.netname = strzone(strcat(substring(this.netname, 0, new_length), "^7"));
2873 sprint(this, sprintf("Warning: your name is longer than %d characters, it has been truncated.\n", autocvar_sv_name_maxlength));
2874 assume_unchanged = false;
2875 // stuffcmd(this, strcat("name ", this.netname, "\n")); // maybe?
2876 }
2877 if (isInvisibleString(this.netname))
2878 {
2879 this.netname = strzone(sprintf("Player#%d", this.playerid));
2880 sprint(this, "Warning: invisible names are not allowed.\n");
2881 assume_unchanged = false;
2882 // stuffcmd(this, strcat("name ", this.netname, "\n")); // maybe?
2883 }
2884 if (!assume_unchanged && autocvar_sv_eventlog)
2885 GameLogEcho(strcat(":name:", ftos(this.playerid), ":", playername(this.netname, this.team, false)));
2886 strcpy(CS(this).netname_previous, this.netname);
2887 }
2888
2889 // version nagging
2890 if (CS(this).version_nagtime && CS_CVAR(this).cvar_g_xonoticversion && time > CS(this).version_nagtime)
2891 {
2892 CS(this).version_nagtime = 0;
2893 if (strstrofs(CS_CVAR(this).cvar_g_xonoticversion, "git", 0) >= 0 || strstrofs(CS_CVAR(this).cvar_g_xonoticversion, "autobuild", 0) >= 0)
2894 {
2895 // git client
2896 }
2897 else if (strstrofs(autocvar_g_xonoticversion, "git", 0) >= 0 || strstrofs(autocvar_g_xonoticversion, "autobuild", 0) >= 0)
2898 {
2899 // git server
2900 Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_VERSION_BETA, autocvar_g_xonoticversion, CS_CVAR(this).cvar_g_xonoticversion);
2901 }
2902 else
2903 {
2904 int r = vercmp(CS_CVAR(this).cvar_g_xonoticversion, autocvar_g_xonoticversion);
2905 if (r < 0) // old client
2906 Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_VERSION_OUTDATED, autocvar_g_xonoticversion, CS_CVAR(this).cvar_g_xonoticversion);
2907 else if (r > 0) // old server
2908 Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_VERSION_OLD, autocvar_g_xonoticversion, CS_CVAR(this).cvar_g_xonoticversion);
2909 }
2910 }
2911
2912 if (this.ignore_list_send_time > 0 && time > this.ignore_list_send_time)
2913 ignore_list_send(this);
2914
2915 // GOD MODE info
2916 if (!(this.flags & FL_GODMODE) && this.max_armorvalue)
2917 {
2918 Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_GODMODE_OFF, this.max_armorvalue);
2919 this.max_armorvalue = 0;
2920 }
2921
2922 // Vehicles
2923 if(autocvar_g_vehicles_enter && (time > this.last_vehiclecheck) && !game_stopped && !this.vehicle)
2924 if(IS_PLAYER(this) && !STAT(FROZEN, this) && !StatusEffects_active(STATUSEFFECT_Frozen, this) && !IS_DEAD(this) && !IS_INDEPENDENT_PLAYER(this))
2925 {
2927 {
2928 if(!it.owner)
2929 {
2930 if(!it.team || SAME_TEAM(this, it))
2931 Send_Notification(NOTIF_ONE, this, MSG_CENTER, CENTER_VEHICLE_ENTER);
2932 else if(autocvar_g_vehicles_steal)
2933 Send_Notification(NOTIF_ONE, this, MSG_CENTER, CENTER_VEHICLE_ENTER_STEAL);
2934 }
2935 else if((it.vehicle_flags & VHF_MULTISLOT) && SAME_TEAM(it.owner, this))
2936 {
2937 Send_Notification(NOTIF_ONE, this, MSG_CENTER, CENTER_VEHICLE_ENTER_GUNNER);
2938 }
2939 });
2940
2941 this.last_vehiclecheck = time + 1;
2942 }
2943
2944
2945
2946// formerly PostThink code
2948 if (IS_REAL_CLIENT(this))
2950 if (!intermission_running) // NextLevel() kills all centerprints after setting this true
2951 {
2952 int totalClients = 0;
2954 {
2955 // maxidle disabled in local matches by not counting clients (totalClients 0)
2957 {
2959 {
2960 ++totalClients;
2961 });
2962 if (maxclients - totalClients > autocvar_sv_maxidle_slots)
2963 totalClients = 0;
2964 }
2965 }
2966 else if ((IS_PLAYER(this) || this.wants_join) && autocvar_sv_maxidle_playertospectator > 0)
2967 {
2969 {
2970 ++totalClients;
2971 });
2972 }
2973
2974 if (totalClients < autocvar_sv_maxidle_minplayers)
2975 {
2976 // idle kick disabled
2977 CS(this).parm_idlesince = time;
2978 }
2979 else if (time - CS(this).parm_idlesince < 1) // instead of (time == this.parm_idlesince) to support sv_maxidle <= 10
2980 {
2981 if (CS(this).idlekick_lasttimeleft)
2982 {
2983 CS(this).idlekick_lasttimeleft = 0;
2984 Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_IDLING);
2985 }
2986 }
2987 else
2988 {
2989 float maxidle_time = autocvar_sv_maxidle;
2990 if ((IS_PLAYER(this) || this.wants_join)
2993 float timeleft = ceil(maxidle_time - (time - CS(this).parm_idlesince));
2994 float countdown_time = max(min(10, maxidle_time - 1), ceil(maxidle_time * 0.33)); // - 1 to support maxidle_time <= 10
2995 if (timeleft == countdown_time && !CS(this).idlekick_lasttimeleft)
2996 {
2998 {
2999 if (!this.wants_join) // no countdown centreprint when getting kicked off the join queue
3000 Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_MOVETOSPEC_IDLING, timeleft);
3001 }
3002 else
3003 Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_DISCONNECT_IDLING, timeleft);
3004 }
3005 if (timeleft <= 0)
3006 {
3007 if ((IS_PLAYER(this) || this.wants_join)
3009 {
3010 if (this.wants_join)
3011 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_MOVETOSPEC_IDLING_QUEUE, this.netname, maxidle_time);
3012 else
3013 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_MOVETOSPEC_IDLING, this.netname, maxidle_time);
3014 PutObserverInServer(this, true, true);
3015 // Can't do this in PutObserverInServer() or SetPlayerTeam() cos it causes
3016 // mouse2 (change spectate mode) to kick the player off the join queue.
3017 this.wants_join = 0;
3018 this.team_selected = 0;
3019 // when the player is kicked off the server, these are called in ClientDisconnect()
3023 }
3024 else
3025 {
3026 if (dropclient_schedule(this))
3027 Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_KICK_IDLING, this.netname, maxidle_time);
3028 }
3029 return;
3030 }
3031 else if (timeleft <= countdown_time
3032 && !this.wants_join) // no countdown bangs when getting kicked off the join queue
3033 {
3034 if (timeleft != CS(this).idlekick_lasttimeleft)
3035 play2(this, SND(TALK2));
3036 CS(this).idlekick_lasttimeleft = timeleft;
3037 }
3038 }
3039 }
3040
3041 CheatFrame(this);
3042
3043 if (game_stopped)
3044 {
3045 this.solid = SOLID_NOT;
3046 this.takedamage = DAMAGE_NO;
3048 CS(this).teamkill_complain = 0;
3049 CS(this).teamkill_soundtime = 0;
3050 CS(this).teamkill_soundsource = NULL;
3051 }
3052
3054 float hp = healtharmor_maxdamage(GetResource(this, RES_HEALTH), GetResource(this, RES_ARMOR), autocvar_g_balance_armor_blockpercent, DEATH_WEAPON.m_id).x;
3056 }
3057}
void anticheat_prethink(entity this)
Definition anticheat.qc:172
float CheatFrame(entity this)
Definition cheats.qc:707
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
void ignore_list_send(entity this)
Definition cmd.qc:168
float ignore_list_send_time
Definition cmd.qh:9
void Physics_UpdateStats(entity this)
Definition player.qc:44
#define IS_DEAD(s)
Definition player.qh:244
string playername(string thename, int teamid, bool team_colorize)
Definition util.qc:2178
vector healtharmor_maxdamage(float h, float a, float armorblock, int deathtype)
Definition util.qc:1389
float textLengthUpToLength(string theText, int maxLength, textLengthUpToLength_lenFunction_t w)
Definition util.qc:918
const int FL_GODMODE
Definition constants.qh:75
float flags
const float SOLID_NOT
vector origin
float autocvar_g_balance_armor_blockpercent
Definition damage.qh:21
solid
Definition ent_cs.qc:165
void GameLogEcho(string s)
Definition gamelog.qc:15
bool autocvar_sv_eventlog
Definition gamelog.qh:3
float Handicap_GetTotalHandicap(entity player, bool receiving)
Returns the total handicap of the player.
Definition handicap.qc:96
float handicap_avg_taken_sum
Definition handicap.qh:72
float handicap_avg_given_sum
Definition handicap.qh:71
#define FOREACH_ENTITY_RADIUS(org, dist, cond, body)
Definition iter.qh:160
void sprint(float clientnum, string text,...)
string ftos(float f)
string strzone(string s)
void set_movetype(entity this, int mt)
Definition movetypes.qc:4
const int MOVETYPE_NONE
Definition movetypes.qh:129
s1 s2 s1 s2 FLAG s1 s2 FLAG spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 CPID_IDLING
Definition all.inc:690
void PutObserverInServer(entity this, bool is_forced, bool use_spawnpoint)
putting a client as observer in the server
Definition client.qc:261
float last_vehiclecheck
Definition client.qc:2647
float autocvar_sv_maxidle
Definition client.qh:37
string autocvar_g_xonoticversion
Definition client.qh:46
int playerid
Definition client.qh:82
bool autocvar_sv_spectate
Definition client.qh:57
int autocvar_sv_maxidle_minplayers
Definition client.qh:38
float autocvar_sv_maxidle_playertospectator
Definition client.qh:39
float autocvar_g_maxplayers_spectator_blocktime
Definition client.qh:45
bool autocvar_sv_maxidle_slots_countbots
Definition client.qh:42
int autocvar_sv_name_maxlength
Definition client.qh:53
int autocvar_sv_maxidle_slots
Definition client.qh:41
bool autocvar_sv_maxidle_alsokickspectators
Definition client.qh:40
float alivetime_start
Definition client.qh:68
float max_armorvalue
Definition items.qh:26
bool dropclient_schedule(entity this)
Schedules dropclient for a player and returns true; if dropclient is already scheduled (for that play...
Definition main.qc:44
float score_frame_dmgtaken
Definition player.qh:26
float score_frame_dmg
Definition player.qh:25
void play2(entity e, string filename)
Definition all.qc:116
#define SND(id)
Definition all.qh:35
#define CS_CVAR(this)
Definition state.qh:51
bool StatusEffects_active(StatusEffect this, entity actor)
ERASEABLE int vercmp(string v1, string v2)
Definition string.qh:556
#define strcpy(this, s)
Definition string.qh:52
ERASEABLE bool isInvisibleString(string s)
Definition string.qh:387
const int DAMAGE_NO
Definition subs.qh:79
float takedamage
Definition subs.qh:78
#define GameRules_scoring_add(client, fld, value)
Definition sv_rules.qh:85
entity vehicle
float autocvar_g_vehicles_enter_radius
bool TeamBalance_QueuedPlayersTagIn(entity ignore)
Joins queued player(s) to team(s) with a shortage, this should be more robust than only replacing the...
Definition teamplay.qc:775
void TeamBalance_RemoveExcessPlayers(entity ignore)
Definition teamplay.qc:712
bool autocvar_g_balance_teams_remove
Definition teamplay.qh:10
#define SAME_TEAM(a, b)
Definition teams.qh:241
#define IS_OBSERVER(v)
Definition utils.qh:11
#define IS_VEHICLE(v)
Definition utils.qh:24
const int VHF_MULTISLOT
Vehicle has multiple player slots.
Definition vehicle.qh:106
void WaypointSprite_UpdateHealth(entity e, float f)
entity waypointsprite_attachedforcarrier
bool autocvar_sv_dedicated
Definition world.qh:41

References alivetime_start, anticheat_prethink(), autocvar_g_maxplayers_spectator_blocktime, autocvar_g_vehicles_enter_radius, autocvar_g_xonoticversion, autocvar_sv_eventlog, autocvar_sv_name_maxlength, autocvar_sv_spectate, CS(), CS_CVAR, DAMAGE_NO, dropclient_schedule(), entity(), FL_GODMODE, flags, FOREACH_ENTITY_RADIUS, frametime, ftos(), game_stopped, GameLogEcho(), GameRules_scoring_add, handicap_avg_given_sum, handicap_avg_taken_sum, Handicap_GetTotalHandicap(), ignore_list_send(), ignore_list_send_time, INGAME, IS_DEAD, IS_INDEPENDENT_PLAYER, IS_OBSERVER, IS_PLAYER, IS_REAL_CLIENT, IS_SPEC, IS_VEHICLE, isInvisibleString(), last_vehiclecheck, max_armorvalue, MIN_SPEC_TIME, netname, origin, Physics_UpdateStats(), playerid, playername(), SAME_TEAM, score_frame_dmg, score_frame_dmgtaken, Send_Notification(), sprint(), STAT, StatusEffects_active(), strcat(), strcpy, strstrofs, strzone(), substring(), team, textLengthUpToLength(), time, vehicle, vercmp(), and VHF_MULTISLOT.

Referenced by StartFrame().

◆ PlayerInIDList()

bool PlayerInIDList ( entity p,
string idlist )

Definition at line 1038 of file client.qc.

1039{
1040 // NOTE: we do NOT check crypto_idfp_signed here, an unsigned ID is fine too for this
1041 if(!p.crypto_idfp)
1042 return false;
1043
1044 return findinlist_abbrev(p.crypto_idfp, idlist);
1045}
bool findinlist_abbrev(string tofind, string list)
Definition client.qc:1015

References entity(), and findinlist_abbrev().

Referenced by BanCommand_mute(), BanCommand_playban(), BanCommand_voteban(), MUTATOR_HOOKFUNCTION(), and PlayerInList().

◆ PlayerInIPList()

bool PlayerInIPList ( entity p,
string iplist )

Definition at line 1029 of file client.qc.

1030{
1031 // some safety checks (never allow local?)
1032 if(p.netaddress == "local" || p.netaddress == "" || !IS_REAL_CLIENT(p))
1033 return false;
1034
1035 return findinlist_abbrev(p.netaddress, iplist);
1036}

References entity(), findinlist_abbrev(), and IS_REAL_CLIENT.

Referenced by BanCommand_mute(), BanCommand_playban(), BanCommand_voteban(), MUTATOR_HOOKFUNCTION(), and PlayerInList().

◆ PlayerInList()

bool PlayerInList ( entity player,
string list )

Definition at line 1047 of file client.qc.

1048{
1049 if (list == "")
1050 return false;
1051 return boolean(PlayerInIDList(player, list) || PlayerInIPList(player, list));
1052}
#define boolean(value)
Definition bool.qh:9
bool PlayerInIDList(entity p, string idlist)
Definition client.qc:1038
bool PlayerInIPList(entity p, string iplist)
Definition client.qc:1029

References boolean, entity(), PlayerInIDList(), and PlayerInIPList().

Referenced by ClientCommand_minigame(), ClientConnect(), ignore_playerindb(), invite_minigame(), joinAllowed(), MUTATOR_HOOKFUNCTION(), Player_DetermineForcedTeam(), VoteCommand_abstain(), VoteCommand_call(), VoteCommand_no(), and VoteCommand_yes().

◆ PlayerUseKey()

void PlayerUseKey ( entity this)

Definition at line 2585 of file client.qc.

2586{
2587 if (!IS_PLAYER(this))
2588 return;
2589
2590 if(this.vehicle)
2591 {
2592 if(!game_stopped)
2593 {
2595 return;
2596 }
2597 }
2598 else if(autocvar_g_vehicles_enter)
2599 {
2600 if(!game_stopped && !STAT(FROZEN, this) && !StatusEffects_active(STATUSEFFECT_Frozen, this) && !IS_DEAD(this) && !IS_INDEPENDENT_PLAYER(this))
2601 {
2602 entity head, closest_target = NULL;
2604
2605 while(head) // find the closest acceptable target to enter
2606 {
2607 if(IS_VEHICLE(head) && !IS_DEAD(head) && head.takedamage != DAMAGE_NO)
2608 if(!head.owner || ((head.vehicle_flags & VHF_MULTISLOT) && SAME_TEAM(head.owner, this)))
2609 {
2610 if(closest_target)
2611 {
2612 if(vlen2(this.origin - head.origin) < vlen2(this.origin - closest_target.origin))
2613 closest_target = head;
2614 }
2615 else
2616 closest_target = head;
2617 }
2618
2619 head = head.chain;
2620 }
2621
2622 if(closest_target)
2623 {
2624 vehicles_enter(this, closest_target);
2625 return;
2626 }
2627 }
2628 }
2629
2630 // a use key was pressed; call handlers
2632}
entity WarpZone_FindRadius(vector org, float rad, bool needlineofsight)
Definition common.qc:684
void PlayerUseKey(entity this)
Definition client.qc:2585
void vehicles_enter(entity pl, entity veh)
void vehicles_exit(entity vehic, bool eject)
const int VHEF_NORMAL
User pressed exit key.
#define vlen2(v)
Definition vector.qh:4

References autocvar_g_vehicles_enter_radius, DAMAGE_NO, entity(), game_stopped, IS_DEAD, IS_INDEPENDENT_PLAYER, IS_PLAYER, IS_VEHICLE, MUTATOR_CALLHOOK, NULL, origin, PlayerUseKey(), SAME_TEAM, STAT, StatusEffects_active(), vehicle, vehicles_enter(), vehicles_exit(), VHEF_NORMAL, VHF_MULTISLOT, vlen2, and WarpZone_FindRadius().

Referenced by IMPULSE(), MUTATOR_HOOKABLE(), MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), MUTATOR_HOOKFUNCTION(), PlayerPreThink(), and PlayerUseKey().

◆ PutObserverInServer()

void PutObserverInServer ( entity this,
bool is_forced,
bool use_spawnpoint )

putting a client as observer in the server

Definition at line 261 of file client.qc.

262{
263 bool mutator_returnvalue = MUTATOR_CALLHOOK(MakePlayerObserver, this, is_forced);
264 bool recount_ready = false;
265 PlayerState_detach(this);
266
267 bool was_player = false;
268 if (IS_PLAYER(this))
269 {
270 if(GetResource(this, RES_HEALTH) >= 1)
271 {
272 // despawn effect
273 Send_Effect(EFFECT_SPAWN, this.origin, '0 0 0', 1);
274 }
275
276 // was a player, recount votes and ready status
277 if(IS_REAL_CLIENT(this))
278 {
279 if (vote_called) { VoteCount(false); }
280 this.ready = false;
281 if (warmup_stage || game_starttime > time) /* warmup OR countdown */ recount_ready = true;
282 }
284 was_player = true;
285 }
286
287 if (use_spawnpoint)
288 {
289 // first try to find a random "nice" location to view from
290 entity spot = SelectObservePoint(this);
291 bool is_observepoint = (spot != NULL);
292 if(!spot) // otherwise just use the player spawn points
293 spot = SelectSpawnPoint(this, true);
294 if (!spot) LOG_FATAL("No spawnpoints for observers?!?");
295
296 this.angles = vec2(spot.angles);
297 // offset it so that the spectator spawns higher off the ground, looks better this way
298 setorigin(this, spot.origin + (is_observepoint ? '0 0 0' : autocvar_sv_player_viewoffset));
299 }
300 else // change origin to restore previous view origin
301 setorigin(this, this.origin + STAT(PL_VIEW_OFS, this) - STAT(PL_CROUCH_VIEW_OFS, this));
302 this.fixangle = true;
303
304 if (IS_REAL_CLIENT(this))
305 {
306 msg_entity = this;
308 WriteEntity(MSG_ONE, this);
309 }
310 // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY
311 // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS"
313 {
314 // needed for player sounds
315 this.model = "";
316 FixPlayermodel(this);
317 }
318 setmodel(this, MDL_Null);
319 setsize(this, STAT(PL_CROUCH_MIN, this), STAT(PL_CROUCH_MAX, this));
320 this.view_ofs = '0 0 0';
321
323 Portal_ClearAll(this);
324 SetSpectatee(this, NULL);
325
326 if (this.alivetime_start)
327 {
328 if (!warmup_stage)
330 this.alivetime_start = 0;
331 }
332
333 if (this.vehicle) vehicles_exit(this.vehicle, VHEF_RELEASE);
334
335 TRANSMUTE(Observer, this);
336
338 accuracy_resend(this);
339
341 Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_CHAT_NOSPECTATORS);
342
343 CS(this).spectatortime = time;
344 if (!autocvar_sv_spectate && CS(this).autojoin_checked) // unnecessary if autojoin succeeds, on failure it notifies
345 Send_Notification(NOTIF_ONE_ONLY, this, MSG_MULTI, SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime);
346
347 if(this.bot_attack)
349 this.bot_attack = false;
350 if(this.monster_attack)
352 this.monster_attack = false;
353 STAT(HUD, this) = HUD_NORMAL;
354 this.iscreature = false;
356 if(this.damagedbycontents)
358 this.damagedbycontents = false;
359 SetResourceExplicit(this, RES_HEALTH, FRAGS_SPECTATOR);
360 SetSpectatee_status(this, etof(this));
361 this.takedamage = DAMAGE_NO;
362 this.solid = SOLID_NOT;
363 set_movetype(this, MOVETYPE_FLY_WORLDONLY); // user preference is controlled by playerprethink
364 this.flags = FL_CLIENT | FL_NOTARGET;
365 this.effects = 0;
367 this.pauserotarmor_finished = 0;
369 this.pauseregen_finished = 0;
370 this.damageforcescale = 0;
371 this.death_time = 0;
372 this.respawn_flags = 0;
373 this.respawn_time = 0;
374 STAT(RESPAWN_TIME, this) = 0;
375 this.alpha = 0;
376 this.scale = 0;
377 this.fade_time = 0;
378 this.pain_finished = 0;
379 STAT(AIR_FINISHED, this) = 0;
380 //this.dphitcontentsmask = 0;
384 this.pushltime = 0;
385 this.istypefrag = 0;
386 setthink(this, func_null);
387 this.nextthink = 0;
388 this.deadflag = DEAD_NO;
389 UNSET_DUCKED(this);
390 this.draggable = drag_undraggable;
391
392 player_powerups_remove_all(this, was_player);
393 this.items = 0;
394 STAT(WEAPONS, this) = '0 0 0';
395 this.drawonlytoclient = this;
396
397 this.viewloc = NULL;
398
399 //this.spawnpoint_targ = NULL; // keep it so they can return to where they were?
400
401 this.weaponmodel = "";
402 for (int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
403 {
404 this.weaponentities[slot] = NULL;
405 }
407 CS(this).killcount = FRAGS_SPECTATOR;
408 this.velocity = '0 0 0';
409 this.avelocity = '0 0 0';
410 this.punchangle = '0 0 0';
411 this.punchvector = '0 0 0';
412 this.oldvelocity = this.velocity;
413 this.event_damage = func_null;
414 this.event_heal = func_null;
415
416 for(int slot = 0; slot < MAX_AXH; ++slot)
417 {
418 entity axh = this.(AuxiliaryXhair[slot]);
419 this.(AuxiliaryXhair[slot]) = NULL;
420
421 if(axh.owner == this && axh != NULL && !wasfreed(axh))
422 delete(axh);
423 }
424
425 if (mutator_returnvalue)
426 {
427 // mutator prevents resetting teams+score
428 }
429 else
430 {
431 SetPlayerTeam(this, -1, TEAM_CHANGE_SPECTATOR); // clears scores too in gametypes without teams
432 this.frags = FRAGS_SPECTATOR;
433 }
434
436
437 if (CS(this).just_joined)
438 CS(this).just_joined = false;
439
440 if (recount_ready)
441 ReadyCount(); // must be called after SetPlayerTeam() and TRANSMUTE(Observer
442}
void accuracy_resend(entity e)
force a resend of a player's accuracy stats
Definition accuracy.qc:80
float bot_attack
Definition api.qh:38
IntrusiveList g_bot_targets
Definition api.qh:149
void bot_relinkplayerlist()
Definition bot.qc:424
bool drag_undraggable(entity draggee, entity dragger)
Definition cheats.qc:900
vector punchangle
float pain_finished
bool SetResourceExplicit(entity e, Resource res_type, float amount)
Sets the resource amount of an entity without calling any hooks.
const int MAX_AXH
entity AuxiliaryXhair[MAX_AXH]
float alpha
Definition items.qc:13
bool ready
Definition main.qh:88
#define setmodel(this, m)
Definition model.qh:26
vector autocvar_sv_player_viewoffset
Definition player.qh:337
#define UNSET_DUCKED(s)
Definition player.qh:214
const int FL_CLIENT
Definition constants.qh:72
const int FL_NOTARGET
Definition constants.qh:76
const int HUD_NORMAL
Definition constants.qh:47
const int FRAGS_SPECTATOR
Definition constants.qh:4
float DPCONTENTS_SOLID
vector avelocity
vector velocity
float effects
float DPCONTENTS_PLAYERCLIP
float nextthink
float dphitcontentsmask
float death_time
float damagedbycontents
Definition damage.qh:45
IntrusiveList g_damagedbycontents
Definition damage.qh:143
float damageforcescale
entity drawonlytoclient
vector punchvector
void Send_Effect(entity eff, vector eff_loc, vector eff_vel, int eff_cnt)
Definition all.qc:120
ent angles
Definition ent_cs.qc:121
model
Definition ent_cs.qc:139
void entcs_update_players(entity player)
Definition ent_cs.qc:183
int frags
Definition ent_cs.qh:71
ERASEABLE void IL_REMOVE(IntrusiveList this, entity it)
Remove any element, anywhere in the list.
float pushltime
Definition jumppads.qh:21
bool istypefrag
Definition jumppads.qh:22
#define LOG_FATAL(...)
Definition log.qh:53
entity viewloc
Definition viewloc.qh:13
void WriteEntity(entity data, float dest, float desto)
#define etof(e)
Definition misc.qh:25
const int MOVETYPE_FLY_WORLDONLY
Definition movetypes.qh:143
var void func_null()
const string PLAYERSTATS_ALIVETIME
#define PlayerStats_GameReport_Event_Player(ent, eventid, val)
void Portal_ClearAll(entity own)
Definition portals.qc:586
entity msg_entity
Definition progsdefs.qc:63
vector view_ofs
Definition progsdefs.qc:151
float DEAD_NO
Definition progsdefs.qc:274
float fixangle
Definition progsdefs.qc:160
float deadflag
Definition progsdefs.qc:149
string weaponmodel
Definition progsdefs.qc:140
float scale
Definition projectile.qc:14
#define CHAT_NOSPECTATORS()
Definition chat.qh:30
void player_powerups_remove_all(entity this, bool allow_poweroff_sound)
Definition client.qc:1536
entity SelectObservePoint(entity this)
Definition client.qc:250
void SetSpectatee_status(entity this, int spectatee_num)
Definition client.qc:1899
void SetSpectatee(entity this, entity spectatee)
Definition client.qc:1934
int killcount
Definition client.qh:315
bool just_joined
Definition client.qh:76
int autocvar_g_balance_armor_start
Definition client.qh:11
bool autocvar_g_playerclip_collisions
Definition client.qh:18
float pauseregen_finished
Definition client.qh:337
float pauserothealth_finished
Definition client.qh:338
const int SVC_SETVIEW
Definition client.qh:334
float pauserotarmor_finished
Definition client.qh:339
void ReadyCount()
Definition vote.qc:553
void VoteCount(float first_count)
Definition vote.qc:220
int vote_called
Definition vote.qh:45
void RemoveGrapplingHooks(entity pl)
Definition hook.qc:30
vector oldvelocity
Definition main.qh:42
bool iscreature
Definition main.qh:46
entity SelectSpawnPoint(entity this, bool anypoint)
float fade_time
Definition common.qh:23
void PlayerState_detach(entity this)
Definition state.qc:22
bool monster_attack
indicates whether an entity can be attacked by monsters
IntrusiveList g_monster_targets
const int VHEF_RELEASE
Release ownership, client possibly allready dissconnected / went spec / changed team / used "kill" (n...
bool SetPlayerTeam(entity player, int team_index, int type)
Sets the team of the player.
Definition teamplay.qc:255
@ TEAM_CHANGE_SPECTATOR
Player is joining spectators. //TODO: Remove?
Definition teamplay.qh:116
float teleportable
const int TELEPORT_SIMPLE
#define vec2(...)
Definition vector.qh:90
void WaypointSprite_PlayerDead(entity this)
entity exteriorweaponentity
Definition all.qh:401
const int MAX_WEAPONSLOTS
Definition weapon.qh:16
entity weaponentities[MAX_WEAPONSLOTS]
Definition weapon.qh:17

References accuracy_resend(), alivetime_start, alpha, angles, autocvar_g_balance_armor_start, autocvar_g_debug_globalsounds, autocvar_g_maxplayers_spectator_blocktime, autocvar_g_playerclip_collisions, autocvar_sv_player_viewoffset, autocvar_sv_spectate, AuxiliaryXhair, avelocity, bot_attack, bot_relinkplayerlist(), CHAT_NOSPECTATORS, CS(), DAMAGE_NO, damagedbycontents, damageforcescale, DEAD_NO, deadflag, death_time, DPCONTENTS_PLAYERCLIP, DPCONTENTS_SOLID, dphitcontentsmask, drag_undraggable(), drawonlytoclient, effects, entcs_update_players(), entity(), etof, exteriorweaponentity, fade_time, fixangle, FixPlayermodel(), FL_CLIENT, FL_NOTARGET, flags, frags, FRAGS_SPECTATOR, func_null(), g_bot_targets, g_damagedbycontents, g_monster_targets, game_starttime, game_stopped, GetResource(), HUD_NORMAL, IL_REMOVE(), IS_PLAYER, IS_REAL_CLIENT, iscreature, istypefrag, items, just_joined, killcount, LOG_FATAL, max(), MAX_AXH, MAX_WEAPONSLOTS, model, monster_attack, MOVETYPE_FLY_WORLDONLY, msg_entity, MSG_ONE, MUTATOR_CALLHOOK, nextthink, NULL, oldvelocity, origin, pain_finished, pauseregen_finished, pauserotarmor_finished, pauserothealth_finished, player_powerups_remove_all(), PlayerState_detach(), PLAYERSTATS_ALIVETIME, PlayerStats_GameReport_Event_Player, Portal_ClearAll(), punchangle, punchvector, pushltime, ready, ReadyCount(), RemoveGrapplingHooks(), RES_ARMOR, respawn_flags, respawn_time, scale, SelectObservePoint(), SelectSpawnPoint(), Send_Effect(), Send_Notification(), set_movetype(), setmodel, SetPlayerTeam(), SetResourceExplicit(), SetSpectatee(), SetSpectatee_status(), setthink, solid, SOLID_NOT, STAT, SVC_SETVIEW, takedamage, TEAM_CHANGE_SPECTATOR, TELEPORT_SIMPLE, teleportable, time, TRANSMUTE, UNSET_DUCKED, vec2, vehicle, vehicles_exit(), velocity, VHEF_RELEASE, view_ofs, viewloc, vote_called, VoteCount(), warmup_stage, WaypointSprite_PlayerDead(), weaponentities, weaponmodel, WriteByte(), and WriteEntity().

Referenced by BanCommand_playban(), ClientKill_Now_TeamChange(), GameCommand_allspec(), GameCommand_moveplayer(), MatchEnd_RestoreSpectatorAndTeamStatus(), minigame_addplayer(), MUTATOR_HOOKFUNCTION(), ObserverOrSpectatorThink(), PutClientInServer(), Remove_Countdown(), SpectateSet(), and TeamBalance_RemoveExcessPlayers().

◆ RotRegen()

void RotRegen ( entity this,
entity current,
float limit_mod,
float regenstable,
float regenfactor,
float regenlinear,
float regenframetime,
float rotstable,
float rotfactor,
float rotlinear,
float rotframetime )

References entity().

◆ SendWelcomeMessage()

void SendWelcomeMessage ( entity this,
int msg_type )

Definition at line 1077 of file client.qc.

1078{
1079 if (boolean(autocvar_g_campaign))
1080 {
1081 WriteByte(msg_type, 1);
1082 WriteByte(msg_type, Campaign_GetLevelNum());
1083 return;
1084 }
1085
1086 int flags = 0;
1087 if (CS(this).version_mismatch)
1088 flags |= 2;
1089 if (CS(this).version < autocvar_gameversion)
1090 flags |= 4;
1092 if (MapInfo_Map_author != "")
1093 flags |= 8;
1094 WriteByte(msg_type, flags);
1095
1096 WriteString(msg_type, autocvar_hostname);
1098
1100 if (flags & 8)
1103
1105 WriteByte(msg_type, GetPlayerLimit());
1106
1107 MUTATOR_CALLHOOK(BuildMutatorsPrettyString, "");
1108 string modifications = M_ARGV(0, string);
1109
1110 if (!g_weaponarena && cvar("g_balance_blaster_weaponstartoverride") == 0)
1111 modifications = strcat(modifications, ", No start weapons");
1112 if(cvar("sv_gravity") < stof(cvar_defstring("sv_gravity")))
1113 modifications = strcat(modifications, ", Low gravity");
1114 if(g_weapon_stay && !g_cts)
1115 modifications = strcat(modifications, ", Weapons stay");
1117 modifications = strcat(modifications, ", Jetpack");
1118 modifications = substring(modifications, 2, strlen(modifications) - 2);
1119
1120 WriteString(msg_type, modifications);
1121
1123
1125 {
1128 }
1129
1130 WriteString(msg_type, cache_mutatormsg);
1131
1132 WriteString(msg_type, strreplace("\\n", "\n", autocvar_sv_motd));
1133}
string mi_shortname
Definition util.qh:126
#define g_cts
Definition cts.qh:36
int MapInfo_Get_ByName(string pFilename, float pAllowGenerate, Gametype pGametypeToSet)
Definition mapinfo.qc:1382
void MapInfo_ClearTemps()
Definition mapinfo.qc:1630
int map_minplayers
Definition mapinfo.qh:190
string MapInfo_Map_author
Definition mapinfo.qh:10
string MapInfo_Map_titlestring
Definition mapinfo.qh:8
const string cvar_defstring(string name)
int Campaign_GetLevelNum()
Definition campaign.qc:44
string autocvar_sv_motd
Definition client.qh:52
string autocvar_g_mutatormsg
Definition client.qh:35
string autocvar_hostname
Definition client.qh:50
float autocvar_gameversion
Definition client.qh:47
bool autocvar_g_jetpack
Definition world.qh:8
string cache_lastmutatormsg
Definition world.qh:70
float g_weaponarena
Definition world.qh:75
float g_weapon_stay
Definition world.qh:109
int autocvar_g_warmup
Definition world.qh:9
string g_weaponarena_list
Definition world.qh:78
string cache_mutatormsg
Definition world.qh:69

References autocvar_g_campaign, autocvar_g_jetpack, autocvar_g_mutatormsg, autocvar_g_warmup, autocvar_g_xonoticversion, autocvar_gameversion, autocvar_hostname, autocvar_sv_motd, cache_lastmutatormsg, cache_mutatormsg, Campaign_GetLevelNum(), CS(), cvar(), cvar_defstring(), entity(), flags, g_cts, g_weapon_stay, g_weaponarena, g_weaponarena_list, GetPlayerLimit(), M_ARGV, map_minplayers, MapInfo_ClearTemps(), MapInfo_Get_ByName(), MapInfo_Map_author, MapInfo_Map_titlestring, mi_shortname, MUTATOR_CALLHOOK, NULL, stof(), strcat(), strcpy, strlen, substring(), WriteByte(), and WriteString().

Referenced by ScoreInfo_SendEntity().

◆ SetSpectatee()

void SetSpectatee ( entity this,
entity spectatee )

Definition at line 1934 of file client.qc.

1935{
1936 if(IS_BOT_CLIENT(this))
1937 return; // bots abuse .enemy, this code is useless to them
1938
1939 entity old_spectatee = this.enemy;
1940
1941 this.enemy = spectatee;
1942
1943 // WEAPONTODO
1944 // these are required to fix the spectator bug with arc
1945 if(old_spectatee)
1946 {
1947 for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
1948 {
1949 .entity weaponentity = weaponentities[slot];
1950 if(old_spectatee.(weaponentity).arc_beam)
1951 old_spectatee.(weaponentity).arc_beam.SendFlags |= ARC_SF_UPDATE;
1952 }
1953 }
1954 if(spectatee)
1955 {
1956 for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
1957 {
1958 .entity weaponentity = weaponentities[slot];
1959 if(spectatee.(weaponentity).arc_beam)
1960 spectatee.(weaponentity).arc_beam.SendFlags |= ARC_SF_UPDATE;
1961 }
1962 }
1963
1964 if (spectatee)
1965 SetSpectatee_status(this, etof(spectatee));
1966
1967 // needed to update spectator list
1968 if(old_spectatee)
1969 ClientData_Touch(old_spectatee, true);
1970}
const int ARC_SF_UPDATE
Definition arc.qh:124
entity arc_beam
Definition arc.qh:132
void ClientData_Touch(entity e, bool to_spectators_too)
Definition client.qc:185
entity enemy
Definition sv_ctf.qh:153
#define IS_BOT_CLIENT(v)
want: (IS_CLIENT(v) && !IS_REAL_CLIENT(v))
Definition utils.qh:15

References arc_beam, ARC_SF_UPDATE, ClientData_Touch(), enemy, entity(), etof, IS_BOT_CLIENT, MAX_WEAPONSLOTS, SetSpectatee_status(), and weaponentities.

Referenced by ClientDisconnect(), PutClientInServer(), PutObserverInServer(), Spectate(), SpectateNext(), SpectatePrev(), and SpectateUpdate().

◆ SetSpectatee_status()

void SetSpectatee_status ( entity this,
int spectatee_num )

Definition at line 1899 of file client.qc.

1900{
1901 int oldspectatee_status = CS(this).spectatee_status;
1902 CS(this).spectatee_status = spectatee_num;
1903
1904 if (CS(this).spectatee_status != oldspectatee_status)
1905 {
1906 if (STAT(PRESSED_KEYS, this))
1907 {
1908 CS(this).pressedkeys = 0;
1909 STAT(PRESSED_KEYS, this) = 0;
1910 }
1911
1912 ClientData_Touch(this, true);
1913
1914 // init or clear race data
1915 if ((g_race || g_cts) && g_race_qualifying && IS_REAL_CLIENT(this))
1916 {
1917 msg_entity = this;
1918
1919 if (this.enemy && this.enemy.race_laptime)
1920 {
1921 // init
1923 }
1924 else
1925 {
1926 // send reset to this spectator
1927 WriteHeader(MSG_ONE, TE_CSQC_RACE);
1929 }
1930 }
1931 }
1932}
int spectatee_status
the -1 disables HUD panels before CSQC receives necessary data
Definition main.qh:197
#define g_race
Definition race.qh:48
@ RACE_NET_CHECKPOINT_CLEAR
Definition net_linked.qh:15
void race_SendNextCheckpoint(entity e, float spec)
Definition race.qc:208
int g_race_qualifying
Definition race.qh:13

References ClientData_Touch(), CS(), enemy, entity(), g_cts, g_race, g_race_qualifying, IS_REAL_CLIENT, msg_entity, MSG_ONE, RACE_NET_CHECKPOINT_CLEAR, race_SendNextCheckpoint(), spectatee_status, STAT, WriteByte(), and WriteHeader.

Referenced by PutObserverInServer(), PutPlayerInServer(), and SetSpectatee().

◆ Spectate()

bool Spectate ( entity this,
entity pl )

Definition at line 1972 of file client.qc.

1973{
1974 if(MUTATOR_CALLHOOK(SpectateSet, this, pl))
1975 return false;
1976 pl = M_ARGV(1, entity);
1977
1978 SetSpectatee(this, pl);
1979 return SpectateSet(this);
1980}
bool SpectateSet(entity this)
Definition client.qc:1880

References entity(), M_ARGV, MUTATOR_CALLHOOK, SetSpectatee(), and SpectateSet().

Referenced by ClientCommand_spectate(), and superspec_Spectate().

◆ STATIC_INIT()

STATIC_INIT ( client_lists )

Definition at line 372 of file client.qh.

373{
376}
#define IL_NEW()
IntrusiveList g_observepoints
Definition client.qh:371
IntrusiveList g_initforplayer
Definition client.qh:370

References g_initforplayer, g_observepoints, and IL_NEW.

◆ void()

void ( entity this,
entity player )

References entity().

Variable Documentation

◆ alivetime_start

float alivetime_start

Definition at line 68 of file client.qh.

Referenced by PlayerDamage(), PlayerFrame(), PutObserverInServer(), and PutPlayerInServer().

◆ autocvar__independent_players

int autocvar__independent_players

Definition at line 309 of file client.qh.

◆ autocvar__notarget

bool autocvar__notarget

Definition at line 9 of file client.qh.

Referenced by PutPlayerInServer().

◆ autocvar_g_balance_armor_start

int autocvar_g_balance_armor_start

Definition at line 11 of file client.qh.

Referenced by PutObserverInServer().

◆ autocvar_g_balance_pause_armor_rot_spawn

float autocvar_g_balance_pause_armor_rot_spawn

Definition at line 12 of file client.qh.

Referenced by PutPlayerInServer().

◆ autocvar_g_balance_pause_fuel_rot_spawn

float autocvar_g_balance_pause_fuel_rot_spawn

Definition at line 13 of file client.qh.

Referenced by PutPlayerInServer().

◆ autocvar_g_balance_pause_health_regen_spawn

float autocvar_g_balance_pause_health_regen_spawn

Definition at line 14 of file client.qh.

Referenced by PutPlayerInServer().

◆ autocvar_g_balance_pause_health_rot_spawn

float autocvar_g_balance_pause_health_rot_spawn

Definition at line 15 of file client.qh.

Referenced by PutPlayerInServer().

◆ autocvar_g_botclip_collisions

bool autocvar_g_botclip_collisions

Definition at line 16 of file client.qh.

Referenced by PutPlayerInServer().

◆ autocvar_g_forced_respawn

bool autocvar_g_forced_respawn

Definition at line 43 of file client.qh.

Referenced by calculate_player_respawn_time().

◆ autocvar_g_fullbrightplayers

bool autocvar_g_fullbrightplayers

◆ autocvar_g_maxplayers

int autocvar_g_maxplayers

Definition at line 44 of file client.qh.

Referenced by GameplayMode_DelayedInit(), GetPlayerLimit(), and PlayerStats_GetGametype().

◆ autocvar_g_maxplayers_spectator_blocktime

float autocvar_g_maxplayers_spectator_blocktime

Definition at line 45 of file client.qh.

Referenced by ClientKill_Now_TeamChange(), PlayerFrame(), and PutObserverInServer().

◆ autocvar_g_mutatormsg

string autocvar_g_mutatormsg

Definition at line 35 of file client.qh.

Referenced by SendWelcomeMessage().

◆ autocvar_g_nodepthtestplayers

bool autocvar_g_nodepthtestplayers

◆ autocvar_g_player_alpha

float autocvar_g_player_alpha

Definition at line 19 of file client.qh.

Referenced by SetDefaultAlpha().

◆ autocvar_g_player_brightness

float autocvar_g_player_brightness

Definition at line 20 of file client.qh.

Referenced by PutPlayerInServer().

◆ autocvar_g_player_damageforcescale

float autocvar_g_player_damageforcescale = 2

Definition at line 21 of file client.qh.

Referenced by PutPlayerInServer().

◆ autocvar_g_playerclip_collisions

bool autocvar_g_playerclip_collisions

Definition at line 18 of file client.qh.

Referenced by PutObserverInServer(), PutPlayerInServer(), and vehicle_initialize().

◆ autocvar_g_respawn_delay_forced

bool autocvar_g_respawn_delay_forced

Definition at line 27 of file client.qh.

◆ autocvar_g_respawn_delay_large

float autocvar_g_respawn_delay_large

Definition at line 24 of file client.qh.

◆ autocvar_g_respawn_delay_large_count

int autocvar_g_respawn_delay_large_count

Definition at line 25 of file client.qh.

◆ autocvar_g_respawn_delay_max

float autocvar_g_respawn_delay_max

Definition at line 26 of file client.qh.

◆ autocvar_g_respawn_delay_small

float autocvar_g_respawn_delay_small

Definition at line 22 of file client.qh.

◆ autocvar_g_respawn_delay_small_count

int autocvar_g_respawn_delay_small_count

Definition at line 23 of file client.qh.

◆ autocvar_g_respawn_ghosts

bool autocvar_g_respawn_ghosts

Definition at line 28 of file client.qh.

Referenced by respawn().

◆ autocvar_g_respawn_ghosts_alpha

float autocvar_g_respawn_ghosts_alpha = 1

Definition at line 29 of file client.qh.

Referenced by respawn().

◆ autocvar_g_respawn_ghosts_fadetime

float autocvar_g_respawn_ghosts_fadetime = 1.5

Definition at line 30 of file client.qh.

Referenced by respawn().

◆ autocvar_g_respawn_ghosts_speed

float autocvar_g_respawn_ghosts_speed

Definition at line 32 of file client.qh.

Referenced by respawn().

◆ autocvar_g_respawn_ghosts_time

float autocvar_g_respawn_ghosts_time = 4.5

Definition at line 31 of file client.qh.

Referenced by respawn().

◆ autocvar_g_respawn_waves

int autocvar_g_respawn_waves

Definition at line 33 of file client.qh.

◆ autocvar_g_xonoticversion

string autocvar_g_xonoticversion

Definition at line 46 of file client.qh.

Referenced by PlayerFrame(), SendWelcomeMessage(), and WinningConditionHelper().

◆ autocvar_gameversion

float autocvar_gameversion

Definition at line 47 of file client.qh.

Referenced by SendWelcomeMessage().

◆ autocvar_gameversion_max

float autocvar_gameversion_max

Definition at line 49 of file client.qh.

Referenced by ClientCommand_clientversion().

◆ autocvar_gameversion_min

float autocvar_gameversion_min

Definition at line 48 of file client.qh.

Referenced by ClientCommand_clientversion().

◆ autocvar_hostname

◆ autocvar_spawn_debug

int autocvar_spawn_debug

Definition at line 51 of file client.qh.

Referenced by PutPlayerInServer(), SelectSpawnPoint(), and StartItem().

◆ autocvar_sv_foginterval

float autocvar_sv_foginterval

Definition at line 36 of file client.qh.

Referenced by ClientConnect(), and ClientInit_misc().

◆ autocvar_sv_maxidle

float autocvar_sv_maxidle

Definition at line 37 of file client.qh.

Referenced by DecodeLevelParms().

◆ autocvar_sv_maxidle_alsokickspectators

bool autocvar_sv_maxidle_alsokickspectators

Definition at line 40 of file client.qh.

◆ autocvar_sv_maxidle_minplayers

int autocvar_sv_maxidle_minplayers = 2

Definition at line 38 of file client.qh.

◆ autocvar_sv_maxidle_playertospectator

float autocvar_sv_maxidle_playertospectator = 60

Definition at line 39 of file client.qh.

Referenced by SetPlayerTeam().

◆ autocvar_sv_maxidle_slots

int autocvar_sv_maxidle_slots

Definition at line 41 of file client.qh.

◆ autocvar_sv_maxidle_slots_countbots

bool autocvar_sv_maxidle_slots_countbots

Definition at line 42 of file client.qh.

◆ autocvar_sv_motd

string autocvar_sv_motd

Definition at line 52 of file client.qh.

Referenced by SendWelcomeMessage().

◆ autocvar_sv_name_maxlength

int autocvar_sv_name_maxlength = 64

Definition at line 53 of file client.qh.

Referenced by PlayerFrame().

◆ autocvar_sv_player_scale

float autocvar_sv_player_scale

Definition at line 59 of file client.qh.

Referenced by PutPlayerInServer().

◆ autocvar_sv_quickmenu_file

string autocvar_sv_quickmenu_file

Definition at line 54 of file client.qh.

Referenced by ClientConnect().

◆ autocvar_sv_servermodelsonly

bool autocvar_sv_servermodelsonly

Definition at line 55 of file client.qh.

Referenced by CheckPlayerModel().

◆ autocvar_sv_show_entnum

bool autocvar_sv_show_entnum

Definition at line 10 of file client.qh.

Referenced by ObserverOrSpectatorThink(), and PlayerThink().

◆ autocvar_sv_showspectators

bool autocvar_sv_showspectators

Definition at line 56 of file client.qh.

Referenced by ClientData_Send().

◆ autocvar_sv_spectate

◆ autocvar_sv_teamnagger

bool autocvar_sv_teamnagger

Definition at line 58 of file client.qh.

Referenced by ClientData_Send(), and ReadyCount().

◆ clientdata

entity clientdata

Definition at line 64 of file client.qh.

Referenced by ClientData_Attach().

◆ death_time

float death_time

Definition at line 69 of file client.qh.

◆ g_initforplayer

IntrusiveList g_initforplayer

Definition at line 370 of file client.qh.

Referenced by ClientConnect(), func_breakable_setup(), spawnfunc(), spawnfunc(), and STATIC_INIT().

◆ g_observepoints

IntrusiveList g_observepoints

Definition at line 371 of file client.qh.

Referenced by SelectObservePoint(), spawnfunc(), and STATIC_INIT().

◆ independent_players

bool independent_players

◆ jointime

◆ just_joined

bool just_joined

Definition at line 76 of file client.qh.

Referenced by PutObserverInServer(), and SetPlayerTeam().

◆ killcount

◆ MAX_SPECTATORS

const int MAX_SPECTATORS = 7

Definition at line 413 of file client.qh.

◆ MIN_SPEC_TIME

const int MIN_SPEC_TIME = 1

◆ pauseregen_finished

◆ pauserotarmor_finished

float pauserotarmor_finished

◆ pauserotfuel_finished

float pauserotfuel_finished

Definition at line 340 of file client.qh.

Referenced by CheatImpulse(), GiveItems(), player_regen(), and PutPlayerInServer().

◆ pauserothealth_finished

float pauserothealth_finished

◆ player_blocked

bool player_blocked

Definition at line 332 of file client.qh.

Referenced by ClientKill(), PlayerJump(), and PM_check_blocked().

◆ playerid

◆ playermodel

string playermodel

Definition at line 84 of file client.qh.

◆ playerskin

string playerskin

Definition at line 85 of file client.qh.

◆ pressedkeys

int pressedkeys

Definition at line 80 of file client.qh.

◆ respawn_countdown

float respawn_countdown

Definition at line 324 of file client.qh.

Referenced by calculate_player_respawn_time(), and ShowRespawnCountdown().

◆ RESPAWN_DENY

const int RESPAWN_DENY = BIT(2)

Definition at line 328 of file client.qh.

Referenced by PlayerThink().

◆ respawn_flags

int respawn_flags

◆ RESPAWN_FORCE

◆ RESPAWN_SILENT

const int RESPAWN_SILENT = BIT(1)

◆ respawn_time

◆ respawn_time_max

float respawn_time_max

Definition at line 322 of file client.qh.

Referenced by calculate_player_respawn_time(), and PlayerThink().

◆ spectatee_status

int spectatee_status

Definition at line 71 of file client.qh.

◆ spectatortime

float spectatortime

Definition at line 330 of file client.qh.

Referenced by PlayerPreThink().

◆ startplaytime

float startplaytime

Definition at line 67 of file client.qh.

Referenced by TeamBalance_RemoveExcessPlayers().

◆ SVC_SETVIEW

const int SVC_SETVIEW = 5

Definition at line 334 of file client.qh.

Referenced by PutClientInServer(), PutObserverInServer(), and SpectateSet().

◆ team_selected

int team_selected

0 is a team index, if wants_join == -1 the player can't have the team they selected (conflict)

Definition at line 75 of file client.qh.

Referenced by ClientKill_TeamChange(), Join(), and ShowTeamSelection().

◆ wants_join

int wants_join

0 is a team index, -1 means team selection is deferred until Join()

Definition at line 78 of file client.qh.

◆ weaponorder_byimpulse

string weaponorder_byimpulse

◆ zoomstate

bool zoomstate

Definition at line 72 of file client.qh.

Referenced by ClientData_Send(), SetZoomState(), and SpectateCopy().