Quake II RTX doxygen
1.0 dev
|
|
Go to the documentation of this file.
20 #include "client/input.h"
70 cvar_t *sv_pad_packets;
79 cvar_t *sv_packetdup_hack;
120 List_Remove(&client->
entry);
124 if (
sv.
state == ss_broadcast) {
129 Com_DPrintf(
"Going from cs_zombie to cs_free for %s\n", client->
name);
139 string_entry_t *bad, *next;
141 for (bad = client->ac_bad_files; bad; bad = next) {
145 client->ac_bad_files = NULL;
167 int announce = oldstate ==
cs_spawned ? 2 : 1;
168 const char *prefix =
" was dropped: ";
171 if (*reason ==
'!') {
175 if (*reason ==
'?') {
188 client->
name, prefix, reason);
194 client->
name, prefix, reason);
197 if (COM_DEDICATED && client->
netchan)
198 Com_Printf(
"%s[%s]%s%s\n", client->
name,
219 oldstate = client->
state;
234 ge->ClientDisconnect(client->
edict);
241 Com_DPrintf(
"Going to cs_zombie for %s\n", client->
name);
251 #define CREDITS_PER_MSEC 32
252 #define CREDITS_PER_SEC (CREDITS_PER_MSEC * 1000)
255 #define RATE_LIMIT_SCALE 10000
311 unsigned limit, period, mult, burst, rate;
314 limit = strtoul(s, &p, 10);
316 period = strtoul(p + 1, &p, 10);
317 if (*p ==
's' || *p ==
'S') {
320 }
else if (*p ==
'm' || *p ==
'M') {
323 }
else if (*p ==
'h' || *p ==
'H') {
340 memset(r, 0,
sizeof(*r));
345 Com_Printf(
"Period too large: %u\n", period);
353 burst = strtoul(p + 1, NULL, 10);
359 if (burst > UINT_MAX / rate) {
360 Com_Printf(
"Burst too large: %u\n", burst);
375 if (NET_IsEqualBaseAdrMask(addr, &match->
addr, &match->
mask)) {
377 match->
time = time(NULL);
403 char entry[MAX_STRING_CHARS];
427 if (total + 8 + len < MAX_INFO_STRING) {
428 memcpy(status + total,
"\\uptime\\", 8);
429 memcpy(status + total + 8, entry, len);
434 status[total++] =
'\n';
444 cl->edict->client->ps.stats[STAT_FRAGS],
446 if (len >=
sizeof(entry)) {
452 memcpy(status + total, entry, len);
471 char buffer[MAX_PACKETLEN_DEFAULT];
479 Com_DPrintf(
"Dropping status request from %s\n",
485 memcpy(buffer,
"\xff\xff\xff\xffprint\n", 10);
508 if (NET_IsEqualBaseAdr(&
m->adr, &
net_from)) {
509 Com_DPrintf(
"Ping acknowledge from %s\n",
527 char buffer[MAX_QPATH+10];
535 if (version < PROTOCOL_VERSION_DEFAULT || version > PROTOCOL_VERSION_Q2PRO)
539 "\xff\xff\xff\xffinfo\n%16s %8s %2i/%2i\n",
555 OOB_PRINT(NS_SERVER, &
net_from,
"ack");
576 oldestTime = 0xffffffff;
591 challenge = ((rand() << 16) | rand()) & 0x7fffffff;
604 "challenge %u p=34,35,36", challenge);
626 char reconnect_var[16];
627 char reconnect_val[16];
630 #define __reject(...) \
631 Netchan_OutOfBand(NS_SERVER, &net_from, "print\n" __VA_ARGS__)
634 #define reject(...) __reject(__VA_ARGS__), qfalse
635 #define reject2(...) __reject(__VA_ARGS__), NULL
644 if (p->
protocol < PROTOCOL_VERSION_OLD ||
645 p->
protocol > PROTOCOL_VERSION_Q2PRO)
649 if (p->
protocol < PROTOCOL_VERSION_DEFAULT)
650 return reject(
"You need Quake 2 version 3.19 or higher.\n");
675 return reject(
"Bad challenge.\n");
680 return reject(
"No challenge for address.\n");
688 s =
"Your IP address is banned from this server.";
690 return reject(
"%s\nConnection refused.\n", s);
695 return reject(
"Server is locked.\n");
705 netadr_t *adr = &
cl->netchan->remote_address;
711 if (
net_from.type == NA_IP6 && memcmp(
net_from.ip.u8, adr->ip.u8, 48 / CHAR_BIT))
721 return reject(
"Too many connections from your IPv6 network.\n");
723 return reject(
"Too many connections from your IP address.\n");
735 p->
maxlength = MAX_PACKETLEN_WRITABLE_DEFAULT;
736 if (p->
protocol >= PROTOCOL_VERSION_R1Q2) {
741 return reject(
"Invalid maximum message length.\n");
766 if (p->
protocol == PROTOCOL_VERSION_R1Q2) {
772 PROTOCOL_VERSION_R1Q2_MINIMUM,
773 PROTOCOL_VERSION_R1Q2_CURRENT);
775 p->
version = PROTOCOL_VERSION_R1Q2_MINIMUM;
779 }
else if (p->
protocol == PROTOCOL_VERSION_Q2PRO) {
785 return reject(
"Invalid netchan type.\n");
803 PROTOCOL_VERSION_Q2PRO_MINIMUM,
804 PROTOCOL_VERSION_Q2PRO_CURRENT);
805 if (p->
version == PROTOCOL_VERSION_Q2PRO_RESERVED) {
809 p->
version = PROTOCOL_VERSION_Q2PRO_MINIMUM;
818 static char s[MAX_QPATH];
826 for (i = 0; i < 48 / CHAR_BIT; i++)
843 return reject(
"Empty userinfo string.\n");
846 return reject(
"Malformed userinfo string.\n");
849 s[MAX_CLIENT_NAME - 1] = 0;
851 return reject(
"Please set your name before connecting.\n");
857 return reject(
"Please set your password before connecting.\n");
860 return reject(
"Invalid password.\n");
863 return reject(
"Invalid password.\n");
879 if (strncmp(s,
"q2rtx", 5) != 0)
881 return reject(
"This server is only available to Q2RTX clients.\n");
886 Q_strlcpy(userinfo, info, MAX_INFO_STRING);
889 if (!(
g_features->integer & GMF_EXTRA_USERINFO)) {
900 return reject(
"Oversize userinfo string.\n");
932 if (NET_IsEqualAdr(&
net_from, &
cl->netchan->remote_address)) {
960 return reject2(
"Server and reserved slots are full.\n");
966 return reject2(
"Server is full.\n");
979 if (newcl->
protocol >= PROTOCOL_VERSION_R1Q2) {
980 newcl->
pmp.speedmult = 2;
986 if (newcl->
protocol == PROTOCOL_VERSION_R1Q2) {
987 newcl->
esFlags |= MSG_ES_BEAMORIGIN;
988 if (newcl->
version >= PROTOCOL_VERSION_R1Q2_LONG_SOLID) {
989 newcl->
esFlags |= MSG_ES_LONGSOLID;
995 if (newcl->
protocol == PROTOCOL_VERSION_Q2PRO) {
999 newcl->
pmp.flyhack = qtrue;
1000 newcl->
pmp.flyfriction = 4;
1001 newcl->
esFlags |= MSG_ES_UMASK;
1002 if (newcl->
version >= PROTOCOL_VERSION_Q2PRO_LONG_SOLID) {
1003 newcl->
esFlags |= MSG_ES_LONGSOLID;
1005 if (newcl->
version >= PROTOCOL_VERSION_Q2PRO_BEAM_ORIGIN) {
1006 newcl->
esFlags |= MSG_ES_BEAMORIGIN;
1008 if (newcl->
version >= PROTOCOL_VERSION_Q2PRO_WATERJUMP_HACK) {
1017 const char *ncstring =
"";
1018 const char *acstring =
"";
1019 const char *dlstring1 =
"";
1020 const char *dlstring2 =
"";
1022 if (newcl->
protocol == PROTOCOL_VERSION_Q2PRO) {
1023 if (nctype == NETCHAN_NEW)
1033 dlstring1 =
" dlserver=";
1038 ncstring, acstring, dlstring1, dlstring2, newcl->
mapname);
1046 if (!(
g_features->integer & GMF_EXTRA_USERINFO)) {
1047 userinfo[strlen(userinfo) + 1] = 0;
1051 Q_snprintf(userinfo + strlen(userinfo) + 1, MAX_INFO_STRING,
1052 "\\challenge\\%d\\ip\\%s"
1053 "\\major\\%d\\minor\\%d\\netchan\\%d"
1054 "\\packetlen\\%d\\qport\\%d\\zlib\\%d",
1062 char userinfo[MAX_INFO_STRING * 2];
1069 memset(¶ms, 0,
sizeof(params));
1093 memset(newcl, 0,
sizeof(*newcl));
1103 newcl->
pool = (edict_pool_t *)&
ge->edicts;
1111 newcl->framediv =
sv.framediv;
1112 newcl->
settings[CLS_FPS] = BASE_FRAMERATE;
1122 allow =
ge->ClientConnect(newcl->
edict, userinfo);
1128 __reject(
"%s\nConnection refused.\n", reason);
1153 if (newcl->
protocol == PROTOCOL_VERSION_DEFAULT) {
1160 if (NET_IsLocalAddress(&
net_from)) {
1167 Com_DPrintf(
"Going from cs_free to cs_assigned for %s\n", newcl->
name);
1200 Com_DPrintf(
"Dropping rcon from %s\n",
1207 Com_Printf(
"Invalid rcon from %s:\n%s\n",
1210 "print\nBad rcon_password.\n");
1249 char string[MAX_STRING_CHARS];
1255 Com_DPrintf(
"ignored blackholed connectionless packet\n");
1263 if (len >=
sizeof(
string)) {
1264 Com_DPrintf(
"ignored oversize connectionless packet\n");
1273 if (!strcmp(
c,
"rcon")) {
1279 Com_DPrintf(
"ignored connectionless packet\n");
1283 for (i = 0;
svcmds[i].name; i++) {
1284 if (!strcmp(
c,
svcmds[i].name)) {
1290 Com_DPrintf(
"bad connectionless packet\n");
1318 int i, j, count = INT_MAX;
1320 for (i = 0; i < UPDATE_BACKUP; i++) {
1321 j =
cl->framenum - i - 1;
1322 frame = &
cl->
frames[j & UPDATE_MASK];
1331 return count == INT_MAX ? 0 : count;
1337 int i, j, total = 0, count = 0;
1339 for (i = 0; i < UPDATE_BACKUP; i++) {
1340 j =
cl->framenum - i - 1;
1341 frame = &
cl->
frames[j & UPDATE_MASK];
1350 return count ? total / count : 0;
1377 cl->ping = calc(
cl);
1379 if (
cl->ping <
cl->min_ping) {
1380 cl->min_ping =
cl->ping;
1381 }
else if (
cl->ping >
cl->max_ping) {
1382 cl->max_ping =
cl->ping;
1385 cl->avg_ping_time +=
cl->ping;
1386 cl->avg_ping_count++;
1390 cl->moves_per_sec =
cl->num_moves / 10;
1395 cl->moves_per_sec = 0;
1400 cl->edict->client->ping =
cl->ping;
1421 cl->command_msec = 1800;
1451 if (!NET_IsEqualBaseAdr(&
net_from, &netchan->remote_address)) {
1457 if (client->
protocol == PROTOCOL_VERSION_DEFAULT) {
1459 if (netchan->qport != qport) {
1462 }
else if (netchan->qport) {
1464 if (netchan->qport != qport) {
1468 if (netchan->remote_address.port !=
net_from.port) {
1473 if (netchan->remote_address.port !=
net_from.port) {
1474 Com_DPrintf(
"Fixing up a translated port for %s: %d --> %d\n",
1475 client->
name, netchan->remote_address.port,
net_from.port);
1476 netchan->remote_address.port =
net_from.port;
1479 if (!netchan->Process(netchan))
1488 client->unreachable = qfalse;
1490 if (netchan->dropped > 0)
1502 static void update_client_mtu(
client_t *client,
int ee_info)
1504 netchan_t *netchan = client->
netchan;
1505 size_t newpacketlen;
1508 if (ee_info < 576 || ee_info > 4096)
1515 if (netchan->type == NETCHAN_OLD)
1518 if (!netchan->reliable_length)
1521 newpacketlen = ee_info - 64;
1522 if (newpacketlen >= netchan->maxpacketlen)
1525 Com_Printf(
"Fixing up maxmsglen for %s: %"PRIz
" --> %"PRIz
"\n",
1526 client->
name, netchan->maxpacketlen, newpacketlen);
1527 netchan->maxpacketlen = newpacketlen;
1537 void SV_ErrorEvent(netadr_t *from,
int ee_errno,
int ee_info)
1552 if (!NET_IsEqualBaseAdr(from, &netchan->remote_address)) {
1555 if (from->port && netchan->remote_address.port != from->port) {
1560 if (ee_errno == EMSGSIZE) {
1561 update_client_mtu(client, ee_info);
1565 client->unreachable = qtrue;
1587 unsigned drop_time = 1000 *
sv_timeout->value;
1594 if (NET_IsLocalAddress(&client->
netchan->remote_address)) {
1600 if (delta > zombie_time) {
1610 if (client->unreachable) {
1611 if (delta > ghost_time) {
1618 if (delta > drop_time || (client->
state ==
cs_assigned && delta > ghost_time)) {
1630 if (idle_time && delta > idle_time) {
1651 if (
sv.
state == ss_broadcast) {
1662 for (i = 1; i <
ge->num_edicts; i++) {
1677 if (!cl_paused->integer)
1687 if (!LIST_EMPTY(&mvd_gtv_list))
1719 if (host_speeds->integer)
1731 if (host_speeds->integer)
1736 Com_WPrintf(
"Game left %"PRIz
" bytes "
1737 "in multicast buffer, cleared.\n",
1756 char buffer[MAX_PACKETLEN_DEFAULT];
1772 memcpy(buffer,
"\xff\xff\xff\xffheartbeat\n", 14);
1781 Com_DPrintf(
"Sending heartbeat to %s\n",
1813 Com_DPrintf(
"Sending shutdown to %s\n",
1815 OOB_PRINT(NS_SERVER, &
m->adr,
"shutdown");
1833 time_before_game = time_after_game = 0;
1839 if (COM_DEDICATED) {
1895 if (COM_DEDICATED) {
1929 char name[MAX_CLIENT_NAME];
1935 ge->ClientUserinfoChanged(
cl->edict,
cl->userinfo);
1939 len =
Q_strlcpy(name, val,
sizeof(name));
1940 if (len >=
sizeof(name)) {
1941 len =
sizeof(name) - 1;
1944 for (i = 0; i < len; i++)
1946 if (
cl->name[0] && strcmp(
cl->name, name)) {
1947 if (COM_DEDICATED) {
1948 Com_Printf(
"%s[%s] changed name to %s\n",
cl->name,
1952 if (
sv.
state == ss_broadcast) {
1961 memcpy(
cl->name, name, len + 1);
1966 cl->rate = atoi(val);
1967 clamp(
cl->rate, 100, 15000);
1973 if (NET_IsLocalAddress(&
cl->netchan->remote_address)) {
1979 NET_IsLanAddress(&
cl->netchan->remote_address)) {
1986 cl->messagelevel = atoi(val);
1987 clamp(
cl->messagelevel, PRINT_LOW, PRINT_CHAT + 1);
1995 void SV_SetConsoleTitle(
void)
1997 char buffer[MAX_STRING_CHARS];
1999 Q_snprintf(buffer,
sizeof(buffer),
"%s (port %d%s)",
2003 Sys_SetConsoleTitle(buffer);
2039 static void sv_hostname_changed(cvar_t *
self)
2041 SV_SetConsoleTitle();
2046 voidpf SV_zalloc(voidpf opaque, uInt items, uInt size)
2051 void SV_zfree(voidpf opaque, voidpf address)
2078 Cvar_Get(
"protocol", STRINGIFY(PROTOCOL_VERSION_DEFAULT), CVAR_SERVERINFO | CVAR_ROM);
2080 Cvar_Get(
"skill",
"1", CVAR_LATCH);
2081 Cvar_Get(
"deathmatch",
"1", CVAR_SERVERINFO | CVAR_LATCH);
2083 Cvar_Get(
"cheats",
"0", CVAR_SERVERINFO | CVAR_LATCH);
2084 Cvar_Get(
"dmflags",
va(
"%i", DF_INSTANT_ITEMS), CVAR_SERVERINFO);
2085 Cvar_Get(
"fraglimit",
"0", CVAR_SERVERINFO);
2086 Cvar_Get(
"timelimit",
"0", CVAR_SERVERINFO);
2102 sv_fps =
Cvar_Get(
"sv_fps",
"10", CVAR_LATCH);
2118 sv_debug =
Cvar_Get(
"sv_debug",
"0", 0);
2119 sv_pad_packets =
Cvar_Get(
"sv_pad_packets",
"0", 0);
2129 sv_packetdup_hack =
Cvar_Get(
"sv_packetdup_hack",
"0", 0);
2171 sv.frametime = BASE_FRAMETIME;
2178 SV_SetConsoleTitle();
2211 if (type == ERR_RECONNECT)
2218 for (i = 0; i < 2; i++) {
2224 while (netchan->fragment_pending) {
2225 netchan->TransmitNextFragment(netchan);
2277 memset(&
sv, 0,
sizeof(
sv));
2285 memset(&
svs, 0,
sizeof(
svs));
2292 sv.frametime = BASE_FRAMETIME;
2302 SV_SetConsoleTitle();
qboolean sv_pending_autosave
void SV_Shutdown(const char *finalmsg, error_type_t type)
void SV_RegisterSavegames(void)
cvar_t * sv_downloadserver
static client_t * redirect(const char *addr)
cvar_t * Cvar_Set(const char *var_name, const char *value)
void SV_MvdRunClients(void)
void CM_FreeMap(cm_t *cm)
#define MVD_SPAWN_INTERNAL
static void SVC_GetChallenge(void)
void PmoveEnableQW(pmoveParams_t *pmp)
static qboolean parse_basic_params(conn_params_t *p)
char * NET_AdrToString(const netadr_t *a)
size_t Cvar_BitInfo(char *info, int bit)
#define SV_BASELINES_CHUNKS
qboolean Info_Validate(const char *s)
void MVD_GameClientNameChanged(edict_t *ent, const char *name)
cvar_t * sv_redirect_address
size_t Q_snprintf(char *dest, size_t size, const char *fmt,...)
void SV_ShutdownClientSend(client_t *client)
void MSG_BeginReading(void)
static void SV_FinalMessage(const char *message, error_type_t type)
entity_packed_t * entities
cvar_t * sv_enhanced_setplayer
cvar_t * Cvar_Get(const char *var_name, const char *var_value, int flags)
static int ping_nop(client_t *cl)
void Z_LeakTest(memtag_t tag)
void SV_MvdShutdown(error_type_t type)
void SV_SendClientMessages(void)
void SV_MvdRegister(void)
netchan_t * Netchan_Setup(netsrc_t sock, netchan_type_t type, const netadr_t *adr, int qport, size_t maxpacketlen, int protocol)
static void sv_namechange_limit_changed(cvar_t *self)
cvar_t * sv_waterjump_hack
static void sv_auth_limit_changed(cvar_t *self)
cvar_t * sv_force_reconnect
void Netchan_OutOfBand(netsrc_t sock, const netadr_t *address, const char *format,...)
ratelimit_t ratelimit_rcon
void SV_WriteFrameToClient_Default(client_t *client)
void Cmd_ExecuteString(cmdbuf_t *buf, const char *text)
cvar_t * sv_namechange_limit
static void SVC_Ack(void)
void SV_MvdEndFrame(void)
cvar_t * sv_reserved_password
static void SV_GiveMsec(void)
void Cmd_TokenizeString(const char *text, qboolean macroExpand)
static void SV_PacketEvent(void)
ratelimit_t ratelimit_auth
char * Cmd_RawArgsFrom(int from)
void MSG_WriteByte(int c)
ratelimit_t ratelimit_status
static unsigned rate2credits(unsigned rate)
cvar_t * sv_airaccelerate
unsigned Sys_Milliseconds(void)
static void SV_MasterHeartbeat(void)
static void print_drop_reason(client_t *client, const char *reason, clstate_t oldstate)
void SV_ClientAddMessage(client_t *client, int flags)
static void SVC_Ping(void)
void SV_CleanClient(client_t *client)
#define FOR_EACH_MASTER(m)
void SV_UserinfoChanged(client_t *cl)
#define FOR_EACH_CLIENT(client)
static client_t * find_client_slot(conn_params_t *params)
cvar_t * sv_reserved_slots
char * AC_ClientConnect(client_t *cl)
void void MVD_PrepWorldFrame(void)
void NET_GetPackets(netsrc_t sock, void(*packet_cb)(void))
#define HEARTBEAT_SECONDS
int SV_CountClients(void)
cvar_t * sv_lan_force_rate
void SV_SendAsyncPackets(void)
entity_packed_t * baselines[SV_BASELINES_CHUNKS]
static void init_rate_limits(void)
void Com_EndRedirect(void)
char * Info_ValueForKey(const char *s, const char *key)
char * va(const char *format,...)
static void SVC_Info(void)
challenge_t challenges[MAX_CHALLENGES]
void SV_ExecuteClientMessage(client_t *cl)
void SV_MvdClientDropped(client_t *client)
void MVD_GameClientDrop(edict_t *ent, const char *prefix, const char *reason)
void SV_CloseDownload(client_t *client)
cvar_t * sv_allow_unconnected_cmds
void SV_MvdBeginFrame(void)
size_t Q_strlcpy(char *dst, const char *src, size_t size)
qboolean COM_IsWhite(const char *s)
static void SV_ConnectionlessPacket(void)
static qboolean check_paused(void)
static void SV_MasterShutdown(void)
void SV_DropClient(client_t *client, const char *reason)
static void SVC_DirectConnect(void)
static void send_connect_packet(client_t *newcl, int nctype)
#define SV_OUTPUTBUF_LENGTH
static int ping_min(client_t *cl)
size_t Com_UptimeLong_m(char *buffer, size_t size)
void SV_InitOperatorCommands(void)
static void SV_CheckTimeouts(void)
server_frame_t frames[UPDATE_BACKUP]
void SV_RateRecharge(ratelimit_t *r)
void MSG_WriteString(const char *string)
void SV_BroadcastPrintf(int level, const char *fmt,...)
static void SV_PrepWorldFrame(void)
void SV_WriteFrameToClient_Enhanced(client_t *client)
static qboolean rcon_valid(void)
void MSG_WriteLong(int c)
qboolean NET_SendPacket(netsrc_t sock, const void *data, size_t len, const netadr_t *to)
static char * userinfo_ip_string(void)
static void SV_CalcPings(void)
void PmoveInit(pmoveParams_t *pmp)
size_t Com_Uptime_m(char *buffer, size_t size)
static void sv_status_limit_changed(cvar_t *self)
cvar_t * sv_allow_nodelta
void Cbuf_Execute(cmdbuf_t *buf)
static int ping_avg(client_t *cl)
void SV_ShutdownGameProgs(void)
void(* WriteFrame)(struct client_s *)
void SV_ClientPrintf(client_t *client, int level, const char *fmt,...)
addrmatch_t * SV_MatchAddress(list_t *list, netadr_t *addr)
message_packet_t * msg_pool
static qboolean parse_userinfo(conn_params_t *params, char *userinfo)
void Netchan_Close(netchan_t *netchan)
size_t MSG_ReadStringLine(char *dest, size_t size)
cvar_t * sv_show_name_changes
static void append_extra_userinfo(conn_params_t *params, char *userinfo)
void MVD_RemoveClient(client_t *client)
static const ucmd_t svcmds[]
qboolean Info_SetValueForKey(char *s, const char *key, const char *value)
static void sv_rcon_limit_changed(cvar_t *self)
static size_t SV_StatusString(char *status)
CONST PIXELFORMATDESCRIPTOR int
#define SV_PacketRedirect()
void AC_ClientDisconnect(client_t *cl)
char configstrings[MAX_CONFIGSTRINGS][MAX_QPATH]
cvar_t * sv_strafejump_hack
void SV_InitClientSend(client_t *newcl)
cvar_t * map_override_path
void SV_RemoveClient(client_t *client)
void SV_RateInit(ratelimit_t *r, const char *s)
size_t Q_scnprintf(char *dest, size_t size, const char *fmt,...)
static void init_pmove_and_es_flags(client_t *newcl)
ratelimit_t ratelimit_namechange
char userinfo[MAX_INFO_STRING]
list_t sv_cmdlist_connect
cvar_t * sv_calcpings_method
unsigned SV_Frame(unsigned msec)
qboolean SV_RateLimited(ratelimit_t *r)
static void SVC_RemoteCommand(void)
static qboolean permit_connection(conn_params_t *p)
static void SV_RunGameFrame(void)
void SZ_Clear(sizebuf_t *buf)
void Info_RemoveKey(char *s, const char *key)
static void SVC_Status(void)
static qboolean parse_packet_length(conn_params_t *p)
static qboolean parse_enhanced_params(conn_params_t *p)
char name[MAX_CLIENT_NAME]