X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=server.h;h=02d3786bb6319ec8450539e9695b7d15f69bb472;hp=6a19f1b78bfe705f7fd49a635b10aa4aa648fe7d;hb=7c62e71683de5672379f033664504eb10d431544;hpb=0fc162a49cab157331b3e338cfb08cc2249834a0 diff --git a/server.h b/server.h index 6a19f1b7..02d3786b 100644 --- a/server.h +++ b/server.h @@ -31,7 +31,7 @@ typedef struct server_static_s /// episode completion information int serverflags; /// cleared when at SV_SpawnServer - qboolean changelevel_issued; + qbool changelevel_issued; /// server infostring char serverinfo[MAX_SERVERINFO_STRING]; // performance data @@ -54,6 +54,11 @@ typedef struct server_static_s size_t csqc_progsize_deflated; unsigned char *csqc_progdata_deflated; + // independent server thread (when running client) + qbool threaded; // true if server is running on separate thread + qbool volatile threadstop; + void *threadmutex; + void *thread; } server_static_t; //============================================================================= @@ -61,24 +66,23 @@ typedef struct server_static_s typedef enum server_state_e {ss_loading, ss_active} server_state_t; #define MAX_CONNECTFLOODADDRESSES 16 -typedef struct server_connectfloodaddress_s +#define MAX_GETSTATUSFLOODADDRESSES 128 +typedef struct server_floodaddress_s { double lasttime; lhnetaddress_t address; } -server_connectfloodaddress_t; - -#define MAX_CLIENTNETWORKEYES 256 +server_floodaddress_t; typedef struct server_s { /// false if only a net client - qboolean active; + qbool active; - qboolean paused; + qbool paused; double pausedstart; /// handle connections specially - qboolean loadgame; + qbool loadgame; /// one of the PROTOCOL_ values protocolversion_t protocol; @@ -100,17 +104,20 @@ typedef struct server_s world_t world; /// map name - char name[64]; - /// maps/.bsp, for model_precache[0] - char modelname[64]; + char name[64]; // %s followed by entrance name + // variants of map name + char worldmessage[40]; // map title (not related to filename) + char worldbasename[MAX_QPATH]; // %s + char worldname[MAX_QPATH]; // maps/%s.bsp + char worldnamenoextension[MAX_QPATH]; // maps/%s struct model_s *worldmodel; // NULL terminated - // LordHavoc: precaches are now MAX_QPATH rather than a pointer + // LadyHavoc: precaches are now MAX_QPATH rather than a pointer // updated by SV_ModelIndex char model_precache[MAX_MODELS][MAX_QPATH]; struct model_s *models[MAX_MODELS]; // NULL terminated - // LordHavoc: precaches are now MAX_QPATH rather than a pointer + // LadyHavoc: precaches are now MAX_QPATH rather than a pointer // updated by SV_SoundIndex char sound_precache[MAX_SOUNDS][MAX_QPATH]; char lightstyles[MAX_LIGHTSTYLES][64]; @@ -125,17 +132,17 @@ typedef struct server_s unsigned char reliable_datagram_buf[NET_MAXMESSAGE]; sizebuf_t signon; - /// LordHavoc: increased signon message buffer from 8192 + /// LadyHavoc: increased signon message buffer from 8192 unsigned char signon_buf[NET_MAXMESSAGE]; /// connection flood blocking /// note this is in server_t rather than server_static_t so that it is /// reset on each map command (such as New Game in singleplayer) - server_connectfloodaddress_t connectfloodaddresses[MAX_CONNECTFLOODADDRESSES]; + server_floodaddress_t connectfloodaddresses[MAX_CONNECTFLOODADDRESSES]; + server_floodaddress_t getstatusfloodaddresses[MAX_GETSTATUSFLOODADDRESSES]; -#define SV_MAX_PARTICLEEFFECTNAME 256 - qboolean particleeffectnamesloaded; - char particleeffectname[SV_MAX_PARTICLEEFFECTNAME][MAX_QPATH]; + qbool particleeffectnamesloaded; + char particleeffectname[MAX_PARTICLEEFFECTNAME][MAX_QPATH]; int writeentitiestoclient_stats_culled_pvs; int writeentitiestoclient_stats_culled_trace; @@ -148,7 +155,7 @@ typedef struct server_s int writeentitiestoclient_numeyes; int writeentitiestoclient_pvsbytes; unsigned char writeentitiestoclient_pvs[MAX_MAP_LEAFS/8]; - entity_state_t writeentitiestoclient_sendstates[MAX_EDICTS]; + const entity_state_t *writeentitiestoclient_sendstates[MAX_EDICTS]; unsigned short writeentitiestoclient_csqcsendstates[MAX_EDICTS]; int numsendentities; @@ -163,7 +170,7 @@ typedef struct server_s unsigned char csqcentityversion[MAX_EDICTS]; // legacy } server_t; -#define NUM_CSQCENTITIES_PER_FRAME 1024 +#define NUM_CSQCENTITIES_PER_FRAME 256 typedef struct csqcentityframedb_s { int framenum; @@ -172,25 +179,29 @@ typedef struct csqcentityframedb_s int sendflags[NUM_CSQCENTITIES_PER_FRAME]; } csqcentityframedb_t; -// if defined this does ping smoothing, otherwise it does not -//#define NUM_PING_TIMES 16 - #define NUM_SPAWN_PARMS 16 typedef struct client_s { /// false = empty client slot - qboolean active; + qbool active; /// false = don't do ClientDisconnect on drop - qboolean clientconnectcalled; + qbool clientconnectcalled; + /// false = don't allow spawn + qbool prespawned; + /// false = don't allow begin + qbool spawned; /// false = don't send datagrams - qboolean spawned; + qbool begun; /// 1 = send svc_serverinfo and advance to 2, 2 doesn't send, then advances to 0 (allowing unlimited sending) when prespawn is received int sendsignon; /// requested rate in bytes per second int rate; + /// temporarily exceed rate by this amount of bytes + int rate_burstsize; + /// realtime this client connected double connecttime; @@ -200,7 +211,9 @@ typedef struct client_s /// communications handle netconn_t *netconnection; - int movesequence; + unsigned int movesequence; + signed char movement_count[NETGRAPH_PACKETS]; + unsigned int movement_highestsequence_seen; // not the same as movesequence if prediction is off /// movement usercmd_t cmd; /// intended motion calced from cmd @@ -209,12 +222,7 @@ typedef struct client_s /// PRVM_EDICT_NUM(clientnum+1) prvm_edict_t *edict; -#ifdef NUM_PING_TIMES - float ping_times[NUM_PING_TIMES]; - /// ping_times[num_pings%NUM_PING_TIMES] - int num_pings; -#endif - /// LordHavoc: can be used for prediction or whatever... + /// LadyHavoc: can be used for prediction or whatever... float ping; /// this is used by sv_clmovement_minping code @@ -223,10 +231,10 @@ typedef struct client_s float clmovement_inputtimeout; /// spawn parms are carried from level to level - float spawn_parms[NUM_SPAWN_PARMS]; + prvm_vec_t spawn_parms[NUM_SPAWN_PARMS]; // properties that are sent across the network only when changed - char name[64], old_name[64]; + char name[MAX_SCOREBOARDNAME], old_name[MAX_SCOREBOARDNAME]; int colors, old_colors; int frags, old_frags; char playermodel[MAX_QPATH], old_model[MAX_QPATH]; @@ -245,10 +253,10 @@ typedef struct client_s unsigned char csqcentityscope[MAX_EDICTS]; unsigned int csqcentitysendflags[MAX_EDICTS]; -#define NUM_CSQCENTITYDB_FRAMES 64 - unsigned char csqcentityglobalhistory[MAX_EDICTS]; // set to 1 if the entity was ever csqc networked to the client, and never reset back to 0 +#define NUM_CSQCENTITYDB_FRAMES 256 csqcentityframedb_t csqcentityframehistory[NUM_CSQCENTITYDB_FRAMES]; int csqcentityframehistory_next; + int csqcentityframe_lastreset; /// prevent animated names float nametime; @@ -279,12 +287,12 @@ typedef struct client_s // information on an active download if any qfile_t *download_file; int download_expectedposition; ///< next position the client should ack - qboolean download_started; + qbool download_started; char download_name[MAX_QPATH]; - qboolean download_deflate; + qbool download_deflate; // fixangle data - qboolean fixangle_angles_set; + qbool fixangle_angles_set; vec3_t fixangle_angles; /// demo recording @@ -293,6 +301,10 @@ typedef struct client_s // number of skipped entity frames // if it exceeds a limit, an empty entity frame is sent int num_skippedentityframes; + + // last sent move sequence + // if the move sequence changed, an empty entity frame is sent + unsigned int lastmovesequence; } client_t; @@ -314,6 +326,9 @@ typedef struct client_s #define MOVETYPE_FOLLOW 12 ///< track movement of aiment #define MOVETYPE_FAKEPUSH 13 ///< tenebrae's push that doesn't push #define MOVETYPE_PHYSICS 32 ///< indicates this object is physics controlled +#define MOVETYPE_FLY_WORLDONLY 33 ///< like MOVETYPE_FLY, but uses MOVE_WORLDONLY for all its traces; objects of this movetype better be SOLID_NOT or SOLID_TRIGGER please, or else... +#define MOVETYPE_USER_FIRST 128 ///< user defined movetypes +#define MOVETYPE_USER_LAST 191 // edict->solid values #define SOLID_NOT 0 ///< no interaction with other objects @@ -321,12 +336,15 @@ typedef struct client_s #define SOLID_BBOX 2 ///< touch on edge, block #define SOLID_SLIDEBOX 3 ///< touch on edge, but not an onground #define SOLID_BSP 4 ///< bsp clip, touch on edge, block -// LordHavoc: corpse code +// LadyHavoc: corpse code #define SOLID_CORPSE 5 ///< same as SOLID_BBOX, except it behaves as SOLID_NOT against SOLID_SLIDEBOX objects (players/monsters) -// LordHavoc: physics +// LadyHavoc: physics +// VorteX: now these fields are deprecated, as geomtype is more flexible #define SOLID_PHYSICS_BOX 32 ///< physics object (mins, maxs, mass, origin, axis_forward, axis_left, axis_up, velocity, spinvelocity) #define SOLID_PHYSICS_SPHERE 33 ///< physics object (mins, maxs, mass, origin, axis_forward, axis_left, axis_up, velocity, spinvelocity) #define SOLID_PHYSICS_CAPSULE 34 ///< physics object (mins, maxs, mass, origin, axis_forward, axis_left, axis_up, velocity, spinvelocity) +#define SOLID_PHYSICS_TRIMESH 35 ///< physics object (mins, maxs, mass, origin, axis_forward, axis_left, axis_up, velocity, spinvelocity) +#define SOLID_PHYSICS_CYLINDER 36 ///< physics object (mins, maxs, mass, origin, axis_forward, axis_left, axis_up, velocity, spinvelocity) // edict->deadflag values #define DEAD_NO 0 @@ -378,7 +396,7 @@ extern cvar_t scratch2; extern cvar_t scratch3; extern cvar_t scratch4; extern cvar_t skill; -extern cvar_t slowmo; +extern cvar_t host_timescale; extern cvar_t sv_accelerate; extern cvar_t sv_aim; extern cvar_t sv_airaccel_qw; @@ -387,7 +405,11 @@ extern cvar_t sv_airaccelerate; extern cvar_t sv_airstopaccelerate; extern cvar_t sv_airstrafeaccelerate; extern cvar_t sv_maxairstrafespeed; +extern cvar_t sv_airstrafeaccel_qw; extern cvar_t sv_aircontrol; +extern cvar_t sv_aircontrol_power; +extern cvar_t sv_aircontrol_penalty; +extern cvar_t sv_airspeedlimit_nonqw; extern cvar_t sv_allowdownloads; extern cvar_t sv_allowdownloads_archive; extern cvar_t sv_allowdownloads_config; @@ -413,7 +435,6 @@ extern cvar_t sv_debugmove; extern cvar_t sv_echobprint; extern cvar_t sv_edgefriction; extern cvar_t sv_entpatch; -extern cvar_t sv_fixedframeratesingleplayer; extern cvar_t sv_freezenonclients; extern cvar_t sv_friction; extern cvar_t sv_gameplayfix_blowupfallenzombies; @@ -429,12 +450,21 @@ extern cvar_t sv_gameplayfix_multiplethinksperframe; extern cvar_t sv_gameplayfix_noairborncorpse; extern cvar_t sv_gameplayfix_noairborncorpse_allowsuspendeditems; extern cvar_t sv_gameplayfix_nudgeoutofsolid; +extern cvar_t sv_gameplayfix_nudgeoutofsolid_separation; +extern cvar_t sv_gameplayfix_q2airaccelerate; +extern cvar_t sv_gameplayfix_nogravityonground; extern cvar_t sv_gameplayfix_setmodelrealbox; extern cvar_t sv_gameplayfix_slidemoveprojectiles; extern cvar_t sv_gameplayfix_stepdown; -extern cvar_t sv_gameplayfix_stepwhilejumping; +extern cvar_t sv_gameplayfix_stepmultipletimes; +extern cvar_t sv_gameplayfix_nostepmoveonsteepslopes; extern cvar_t sv_gameplayfix_swiminbmodels; extern cvar_t sv_gameplayfix_upwardvelocityclearsongroundflag; +extern cvar_t sv_gameplayfix_downtracesupportsongroundflag; +extern cvar_t sv_gameplayfix_q1bsptracelinereportstexture; +extern cvar_t sv_gameplayfix_unstickplayers; +extern cvar_t sv_gameplayfix_unstickentities; +extern cvar_t sv_gameplayfix_fixedcheckwatertransition; extern cvar_t sv_gravity; extern cvar_t sv_idealpitchscale; extern cvar_t sv_jumpstep; @@ -443,13 +473,12 @@ extern cvar_t sv_maxairspeed; extern cvar_t sv_maxrate; extern cvar_t sv_maxspeed; extern cvar_t sv_maxvelocity; -extern cvar_t sv_newflymove; extern cvar_t sv_nostep; extern cvar_t sv_playerphysicsqc; extern cvar_t sv_progs; extern cvar_t sv_protocolname; extern cvar_t sv_random_seed; -extern cvar_t sv_ratelimitlocalplayer; +extern cvar_t host_limitlocal; extern cvar_t sv_sound_land; extern cvar_t sv_sound_watersplash; extern cvar_t sv_stepheight; @@ -457,6 +486,7 @@ extern cvar_t sv_stopspeed; extern cvar_t sv_wallfriction; extern cvar_t sv_wateraccelerate; extern cvar_t sv_waterfriction; +extern cvar_t sv_areadebug; extern cvar_t sys_ticrate; extern cvar_t teamplay; extern cvar_t temp1; @@ -474,16 +504,22 @@ extern client_t *host_client; //=========================================================== void SV_Init (void); +double SV_Frame(double time); +void SV_Shutdown(void); + +int SV_IsLocalServer(void); void SV_StartParticle (vec3_t org, vec3_t dir, int color, int count); void SV_StartEffect (vec3_t org, int modelindex, int startframe, int framecount, int framerate); -void SV_StartSound (prvm_edict_t *entity, int channel, const char *sample, int volume, float attenuation); -void SV_StartPointSound (vec3_t origin, const char *sample, int volume, float attenuation); +void SV_StartSound (prvm_edict_t *entity, int channel, const char *sample, int volume, float attenuation, qbool reliable, float speed); +void SV_StartPointSound (vec3_t origin, const char *sample, int volume, float attenuation, float speed); void SV_ConnectClient (int clientnum, netconn_t *netconnection); -void SV_DropClient (qboolean crash); +void SV_DropClient (qbool leaving, const char *reason, ... ); + +void SV_ClientCommands(const char *fmt, ...) DP_FUNC_PRINTF(1); -void SV_SendClientMessages (void); +void SV_SendClientMessages(void); void SV_ReadClientMessage(void); @@ -496,11 +532,14 @@ int SV_SoundIndex(const char *s, int precachemode); int SV_ParticleEffectIndex(const char *name); +model_t *SV_GetModelByIndex(int modelindex); +model_t *SV_GetModelFromEdict(prvm_edict_t *ed); + void SV_SetIdealPitch (void); void SV_AddUpdates (void); -void SV_ClientThink (void); +void SV_PlayerPhysics (void); void SV_ClientPrint(const char *msg); void SV_ClientPrintf(const char *fmt, ...) DP_FUNC_PRINTF(1); @@ -511,9 +550,9 @@ void SV_Physics (void); void SV_Physics_ClientMove (void); //void SV_Physics_ClientEntity (prvm_edict_t *ent); -qboolean SV_PlayerCheckGround (prvm_edict_t *ent); -qboolean SV_CheckBottom (prvm_edict_t *ent); -qboolean SV_movestep (prvm_edict_t *ent, vec3_t move, qboolean relink, qboolean noenemy, qboolean settrace); +qbool SV_PlayerCheckGround (prvm_edict_t *ent); +qbool SV_CheckBottom (prvm_edict_t *ent); +qbool SV_movestep (prvm_edict_t *ent, vec3_t move, qbool relink, qbool noenemy, qbool settrace); /*! Needs to be called any time an entity changes origin, mins, maxs, or solid * sets ent->v.absmin and ent->v.absmax @@ -526,38 +565,67 @@ void SV_LinkEdict_TouchAreaGrid_Call(prvm_edict_t *touch, prvm_edict_t *ent); // /*! move an entity that is stuck by small amounts in various directions to try to nudge it back into the collision hull * returns true if it found a better place */ -qboolean SV_UnstickEntity (prvm_edict_t *ent); +qbool SV_UnstickEntity (prvm_edict_t *ent); +/*! move an entity that is stuck out of the surface it is stuck in (can move large amounts) + * returns true if it found a better place + */ +qbool SV_NudgeOutOfSolid(prvm_edict_t *ent); /// calculates hitsupercontentsmask for a generic qc entity int SV_GenericHitSuperContentsMask(const prvm_edict_t *edict); /// traces a box move against worldmodel and all entities in the specified area -trace_t SV_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask); -trace_t SV_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask); -trace_t SV_TracePoint(const vec3_t start, int type, prvm_edict_t *passedict, int hitsupercontentsmask); +trace_t SV_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend); +trace_t SV_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend); +trace_t SV_TracePoint(const vec3_t start, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask); +int SV_EntitiesInBox(const vec3_t mins, const vec3_t maxs, int maxedicts, prvm_edict_t **resultedicts); + +qbool SV_CanSeeBox(int numsamples, vec_t eyejitter, vec_t enlarge, vec_t entboxexpand, vec3_t eye, vec3_t entboxmins, vec3_t entboxmaxs); + +void SV_MarkWriteEntityStateToClient(entity_state_t *s); -qboolean SV_CanSeeBox(int numsamples, vec_t enlarge, vec3_t eye, vec3_t entboxmins, vec3_t entboxmaxs); +void SV_SendServerinfo(client_t *client); +void SV_WriteEntitiesToClient(client_t *client, prvm_edict_t *clent, sizebuf_t *msg, int maxsize); +void SV_AddCameraEyes(void); int SV_PointSuperContents(const vec3_t point); void SV_FlushBroadcastMessages(void); void SV_WriteClientdataToMessage (client_t *client, prvm_edict_t *ent, sizebuf_t *msg, int *stats); -void SV_MoveToGoal (void); +void VM_SV_MoveToGoal(prvm_prog_t *prog); void SV_ApplyClientMove (void); void SV_SaveSpawnparms (void); -void SV_SpawnServer (const char *server); + +void SV_SpawnServer (const char *map); void SV_CheckVelocity (prvm_edict_t *ent); void SV_SetupVM(void); -void SV_VM_Begin(void); -void SV_VM_End(void); +const char *SV_TimingReport(char *buf, size_t buflen); ///< for output in SV_Status_f -const char *Host_TimingReport(void); ///< for output in Host_Status_f +int SV_GetPitchSign(prvm_prog_t *prog, prvm_edict_t *ent); +void SV_GetEntityMatrix(prvm_prog_t *prog, prvm_edict_t *ent, matrix4x4_t *out, qbool viewmatrix); -int SV_GetPitchSign(prvm_edict_t *ent); +void SV_StartThread(void); +void SV_StopThread(void); +#define SV_LockThreadMutex() (void)(svs.threaded ? Thread_LockMutex(svs.threadmutex) : 0) +#define SV_UnlockThreadMutex() (void)(svs.threaded ? Thread_UnlockMutex(svs.threadmutex) : 0) -#endif +void VM_CustomStats_Clear(void); +void VM_SV_UpdateCustomStats(client_t *client, prvm_edict_t *ent, sizebuf_t *msg, int *stats); +void SV_Name(int clientnum); +void SV_InitOperatorCommands(void); +void SV_Savegame_to(prvm_prog_t *prog, const char *name); +void SV_Savegame_f(cmd_state_t *cmd); +void SV_Loadgame_f(cmd_state_t *cmd); + +void SV_PreSpawn_f(cmd_state_t *cmd); +void SV_Spawn_f(cmd_state_t *cmd); +void SV_Begin_f(cmd_state_t *cmd); + +qbool SV_VM_ConsoleCommand (const char *text); + +#endif