OpenMoHAA 0.82.0
Loading...
Searching...
No Matches
server.h
1/*
2===========================================================================
3Copyright (C) 1999-2005 Id Software, Inc.
4
5This file is part of Quake III Arena source code.
6
7Quake III Arena source code is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 2 of the License,
10or (at your option) any later version.
11
12Quake III Arena source code is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with Quake III Arena source code; if not, write to the Free Software
19Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20===========================================================================
21*/
22// server.h
23
24#pragma once
25
26#include "../qcommon/q_shared.h"
27#include "../qcommon/qcommon.h"
28#include "../fgame/bg_public.h"
29#include "../fgame/g_public.h"
30#ifndef DEDICATED
31# include "../client/snd_local.h"
32#endif
33
34//=============================================================================
35
36#define PERS_SCORE 0 // !!! MUST NOT CHANGE, SERVER AND
37 // GAME BOTH REFERENCE !!!
38
39#define MAX_ENT_CLUSTERS 16
40
41#ifdef __cplusplus
42extern "C" {
43#endif
44
45#ifdef USE_VOIP
46#define VOIP_QUEUE_LENGTH 64
47
48typedef struct voipServerPacket_s
49{
50 int generation;
51 int sequence;
52 int frames;
53 int len;
54 int sender;
55 int flags;
56 byte data[4000];
57} voipServerPacket_t;
58#endif
59
60typedef struct svEntity_s {
61 struct worldSector_s *worldSector;
62 struct svEntity_s *nextEntityInWorldSector;
63
64 entityState_t baseline; // for delta compression of initial sighting
65 int numClusters; // if -1, use headnode instead
66 int clusternums[MAX_ENT_CLUSTERS];
67 int lastCluster; // if all the clusters don't fit in clusternums
68 int areanum, areanum2;
69 int snapshotCounter; // used to prevent double adding from portal views
70} svEntity_t;
71
72typedef enum {
73 SS_DEAD, // no map loaded
74 SS_LOADING, // spawning level entities
75 SS_LOADING2,
76 SS_GAME // actively running
77} serverState_t;
78
79typedef struct {
80 serverState_t state;
81 qboolean restarting; // if true, send configstring changes during SS_LOADING
82 int serverId; // changes each server start
83 int restartedServerId; // serverId before a map_restart
84 int checksumFeed; // the feed key that we use to compute the pure checksum strings
85 // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=475
86 // the serverId associated with the current checksumFeed (always <= serverId)
87 int checksumFeedServerId;
88 int snapshotCounter; // incremented for each snapshot built
89 int timeResidual; // <= 1000 / sv_frame->value
90 int nextFrameTime; // when time > nextFrameTime, process world
91 float frameTime;
92 struct cmodel_s *models[MAX_MODELS];
93 char *configstrings[MAX_CONFIGSTRINGS];
94 svEntity_t svEntities[MAX_GENTITIES];
95
96 int farplane;
97 qboolean skyportal;
98
99 char *entityParsePoint; // used during game VM init
100
101 // the game virtual machine will update these on init and changes
102 gentity_t *gentities;
103 int gentitySize;
104 int num_entities; // current number, <= MAX_GENTITIES
105
106 playerState_t *gameClients;
107 int gameClientSize; // will be > sizeof(playerState_t) due to game private data
108} server_t;
109
110
111
112
113
114typedef struct {
115 int areabytes;
116 byte areabits[MAX_MAP_AREA_BYTES]; // portalarea visibility bits
117 playerState_t ps;
118 int num_entities;
119 int first_entity; // into the circular sv_packet_entities[]
120 // the entities MUST be in increasing state number
121 // order, otherwise the delta compression will fail
122 int messageSent; // time the message was transmitted
123 int messageAcked; // time the message was acked
124 int messageSize; // used to rate drop packets
126
127typedef enum {
128 CS_FREE, // can be reused for a new connection
129 CS_ZOMBIE, // client has been disconnected, but don't reuse
130 // connection for a couple seconds
131 CS_CONNECTED, // has been assigned to a client_t, but no gamestate yet
132 CS_PRIMED, // gamestate has been sent, but client hasn't sent a usercmd
133 CS_ACTIVE // client is fully in game
134} clientState_t;
135
136typedef struct netchan_buffer_s {
137 msg_t msg;
138 byte msgBuffer[MAX_MSGLEN];
139#ifdef LEGACY_PROTOCOL
140 char clientCommandString[MAX_STRING_CHARS]; // valid command string for SV_Netchan_Encode
141#endif
142 struct netchan_buffer_s *next;
143} netchan_buffer_t;
144
145typedef struct client_s {
146 clientState_t state;
147 char userinfo[MAX_INFO_STRING]; // name, etc
148
149 char reliableCommands[MAX_RELIABLE_COMMANDS][MAX_STRING_CHARS];
150 int reliableSequence; // last added reliable message, not necessarily sent or acknowledged yet
151 int reliableAcknowledge; // last acknowledged reliable message
152 int reliableSent; // last sent reliable message, not necessarily acknowledged yet
153 int messageAcknowledge;
154
155 int gamestateMessageNum; // netchan->outgoingSequence of gamestate
156 int challenge;
157 int serverIdAcknowledge;
158
159 usercmd_t lastUsercmd;
160
161 usereyes_t lastEyeinfo;
162
163 int lastMessageNum; // for delta compression
164 int lastClientCommand; // reliable client message sequence
165 char lastClientCommandString[MAX_STRING_CHARS];
166 gentity_t *gentity; // SV_GentityNum(clientnum)
167 char name[MAX_NAME_LENGTH]; // extracted from userinfo, high bits masked
168
169 // downloading
170 char downloadName[MAX_QPATH]; // if not empty string, we are downloading
171 fileHandle_t download; // file being downloaded
172 int downloadSize; // total bytes (can't use EOF because of paks)
173 int downloadCount; // bytes sent
174 int downloadClientBlock; // last block we sent to the client, awaiting ack
175 int downloadCurrentBlock; // current block number
176 int downloadXmitBlock; // last block we xmited
177 unsigned char *downloadBlocks[MAX_DOWNLOAD_WINDOW]; // the buffers for the download blocks
178 int downloadBlockSize[MAX_DOWNLOAD_WINDOW];
179 qboolean downloadEOF; // We have sent the EOF block
180 int downloadSendTime; // time we last got an ack from the client
181
182 int deltaMessage; // frame last client usercmd message
183 int nextReliableTime; // svs.time when another reliable command will be allowed
184 int lastPacketTime; // svs.time when packet was last received
185 int lastConnectTime; // svs.time when connection started
186 int lastSnapshotTime; // svs.time of last sent snapshot
187 qboolean rateDelayed; // true if nextSnapshotTime was set based on rate instead of snapshotMsec
188 int timeoutCount; // must timeout a few frames in a row so debugging doesn't break
189 clientSnapshot_t frames[PACKET_BACKUP]; // updates can be delta'd from here
190 int ping;
191 int rate; // bytes / second
192 int snapshotMsec; // requests a snapshot every snapshotMsec unless rate choked
193 int pureAuthentic;
194 qboolean gotCP; // TTimo - additional flag to distinguish between a bad pure checksum, and no cp command at all
195 netchan_t netchan;
196 // Added in 2.0
197 netprofclient_t netprofile;
198 // TTimo
199 // queuing outgoing fragmented messages to send them properly, without udp packet bursts
200 // in case large fragmented messages are stacking up
201 // buffer them into this queue, and hand them out to netchan as needed
202 netchan_buffer_t *netchan_start_queue;
203 netchan_buffer_t **netchan_end_queue;
204
205#ifdef USE_VOIP
206 qboolean hasVoip;
207 qboolean muteAllVoip;
208 qboolean ignoreVoipFromClient[MAX_CLIENTS];
209 voipServerPacket_t *voipPacket[VOIP_QUEUE_LENGTH];
210 int queuedVoipPackets;
211 int queuedVoipIndex;
212#endif
213
214 int oldServerTime;
215 qboolean csUpdated[MAX_CONFIGSTRINGS];
216
217 server_sound_t server_sounds[ MAX_SERVER_SOUNDS ];
218 int number_of_server_sounds;
219 qboolean locprint;
220 int XOffset;
221 int YOffset;
222 qboolean isPure;
223 int gamespyId;
224 char stringToPrint[256];
225 int radarInfo;
226 int lastRadarTime[MAX_CLIENTS];
227 int lastVisCheckTime[MAX_CLIENTS];
228
229#ifdef LEGACY_PROTOCOL
230 qboolean compat;
231#endif
232} client_t;
233
234//=============================================================================
235
236
237// MAX_CHALLENGES is made large to prevent a denial
238// of service attack that could cycle all of them
239// out before legitimate users connected
240#define MAX_CHALLENGES 2048
241// Allow a certain amount of challenges to have the same IP address
242// to make it a bit harder to DOS one single IP address from connecting
243// while not allowing a single ip to grab all challenge resources
244#define MAX_CHALLENGES_MULTI (MAX_CHALLENGES / 2)
245
246#define AUTHORIZE_TIMEOUT 5000
247
248typedef enum {
249 CDKS_NONE,
250 CDKS_AUTHENTICATING,
251 CDKS_AUTHENTICATED,
252 CDKS_FAILED
253} cdKeyState_e;
254
255typedef enum {
256 NETO_NONE,
257 NETO_CULLED,
258 NETO_ALWAYS
259} netoptimize_e;
260
261typedef struct {
262 netadr_t adr;
263 int challenge;
264 int clientChallenge; // challenge number coming from the client
265 int time; // time the last packet was sent to the autherize server
266 int pingTime; // time the challenge response was sent to client
267 int firstTime; // time the adr was first used, for authorize timeout checks
268 qboolean wasrefused;
269 qboolean connected;
270
271 //
272 // gamespy stuff
273 //
274 unsigned int gamespyId;
275 char gsChallenge[12];
276 cdKeyState_e cdkeyState;
278
279// Added in OPM
280typedef struct {
281 qboolean inUse;
282 int deleteTime;
284
285// this structure will be cleared only when the game dll changes
286typedef struct {
287 qboolean initialized; // sv_init has completed
288
289 int time; // will be strictly increasing across level changes
290
291 int snapFlagServerBit; // ^= SNAPFLAG_SERVERCOUNT every SV_SpawnServer()
292
293 int startTime;
294 int lastTime;
295 int serverLagTime;
296 qboolean autosave;
297 int mapTime;
298
299 client_t *clients; // [sv_maxclients->integer];
300 int iNumClients;
301 int numSnapshotEntities; // sv_maxclients->integer*PACKET_BACKUP*MAX_SNAPSHOT_ENTITIES
302 int nextSnapshotEntities; // next snapshotEntities to use
303 entityState_t *snapshotEntities; // [numSnapshotEntities]
304 int nextHeartbeatTime;
305 challenge_t challenges[MAX_CHALLENGES]; // to prevent invalid IPs from connecting
306 netadr_t redirectAddress; // for rcon return messages
307#ifndef STANDALONE
308 netadr_t authorizeAddress; // authorize server address
309#endif
310 char gameName[ MAX_QPATH ];
311 char mapName[ MAX_QPATH ];
312 char rawServerName[ MAX_QPATH ];
313 int areabits_warning_time;
314
315 qboolean soundsNeedLoad;
316 char tm_filename[ MAX_QPATH ];
317 int tm_loopcount;
318 int tm_offset;
319
320 nonpvs_sound_cache_t nonpvs_sound_cache[MAX_SOUNDS]; // Added in OPM
321#ifndef DEDICATED
322 soundsystemsavegame_t soundSystem;
323#endif
324 // Added in 2.0
325 netprofclient_t netprofile;
327
328#define SERVER_MAXBANS 1024
329#define MAX_REASON_LENGTH 128
330
331// Structure for managing bans
332typedef struct serverBan_s {
333 netadr_t ip;
334 // For a CIDR-Notation type suffix
335 int subnet;
336 qboolean isexception;
337 char reason[MAX_REASON_LENGTH];
338} serverBan_t;
339
340//=============================================================================
341
342extern serverStatic_t svs; // persistant server info across maps
343extern server_t sv; // cleared each map
344extern game_export_t *ge; // game exports
345
346extern cvar_t *sv_fps;
347extern cvar_t *sv_timeout;
348extern cvar_t *sv_zombietime;
349extern cvar_t *sv_rconPassword;
350extern cvar_t *sv_privatePassword;
351extern cvar_t *sv_allowDownload;
352extern cvar_t *sv_maxclients;
353
354extern cvar_t *sv_privateClients;
355extern cvar_t *sv_hostname;
356extern cvar_t *sv_master[MAX_MASTER_SERVERS];
357extern cvar_t *sv_reconnectlimit;
358extern cvar_t *sv_showloss;
359extern cvar_t *sv_padPackets;
360extern cvar_t *sv_killserver;
361extern cvar_t *sv_mapname;
362extern cvar_t *sv_mapChecksum;
363extern cvar_t *sv_serverid;
364extern cvar_t *sv_minRate;
365extern cvar_t *sv_maxRate;
366extern cvar_t *sv_dlRate;
367extern cvar_t *sv_minPing;
368extern cvar_t *sv_maxPing;
369extern cvar_t *g_gametype;
370extern cvar_t *g_gametypestring;
371extern cvar_t *sv_pure;
372extern cvar_t *sv_floodProtect;
373extern cvar_t *sv_lanForceRate;
374extern cvar_t *sv_maplist;
375extern cvar_t *sv_drawentities;
376extern cvar_t *sv_deeptracedebug;
377extern cvar_t *sv_netprofile;
378extern cvar_t *sv_netprofileoverlay;
379extern cvar_t *sv_netoptimize;
380extern cvar_t *sv_netoptimize_vistime;
381extern cvar_t *g_netoptimize;
382extern cvar_t *sv_chatter;
383extern cvar_t *sv_gamename;
384extern cvar_t *sv_location;
385extern cvar_t *sv_debug_gamespy;
386extern cvar_t *sv_gamespy;
387#ifndef STANDALONE
388extern cvar_t *sv_strictAuth;
389#endif
390extern cvar_t *sv_banFile;
391
392extern cvar_t *sv_logContext;
393
394extern serverBan_t serverBans[SERVER_MAXBANS];
395extern int serverBansCount;
396
397#ifdef USE_VOIP
398extern cvar_t *sv_voip;
399extern cvar_t *sv_voipProtocol;
400#endif
401
402
403//===========================================================
404
405//
406// sv_main.c
407//
408typedef struct leakyBucket_s leakyBucket_t;
410 netadrtype_t type;
411
412 union {
413 byte _4[4];
414 byte _6[16];
415 } ipv;
416
417 int lastTime;
418 signed char burst;
419
420 long hash;
421
422 leakyBucket_t *prev, *next;
423};
424
425extern leakyBucket_t outboundLeakyBucket;
426
427qboolean SVC_RateLimit( leakyBucket_t *bucket, int burst, int period );
428qboolean SVC_RateLimitAddress( netadr_t from, int burst, int period );
429
430void SV_FinalMessage (const char *message);
431void QDECL SV_SendServerCommand( client_t *cl, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
432
433
434void SV_AddOperatorCommands (void);
435void SV_RemoveOperatorCommands (void);
436
437
438void SV_MasterHeartbeat (void);
439void SV_MasterShutdown (void);
440int SV_RateMsec(client_t *client);
441
442void SV_PrintfClient(int clientNum, const char *fmt, ...);
443
444void SV_ArchiveHudDrawElements( qboolean loading );
445void SV_HudDrawShader( int iInfo, const char *name );
446void SV_HudDrawAlign( int iInfo, int iHorizontalAlign, int iVerticalAlign );
447void SV_HudDrawRect( int iInfo, int iX, int iY, int iWidth, int iHeight );
448void SV_HudDrawVirtualSize( int iInfo, qboolean bVirtualScreen );
449void SV_HudDrawColor( int iInfo, vec3_t vColor );
450void SV_HudDrawAlpha( int iInfo, float alpha );
451void SV_HudDrawString( int iInfo, const char *string );
452void SV_HudDrawFont( int iInfo, const char *name );
453void SV_ArchiveViewModelAnimation( qboolean loading /* 0x8 */ );
454void SV_ArchiveStopwatch( qboolean loading );
455void SV_ArchivePersistantFile( qboolean loading );
456void SV_ArchiveLevel( qboolean loading );
457qboolean SV_ArchiveLevelFile( qboolean loading, qboolean autosave );
458void S_Save( fileHandle_t f );
459void S_Load( fileHandle_t f );
460qboolean SV_ArchiveServerFile( qboolean loading, qboolean autosave );
461void SV_Loadgame_f( void );
462void SV_SavegameFilename( const char *name, char *fileName, int length );
463qboolean SV_AllowSaveGame( void );
464qboolean SV_DoSaveGame();
465void SV_SaveGame( const char *gamename, qboolean autosave );
466void SV_Savegame_f( void );
467void SV_Autosavegame_f( void );
468
469//
470// sv_init.c
471//
472void SV_ClearSvsTimeFixups( void );
473void SV_FinishSvsTimeFixups( void );
474void SV_AddSvsTimeFixup( int *piTime );
475void SV_SetConfigstring( int index, const char *val );
476char *SV_GetConfigstring( int index );
477int SV_FindIndex( const char *name, int start, int max, qboolean create );
478int SV_ModelIndex( const char *name );
479void SV_ClearModel( int index );
480int SV_SoundIndex( const char *name, qboolean streamed );
481int SV_ImageIndex( const char *name );
482int SV_ItemIndex( const char *name );
483void SV_SetLightStyle( int index, const char *data );
484void SV_UpdateConfigstrings( client_t *client );
485
486void SV_SetUserinfo( int index, const char *val );
487void SV_GetUserinfo( int index, char *buffer, int bufferSize );
488
489int SV_NumClients(void);
490void SV_ChangeMaxClients( void );
491void SV_SpawnServer( const char *server, qboolean loadgame, qboolean restart, qboolean bTransition );
492
493// Added in OPM
494int SV_PVSSoundIndex(const char* name, qboolean streamed);
495void SV_HandleNonPVSSound();
496
497void SV_ApplyOriginalConfigTweaks();
498
499
500//
501// sv_client.c
502//
503challenge_t* FindChallenge(netadr_t from, qboolean connecting);
504void SV_GetChallenge(netadr_t from);
505
506void SV_DirectConnect( netadr_t from );
507
508void SV_AuthorizeIpPacket( netadr_t from );
509
510void SV_ExecuteClientMessage( client_t *cl, msg_t *msg );
511void SV_UserinfoChanged( client_t *cl );
512
513void SV_ClientEnterWorld( client_t *client, usercmd_t *cmd );
514void SV_FreeClient(client_t *client);
515void SV_DropClient( client_t *drop, const char *reason );
516
517void SV_ExecuteClientCommand( client_t *cl, const char *s, qboolean clientOK );
518void SV_ClientThink (client_t *cl, usercmd_t *cmd);
519
520int SV_WriteDownloadToClient(client_t *cl , msg_t *msg);
521int SV_SendDownloadMessages(void);
522int SV_SendQueuedMessages(void);
523
524
525//
526// sv_ccmds.c
527//
528void SV_Heartbeat_f( void );
529
530//
531// sv_snapshot.c
532//
533void SV_InitRadar();
534void SV_AddServerCommand( client_t *client, const char *cmd );
535void SV_UpdateServerCommandsToClient( client_t *client, msg_t *msg );
536void SV_WriteFrameToClient (client_t *client, msg_t *msg);
537void SV_SendMessageToClient( msg_t *msg, client_t *client );
538void SV_SendClientMessages( void );
539void SV_SendClientSnapshot( client_t *client );
540qboolean SV_IsValidSnapshotClient(client_t* client);
541
542//
543// sv_game.c
544//
545extern debugline_t* DebugLines;
546extern int numDebugLines;
547extern debugstring_t* DebugStrings;
548extern int numDebugStrings;
549
550void SV_ClearModelUserCounts( void );
551int SV_NumForGentity( gentity_t *ent );
552gentity_t *SV_GentityNum( int num );
553playerState_t *SV_GameClientNum( int num );
554svEntity_t *SV_SvEntityForGentity( gentity_t *gEnt );
555gentity_t *SV_GEntityForSvEntity( svEntity_t *svEnt );
556void SV_InitGameProgs ( void );
557void SV_ShutdownGameProgs ( void );
558qboolean SV_inPVS (const vec3_t p1, const vec3_t p2);
559// su44: MoHAA game -> cgame messages
560void SV_WriteCGMToClient (client_t *client, msg_t *msg);
561void SV_InitAllCGMessages ();
562
563//
564// sv_snd.c
565//
566void SV_ClientSound(client_t* client, vec3_t* org, int entnum, int channel, int sound_index, float volume, float mindist, float pitch, float maxdist, qboolean streamed);
567void SV_Sound( vec3_t *org, int entnum, int channel, const char *sound_name, float volume, float mindist, float pitch, float maxdist, qboolean streamed );
568void SV_ClearSounds( client_t *client );
569void SV_StopSound( int entnum, int channel );
570
571//============================================================
572//
573// high level object sorting to reduce interaction tests
574//
575
576void SV_ClearWorld (void);
577// called after the world model has been loaded, before linking any entities
578
579void SV_UnlinkEntity( gentity_t *ent );
580// call before removing an entity, and before trying to move one,
581// so it doesn't clip against itself
582
583void SV_LinkEntity( gentity_t *ent );
584// Needs to be called any time an entity changes origin, mins, maxs,
585// or solid. Automatically unlinks if needed.
586// sets ent->r.absmin and ent->r.absmax
587// sets ent->leafnums[] for pvs determination even if the entity
588// is not solid
589
590
591clipHandle_t SV_ClipHandleForEntity( const gentity_t *ent );
592
593
594void SV_SectorList_f( void );
595
596
597int SV_AreaEntities( const vec3_t mins, const vec3_t maxs, int *entityList, int maxcount );
598// fills in a table of entity numbers with entities that have bounding boxes
599// that intersect the given area. It is possible for a non-axial bmodel
600// to be returned that doesn't actually intersect the area on an exact
601// test.
602// returns the number of pointers filled in
603// The world entity is never returned in this list.
604
605baseshader_t *SV_GetShaderPointer( int iShaderNum );
606int SV_PointContents( const vec3_t p, int passEntityNum );
607// returns the CONTENTS_* value from the world and all entities at the given point.
608
609qboolean SV_SightTraceEntity( gentity_t *touch, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int contentmask, qboolean cylinder );
610qboolean SV_SightTrace( const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int passEntityNum2, int contentmask, qboolean cylinder );
611qboolean SV_HitEntity(gentity_t* pEnt, gentity_t* pOther);
612void SV_Trace( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask, qboolean cylinder, qboolean traceDeep );
613void SV_TraceDeep( trace_t *results, const vec3_t vStart, const vec3_t vEnd, int iBrushMask, gentity_t *touch );
614// mins and maxs are relative
615
616// if the entire move stays in a solid volume, trace.allsolid will be set,
617// trace.startsolid will be set, and trace.fraction will be 0
618
619// if the starting point is in a solid, it will be allowed to move out
620// to an open area
621
622// passEntityNum is explicitly excluded from clipping checks (normally ENTITYNUM_NONE)
623
624
625void SV_ClipToEntity( trace_t *trace, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int entityNum, int contentmask );
626// clip to a specific entity
627
628//
629// sv_net_chan.c
630//
631void SV_Netchan_Transmit( client_t *client, msg_t *msg);
632int SV_Netchan_TransmitNextFragment( client_t *client );
633qboolean SV_Netchan_Process( client_t *client, msg_t *msg );
634void SV_Netchan_FreeQueue(client_t *client);
635void SV_NET_OutOfBandPrint(netprofclient_t* netprof, netadr_t adr, const char* format, ...);
636void SV_NET_UpdateClientNetProfileInfo(netprofclient_t* netprofile, int rate);
637void SV_NET_UpdateAllNetProfileInfo();
638void SV_NET_CalcTotalNetProfile(netprofclient_t* netprofile, qboolean server);
639
640#ifdef __cplusplus
641}
642#endif
Definition server.h:261
Definition server.h:114
Definition server.h:145
Definition cm_local.h:74
Definition q_shared.h:2095
Definition q_shared.h:2105
Definition server.h:409
Definition qcommon.h:225
Definition server.h:136
Definition qcommon.h:272
Definition qcommon.h:342
Definition server.h:280
Definition server.h:332
Definition server.h:286
Definition server.h:79
Definition snd_local_new.h:55
Definition server.h:60
Definition q_shared.h:1452
Definition sv_world.c:61