diff options
Diffstat (limited to 'source/sv_local.h')
-rw-r--r-- | source/sv_local.h | 304 |
1 files changed, 155 insertions, 149 deletions
diff --git a/source/sv_local.h b/source/sv_local.h index 224dc87..f4cfaf9 100644 --- a/source/sv_local.h +++ b/source/sv_local.h @@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // server.h -//define PARANOID // speed sapping error checking +//define PARANOID // speed sapping error checking #include "com_local.h" #include "q_list.h" @@ -45,31 +45,31 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. //============================================================================= -#define MAX_MASTERS 8 // max recipients for heartbeat packets -#define HEARTBEAT_SECONDS 300 +#define MAX_MASTERS 8 // max recipients for heartbeat packets +#define HEARTBEAT_SECONDS 300 #define SV_Malloc( size ) Z_TagMalloc( size, TAG_SERVER ) #define SV_Mallocz( size ) Z_TagMallocz( size, TAG_SERVER ) -#define SV_CopyString( s ) Z_TagCopyString( s, TAG_SERVER ) +#define SV_CopyString( s ) Z_TagCopyString( s, TAG_SERVER ) -#define SV_BASELINES_SHIFT 6 -#define SV_BASELINES_PER_CHUNK ( 1 << SV_BASELINES_SHIFT ) -#define SV_BASELINES_MASK ( SV_BASELINES_PER_CHUNK - 1 ) -#define SV_BASELINES_CHUNKS ( MAX_EDICTS >> SV_BASELINES_SHIFT ) +#define SV_BASELINES_SHIFT 6 +#define SV_BASELINES_PER_CHUNK ( 1 << SV_BASELINES_SHIFT ) +#define SV_BASELINES_MASK ( SV_BASELINES_PER_CHUNK - 1 ) +#define SV_BASELINES_CHUNKS ( MAX_EDICTS >> SV_BASELINES_SHIFT ) #define SV_InfoSet( var, val ) \ - Cvar_FullSet( var, val, CVAR_SERVERINFO|CVAR_ROM, CVAR_SET_DIRECT ) + Cvar_FullSet( var, val, CVAR_SERVERINFO|CVAR_ROM, CVAR_SET_DIRECT ) // game features this server supports #define SV_FEATURES (GMF_CLIENTNUM|GMF_PROPERINUSE|GMF_MVDSPEC|GMF_WANT_ALL_DISCONNECTS) typedef struct { - unsigned numEntities; - unsigned firstEntity; + unsigned numEntities; + unsigned firstEntity; player_state_t ps; - int areabytes; - byte areabits[MAX_MAP_AREAS/8]; // portalarea visibility bits - unsigned sentTime; // for ping calculations + int areabytes; + byte areabits[MAX_MAP_AREAS/8]; // portalarea visibility bits + unsigned sentTime; // for ping calculations int clientNum; } client_frame_t; @@ -77,21 +77,28 @@ typedef struct { int solid32; } server_entity_t; +#define SV_FPS 10 +#define SV_FRAMETIME 100 + typedef struct { - server_state_t state; // precache commands are only valid during load - int spawncount; // random number generated each server spawn + server_state_t state; // precache commands are only valid during load + int spawncount; // random number generated each server spawn - int framenum; - unsigned frametime; + int framenum; +#if 0 + int framemult; // 0 or 1 + unsigned frametime; // 100 or 50 +#endif + unsigned frameresidual; - char name[MAX_QPATH]; // map name, or cinematic name - cm_t cm; + char name[MAX_QPATH]; // map name, or cinematic name + cm_t cm; - char configstrings[MAX_CONFIGSTRINGS][MAX_QPATH]; + char configstrings[MAX_CONFIGSTRINGS][MAX_QPATH]; server_entity_t entities[MAX_EDICTS]; - unsigned tracecount; + unsigned tracecount; } server_t; #define EDICT_POOL(c,n) ((edict_t *)((byte *)(c)->pool->edicts + (c)->pool->edict_size*(n))) @@ -99,16 +106,16 @@ typedef struct { #define EDICT_NUM(n) ((edict_t *)((byte *)ge->edicts + ge->edict_size*(n))) #define NUM_FOR_EDICT(e) ( ((byte *)(e)-(byte *)ge->edicts ) / ge->edict_size) -#define MAX_TOTAL_ENT_LEAFS 128 +#define MAX_TOTAL_ENT_LEAFS 128 typedef enum { - cs_free, // can be reused for a new connection - cs_zombie, // client has been disconnected, but don't reuse - // connection for a couple seconds + cs_free, // can be reused for a new connection + cs_zombie, // client has been disconnected, but don't reuse + // connection for a couple seconds cs_assigned, // client_t assigned, but no data received from client yet - cs_connected, // netchan fully established, but not in game yet - cs_primed, // sent serverdata, client is precaching - cs_spawned // client is fully in game + cs_connected, // netchan fully established, but not in game yet + cs_primed, // sent serverdata, client is precaching + cs_spawned // client is fully in game } clstate_t; #if USE_AC_SERVER @@ -127,19 +134,19 @@ typedef enum { #endif // USE_AC_SERVER -#define MSG_POOLSIZE 1024 -#define MSG_TRESHOLD ( 64 - 10 ) // keep pmsg_s 64 bytes aligned +#define MSG_POOLSIZE 1024 +#define MSG_TRESHOLD ( 64 - 10 ) // keep pmsg_s 64 bytes aligned -#define MSG_RELIABLE 1 -#define MSG_CLEAR 2 +#define MSG_RELIABLE 1 +#define MSG_CLEAR 2 #define MAX_SOUND_PACKET 14 typedef struct { - list_t entry; - uint16_t cursize; // zero means sound packet + list_t entry; + uint16_t cursize; // zero means sound packet union { - uint8_t data[MSG_TRESHOLD]; + uint8_t data[MSG_TRESHOLD]; struct { uint8_t flags; uint8_t index; @@ -147,16 +154,16 @@ typedef struct { uint8_t volume; uint8_t attenuation; uint8_t timeofs; - int16_t pos[3]; // saved in case entity is freed + int16_t pos[3]; // saved in case entity is freed }; }; } message_packet_t; -#define LATENCY_COUNTS 16 -#define LATENCY_MASK ( LATENCY_COUNTS - 1 ) +#define LATENCY_COUNTS 16 +#define LATENCY_MASK ( LATENCY_COUNTS - 1 ) -#define RATE_MESSAGES 10 +#define RATE_MESSAGES 10 #define FOR_EACH_CLIENT( client ) \ LIST_FOR_EACH( client_t, client, &svs.udp_client_list, entry ) @@ -172,66 +179,66 @@ typedef enum { typedef struct client_s { list_t entry; - clstate_t state; + clstate_t state; client_flags_t flags; - char userinfo[MAX_INFO_STRING]; // name, etc - char *versionString; + char userinfo[MAX_INFO_STRING]; // name, etc + char *versionString; char reconnect_var[16]; char reconnect_val[16]; - int lastframe; // for delta compression - usercmd_t lastcmd; // for filling in big drops + int lastframe; // for delta compression + usercmd_t lastcmd; // for filling in big drops - int commandMsec; // every seconds this is reset, if user - // commands exhaust it, assume time cheating + int commandMsec; // every seconds this is reset, if user + // commands exhaust it, assume time cheating int numMoves; int fps; - int frame_latency[LATENCY_COUNTS]; - int ping, min_ping, max_ping; + int frame_latency[LATENCY_COUNTS]; + int ping, min_ping, max_ping; int avg_ping_time, avg_ping_count; - size_t message_size[RATE_MESSAGES]; // used to rate drop packets - size_t rate; - int surpressCount; // number of messages rate supressed - unsigned send_time, send_delta; // used to rate drop async packets + size_t message_size[RATE_MESSAGES]; // used to rate drop packets + size_t rate; + int surpressCount; // number of messages rate supressed + unsigned send_time, send_delta; // used to rate drop async packets frameflags_t frameflags; - edict_t *edict; // EDICT_NUM(clientnum+1) - char name[MAX_CLIENT_NAME]; // extracted from userinfo, + edict_t *edict; // EDICT_NUM(clientnum+1) + char name[MAX_CLIENT_NAME]; // extracted from userinfo, // high bits masked - int messagelevel; // for filtering printed messages - int number; // client slot number + int messagelevel; // for filtering printed messages + int number; // client slot number - clientSetting_t settings[CLS_MAX]; + clientSetting_t settings[CLS_MAX]; - client_frame_t frames[UPDATE_BACKUP]; // updates can be delta'd from here + client_frame_t frames[UPDATE_BACKUP]; // updates can be delta'd from here unsigned frames_sent, frames_acked; - byte *download; // file being downloaded - int downloadsize; // total bytes (can't use EOF because of paks) - int downloadcount; // bytes sent + byte *download; // file being downloaded + int downloadsize; // total bytes (can't use EOF because of paks) + int downloadcount; // bytes sent char *downloadname; // name of the file - unsigned lastmessage; // svs.realtime when packet was last received + unsigned lastmessage; // svs.realtime when packet was last received - int challenge; // challenge of this user, randomly generated - int protocol; // major version + int challenge; // challenge of this user, randomly generated + int protocol; // major version int version; // minor version time_t connect_time; // spectator speed, etc - pmoveParams_t pmp; + pmoveParams_t pmp; // packetized messages - list_t msg_free_list; - list_t msg_unreliable_list; - list_t msg_reliable_list; - message_packet_t *msg_pool; + list_t msg_free_list; + list_t msg_unreliable_list; + list_t msg_reliable_list; + message_packet_t *msg_pool; size_t msg_unreliable_bytes; // total size of unreliable datagram size_t msg_dynamic_bytes; // total size of dynamic memory allocated @@ -248,11 +255,11 @@ typedef struct client_s { int maxclients; // netchan type dependent methods - void (*AddMessage)( struct client_s *, byte *, size_t, qboolean ); - void (*WriteFrame)( struct client_s * ); - void (*WriteDatagram)( struct client_s * ); + void (*AddMessage)( struct client_s *, byte *, size_t, qboolean ); + void (*WriteFrame)( struct client_s * ); + void (*WriteDatagram)( struct client_s * ); - netchan_t *netchan; + netchan_t *netchan; int numpackets; // for that nasty packetdup hack #if USE_AC_SERVER @@ -278,23 +285,23 @@ typedef struct client_s { // MAX_CHALLENGES is made large to prevent a denial // of service attack that could cycle all of them // out before legitimate users connected -#define MAX_CHALLENGES 1024 +#define MAX_CHALLENGES 1024 typedef struct { - netadr_t adr; - unsigned challenge; - unsigned time; + netadr_t adr; + unsigned challenge; + unsigned time; } challenge_t; typedef struct { - unsigned limit; - unsigned period; - unsigned time; - unsigned count; + unsigned limit; + unsigned period; + unsigned time; + unsigned count; } ratelimit_t; typedef struct { - list_t entry; + list_t entry; uint32_t addr; uint32_t mask; unsigned hits; @@ -302,9 +309,9 @@ typedef struct { } addrmatch_t; typedef struct { - list_t entry; - int len; - char string[1]; + list_t entry; + int len; + char string[1]; } stuffcmd_t; typedef enum { @@ -317,97 +324,97 @@ typedef enum { } filteraction_t; typedef struct { - list_t entry; - filteraction_t action; - char *comment; - char string[1]; + list_t entry; + filteraction_t action; + char *comment; + char string[1]; } filtercmd_t; typedef struct server_static_s { - qboolean initialized; // sv_init has completed - unsigned realtime; // always increasing, no clamping, etc + qboolean initialized; // sv_init has completed + unsigned realtime; // always increasing, no clamping, etc - client_t *udp_client_pool; // [maxclients] - list_t udp_client_list; // linked list of non-free clients + client_t *udp_client_pool; // [maxclients] + list_t udp_client_list; // linked list of non-free clients - unsigned numEntityStates; // maxclients*UPDATE_BACKUP*MAX_PACKET_ENTITIES - unsigned nextEntityStates; // next entityState to use - entity_state_t *entityStates; // [numEntityStates] + unsigned numEntityStates; // maxclients*UPDATE_BACKUP*MAX_PACKET_ENTITIES + unsigned nextEntityStates; // next entityState to use + entity_state_t *entityStates; // [numEntityStates] #if USE_ZLIB z_stream z; // for compressing messages at once #endif - unsigned last_heartbeat; + unsigned last_heartbeat; - ratelimit_t ratelimit_status; - ratelimit_t ratelimit_badpass; - ratelimit_t ratelimit_badrcon; + ratelimit_t ratelimit_status; + ratelimit_t ratelimit_badpass; + ratelimit_t ratelimit_badrcon; - challenge_t challenges[MAX_CHALLENGES]; // to prevent invalid IPs from connecting + challenge_t challenges[MAX_CHALLENGES]; // to prevent invalid IPs from connecting } server_static_t; //============================================================================= -extern netadr_t master_adr[MAX_MASTERS]; // address of the master server +extern netadr_t master_adr[MAX_MASTERS]; // address of the master server -extern list_t sv_banlist; -extern list_t sv_blacklist; +extern list_t sv_banlist; +extern list_t sv_blacklist; -extern list_t sv_cmdlist_connect; -extern list_t sv_cmdlist_begin; +extern list_t sv_cmdlist_connect; +extern list_t sv_cmdlist_begin; -extern list_t sv_filterlist; +extern list_t sv_filterlist; -extern server_static_t svs; // persistant server info -extern server_t sv; // local server +extern server_static_t svs; // persistant server info +extern server_t sv; // local server -extern pmoveParams_t sv_pmp; +extern pmoveParams_t sv_pmp; - -extern cvar_t *sv_hostname; -extern cvar_t *sv_maxclients; -extern cvar_t *sv_password; -extern cvar_t *sv_reserved_slots; -extern cvar_t *sv_airaccelerate; // development tool -extern cvar_t *sv_qwmod; // atu QW Physics modificator -extern cvar_t *sv_enforcetime; -extern cvar_t *sv_force_reconnect; -extern cvar_t *sv_iplimit; - -//extern cvar_t *sv_console_auth; +extern cvar_t *sv_hostname; +extern cvar_t *sv_maxclients; +extern cvar_t *sv_password; +extern cvar_t *sv_reserved_slots; +extern cvar_t *sv_airaccelerate; // development tool +extern cvar_t *sv_qwmod; // atu QW Physics modificator +extern cvar_t *sv_enforcetime; +#if USE_FPS +extern cvar_t *sv_fps; +#endif +extern cvar_t *sv_force_reconnect; +extern cvar_t *sv_iplimit; #if USE_CLIENT -extern cvar_t *sv_debug_send; -extern cvar_t *sv_pad_packets; +extern cvar_t *sv_debug_send; +extern cvar_t *sv_pad_packets; #endif -extern cvar_t *sv_lan_force_rate; -extern cvar_t *sv_calcpings_method; -extern cvar_t *sv_changemapcmd; +extern cvar_t *sv_novis; +extern cvar_t *sv_lan_force_rate; +extern cvar_t *sv_calcpings_method; +extern cvar_t *sv_changemapcmd; -extern cvar_t *sv_strafejump_hack; +extern cvar_t *sv_strafejump_hack; #ifndef _WIN32 -extern cvar_t *sv_oldgame_hack; +extern cvar_t *sv_oldgame_hack; #endif #if USE_PACKETDUP -extern cvar_t *sv_packetdup_hack; +extern cvar_t *sv_packetdup_hack; #endif -extern cvar_t *sv_allow_map; +extern cvar_t *sv_allow_map; -extern cvar_t *sv_status_limit; -extern cvar_t *sv_status_show; -extern cvar_t *sv_badauth_time; -extern cvar_t *sv_uptime; +extern cvar_t *sv_status_limit; +extern cvar_t *sv_status_show; +extern cvar_t *sv_badauth_time; +extern cvar_t *sv_uptime; extern cvar_t *g_features; extern cvar_t *sv_timeout; extern cvar_t *sv_zombietime; -extern cvar_t *sv_ghostime; - -extern client_t *sv_client; -extern edict_t *sv_player; +extern cvar_t *sv_ghostime; +extern client_t *sv_client; +extern edict_t *sv_player; //=========================================================== @@ -450,12 +457,12 @@ void SV_ClientReset( client_t *client ); // sv_send.c // typedef enum {RD_NONE, RD_CLIENT, RD_PACKET} redirect_t; -#define SV_OUTPUTBUF_LENGTH (MAX_PACKETLEN_DEFAULT - 16) +#define SV_OUTPUTBUF_LENGTH (MAX_PACKETLEN_DEFAULT - 16) #define SV_BeginRedirect( target ) \ - Com_BeginRedirect( target, sv_outputbuf, SV_OUTPUTBUF_LENGTH, SV_FlushRedirect ) + Com_BeginRedirect( target, sv_outputbuf, SV_OUTPUTBUF_LENGTH, SV_FlushRedirect ) -extern char sv_outputbuf[SV_OUTPUTBUF_LENGTH]; +extern char sv_outputbuf[SV_OUTPUTBUF_LENGTH]; void SV_FlushRedirect( int redirected, char *outputbuf, size_t len ); @@ -470,7 +477,6 @@ void SV_BroadcastCommand( const char *fmt, ... ) q_printf( 1, 2 ); void SV_ClientAddMessage( client_t *client, int flags ); void SV_ShutdownClientSend( client_t *client ); void SV_InitClientSend( client_t *newcl ); -void SV_CalcSendTime( client_t *client, size_t messageSize ); #if USE_MVD_SERVER @@ -492,8 +498,8 @@ void SV_MvdMulticast( int leafnum, multicast_t to ); void SV_MvdConfigstring( int index, const char *string, size_t len ); void SV_MvdBroadcastPrint( int level, const char *string ); void SV_MvdStartSound( int entnum, int channel, int flags, - int soundindex, int volume, - int attenuation, int timeofs ); + int soundindex, int volume, + int attenuation, int timeofs ); #endif // USE_MVD_SERVER #if USE_AC_SERVER @@ -539,7 +545,7 @@ client_t *SV_EnhancedSetPlayer( char *s ); // #define ES_INUSE( s ) \ - ( (s)->modelindex || (s)->effects || (s)->sound || (s)->event ) + ( (s)->modelindex || (s)->effects || (s)->sound || (s)->event ) void SV_BuildProxyClientFrame( client_t *client ); void SV_BuildClientFrame( client_t *client ); @@ -550,7 +556,7 @@ qboolean SV_EdictPV( cm_t *cm, edict_t *ent, byte *mask ); // // sv_game.c // -extern game_export_t *ge; +extern game_export_t *ge; void SV_InitGameProgs( void ); void SV_ShutdownGameProgs (void); @@ -601,7 +607,7 @@ typedef trace_t (*sv_trace_t)( vec3_t, vec3_t, vec3_t, vec3_t, edict_t *, int ); trace_t SV_Trace_Native (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passedict, int contentmask); trace_t *SV_Trace (trace_t *trace, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, - edict_t *passedict, int contentmask); + edict_t *passedict, int contentmask); // mins and maxs are relative // if the entire move stays in a solid volume, trace.allsolid will be set, |