|
|
1.1.1.4 ! root 1: /* ! 2: Copyright (C) 1997-2001 Id Software, Inc. ! 3: ! 4: This program is free software; you can redistribute it and/or ! 5: modify it under the terms of the GNU General Public License ! 6: as published by the Free Software Foundation; either version 2 ! 7: of the License, or (at your option) any later version. ! 8: ! 9: This program is distributed in the hope that it will be useful, ! 10: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! 12: ! 13: See the GNU General Public License for more details. ! 14: ! 15: You should have received a copy of the GNU General Public License ! 16: along with this program; if not, write to the Free Software ! 17: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ! 18: ! 19: */ 1.1 root 20: // server.h 21: 22: 23: //define PARANOID // speed sapping error checking 24: 25: #include "../qcommon/qcommon.h" 26: #include "../game/game.h" 27: 28: //============================================================================= 29: 30: #define MAX_MASTERS 8 // max recipients for heartbeat packets 31: 32: typedef enum { 33: ss_dead, // no map loaded 34: ss_loading, // spawning level edicts 35: ss_game, // actively running 36: ss_cinematic, 37: ss_demo, 38: ss_pic 39: } server_state_t; 40: // some qc commands are only valid before the server has finished 41: // initializing (precache commands, static sounds / objects, etc) 42: 43: typedef struct 44: { 45: server_state_t state; // precache commands are only valid during load 46: 47: qboolean attractloop; // running cinematics and demos for the local system only 48: qboolean loadgame; // client begins should reuse existing entity 49: 1.1.1.2 root 50: unsigned time; // always sv.framenum * 100 msec 1.1 root 51: int framenum; 52: 53: char name[MAX_QPATH]; // map name, or cinematic name 54: struct cmodel_s *models[MAX_MODELS]; 55: 56: char configstrings[MAX_CONFIGSTRINGS][MAX_QPATH]; 57: entity_state_t baselines[MAX_EDICTS]; 58: 59: // the multicast buffer is used to send a message to a set of clients 60: // it is only used to marshall data until SV_Multicast is called 61: sizebuf_t multicast; 62: byte multicast_buf[MAX_MSGLEN]; 63: 64: // demo server information 65: FILE *demofile; 66: qboolean timedemo; // don't time sync 67: } server_t; 68: 69: #define EDICT_NUM(n) ((edict_t *)((byte *)ge->edicts + ge->edict_size*(n))) 70: #define NUM_FOR_EDICT(e) ( ((byte *)(e)-(byte *)ge->edicts ) / ge->edict_size) 71: 72: 73: typedef enum 74: { 75: cs_free, // can be reused for a new connection 76: cs_zombie, // client has been disconnected, but don't reuse 77: // connection for a couple seconds 78: cs_connected, // has been assigned to a client_t, but not in game yet 79: cs_spawned // client is fully in game 80: } client_state_t; 81: 82: typedef struct 83: { 84: int areabytes; 85: byte areabits[MAX_MAP_AREAS/8]; // portalarea visibility bits 86: player_state_t ps; 87: int num_entities; 88: int first_entity; // into the circular sv_packet_entities[] 1.1.1.2 root 89: int senttime; // for ping calculations 1.1 root 90: } client_frame_t; 91: 92: #define LATENCY_COUNTS 16 93: #define RATE_MESSAGES 10 94: 95: typedef struct client_s 96: { 97: client_state_t state; 98: 99: char userinfo[MAX_INFO_STRING]; // name, etc 100: 101: int lastframe; // for delta compression 102: usercmd_t lastcmd; // for filling in big drops 103: 104: int commandMsec; // every seconds this is reset, if user 105: // commands exhaust it, assume time cheating 106: 107: int frame_latency[LATENCY_COUNTS]; 108: int ping; 109: 110: int message_size[RATE_MESSAGES]; // used to rate drop packets 111: int rate; 112: int surpressCount; // number of messages rate supressed 113: 114: edict_t *edict; // EDICT_NUM(clientnum+1) 115: char name[32]; // extracted from userinfo, high bits masked 116: int messagelevel; // for filtering printed messages 117: 118: // The datagram is written to by sound calls, prints, temp ents, etc. 119: // It can be harmlessly overflowed. 120: sizebuf_t datagram; 121: byte datagram_buf[MAX_MSGLEN]; 122: 123: client_frame_t frames[UPDATE_BACKUP]; // updates can be delta'd from here 124: 125: byte *download; // file being downloaded 126: int downloadsize; // total bytes (can't use EOF because of paks) 127: int downloadcount; // bytes sent 128: 129: int lastmessage; // sv.framenum when packet was last received 130: int lastconnect; 131: 1.1.1.2 root 132: int challenge; // challenge of this user, randomly generated 133: 1.1 root 134: netchan_t netchan; 135: } client_t; 136: 137: // a client can leave the server in one of four ways: 138: // dropping properly by quiting or disconnecting 139: // timing out if no valid messages are received for timeout.value seconds 140: // getting kicked off by the server operator 141: // a program error, like an overflowed reliable buffer 142: 143: //============================================================================= 144: 145: // MAX_CHALLENGES is made large to prevent a denial 146: // of service attack that could cycle all of them 147: // out before legitimate users connected 148: #define MAX_CHALLENGES 1024 149: 150: typedef struct 151: { 152: netadr_t adr; 153: int challenge; 154: int time; 155: } challenge_t; 156: 157: 158: typedef struct 159: { 160: qboolean initialized; // sv_init has completed 1.1.1.2 root 161: int realtime; // always increasing, no clamping, etc 1.1 root 162: 163: char mapcmd[MAX_TOKEN_CHARS]; // ie: *intro.cin+base 164: 165: int spawncount; // incremented each server start 166: // used to check late spawns 167: 168: client_t *clients; // [maxclients->value]; 169: int num_client_entities; // maxclients->value*UPDATE_BACKUP*MAX_PACKET_ENTITIES 170: int next_client_entities; // next client_entity to use 171: entity_state_t *client_entities; // [num_client_entities] 172: 173: int last_heartbeat; 174: 175: challenge_t challenges[MAX_CHALLENGES]; // to prevent invalid IPs from connecting 176: 177: // serverrecord values 178: FILE *demofile; 179: sizebuf_t demo_multicast; 180: byte demo_multicast_buf[MAX_MSGLEN]; 181: } server_static_t; 182: 183: //============================================================================= 184: 185: extern netadr_t net_from; 186: extern sizebuf_t net_message; 187: 188: extern netadr_t master_adr[MAX_MASTERS]; // address of the master server 189: 190: extern server_static_t svs; // persistant server info 191: extern server_t sv; // local server 192: 193: extern cvar_t *sv_paused; 194: extern cvar_t *maxclients; 195: extern cvar_t *sv_noreload; // don't reload level state when reentering 1.1.1.3 root 196: extern cvar_t *sv_airaccelerate; // don't reload level state when reentering 1.1 root 197: // development tool 198: extern cvar_t *sv_enforcetime; 199: 200: extern client_t *sv_client; 201: extern edict_t *sv_player; 202: 203: //=========================================================== 204: 205: // 206: // sv_main.c 207: // 208: void SV_FinalMessage (char *message, qboolean reconnect); 209: void SV_DropClient (client_t *drop); 210: 211: int SV_ModelIndex (char *name); 212: int SV_SoundIndex (char *name); 213: int SV_ImageIndex (char *name); 214: 215: void SV_WriteClientdataToMessage (client_t *client, sizebuf_t *msg); 216: 217: void SV_ExecuteUserCommand (char *s); 218: void SV_InitOperatorCommands (void); 219: 220: void SV_SendServerinfo (client_t *client); 221: void SV_UserinfoChanged (client_t *cl); 222: 223: 224: void Master_Heartbeat (void); 225: void Master_Packet (void); 226: 227: // 228: // sv_init.c 229: // 230: void SV_InitGame (void); 231: void SV_Map (qboolean attractloop, char *levelstring, qboolean loadgame); 232: 233: 234: // 235: // sv_phys.c 236: // 237: void SV_PrepWorldFrame (void); 238: 239: // 240: // sv_send.c 241: // 242: typedef enum {RD_NONE, RD_CLIENT, RD_PACKET} redirect_t; 243: #define SV_OUTPUTBUF_LENGTH (MAX_MSGLEN - 16) 244: 245: extern char sv_outputbuf[SV_OUTPUTBUF_LENGTH]; 246: 247: void SV_FlushRedirect (int sv_redirected, char *outputbuf); 248: 249: void SV_DemoCompleted (void); 250: void SV_SendClientMessages (void); 251: 252: void SV_Multicast (vec3_t origin, multicast_t to); 253: void SV_StartSound (vec3_t origin, edict_t *entity, int channel, 254: int soundindex, float volume, 255: float attenuation, float timeofs); 256: void SV_ClientPrintf (client_t *cl, int level, char *fmt, ...); 257: void SV_BroadcastPrintf (int level, char *fmt, ...); 258: void SV_BroadcastCommand (char *fmt, ...); 259: 260: // 261: // sv_user.c 262: // 263: void SV_Nextserver (void); 264: void SV_ExecuteClientMessage (client_t *cl); 265: 266: // 267: // sv_ccmds.c 268: // 269: void SV_ReadLevelFile (void); 270: void SV_Status_f (void); 271: 272: // 273: // sv_ents.c 274: // 275: void SV_WriteFrameToClient (client_t *client, sizebuf_t *msg); 276: void SV_RecordDemoMessage (void); 277: void SV_BuildClientFrame (client_t *client); 278: 279: 280: void SV_Error (char *error, ...); 281: 282: // 283: // sv_game.c 284: // 285: extern game_export_t *ge; 286: 287: void SV_InitGameProgs (void); 288: void SV_ShutdownGameProgs (void); 289: void SV_InitEdict (edict_t *e); 290: 291: 292: 293: //============================================================ 294: 295: // 296: // high level object sorting to reduce interaction tests 297: // 298: 299: void SV_ClearWorld (void); 300: // called after the world model has been loaded, before linking any entities 301: 302: void SV_UnlinkEdict (edict_t *ent); 303: // call before removing an entity, and before trying to move one, 304: // so it doesn't clip against itself 305: 306: void SV_LinkEdict (edict_t *ent); 307: // Needs to be called any time an entity changes origin, mins, maxs, 308: // or solid. Automatically unlinks if needed. 309: // sets ent->v.absmin and ent->v.absmax 310: // sets ent->leafnums[] for pvs determination even if the entity 311: // is not solid 312: 313: int SV_AreaEdicts (vec3_t mins, vec3_t maxs, edict_t **list, int maxcount, int areatype); 314: // fills in a table of edict pointers with edicts that have bounding boxes 315: // that intersect the given area. It is possible for a non-axial bmodel 316: // to be returned that doesn't actually intersect the area on an exact 317: // test. 318: // returns the number of pointers filled in 1.1.1.2 root 319: // ??? does this always return the world? 1.1 root 320: 321: //=================================================================== 322: 323: // 324: // functions that interact with everything apropriate 325: // 326: int SV_PointContents (vec3_t p); 327: // returns the CONTENTS_* value from the world at the given point. 328: // Quake 2 extends this to also check entities, to allow moving liquids 329: 330: 331: trace_t SV_Trace (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passedict, int contentmask); 332: // mins and maxs are relative 333: 334: // if the entire move stays in a solid volume, trace.allsolid will be set, 335: // trace.startsolid will be set, and trace.fraction will be 0 336: 337: // if the starting point is in a solid, it will be allowed to move out 338: // to an open area 339: 340: // passedict is explicitly excluded from clipping checks (normally NULL) 341:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.