]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - server.h
com_list.h: Fix copy/paste oversight where List_For_Each_Entry went backwards like...
[xonotic/darkplaces.git] / server.h
index fdea10760234675d7e8d8c8b9e98105893f865da..07639e4b5f52c530fa71cc50e974fe12201fc95d 100644 (file)
--- 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,22 +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;
+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;
@@ -106,12 +112,12 @@ typedef struct server_s
        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];
@@ -126,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;
@@ -164,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;
@@ -173,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;
 
@@ -201,9 +211,9 @@ typedef struct client_s
        /// communications handle
        netconn_t *netconnection;
 
-       int movesequence;
+       unsigned int movesequence;
        signed char movement_count[NETGRAPH_PACKETS];
-       int movement_highestsequence_seen; // not the same as movesequence if prediction is off
+       unsigned int movement_highestsequence_seen; // not the same as movesequence if prediction is off
        /// movement
        usercmd_t cmd;
        /// intended motion calced from cmd
@@ -212,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
@@ -226,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];
@@ -248,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;
@@ -282,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
@@ -296,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;
 
 
@@ -317,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
@@ -324,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
@@ -381,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;
@@ -390,8 +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;
@@ -417,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;
@@ -428,21 +445,26 @@ extern cvar_t sv_gameplayfix_droptofloorstartsolid_nudgetocorrect;
 extern cvar_t sv_gameplayfix_easierwaterjump;
 extern cvar_t sv_gameplayfix_findradiusdistancetobox;
 extern cvar_t sv_gameplayfix_gravityunaffectedbyticrate;
-extern cvar_t sv_gameplayfix_nogravityonground;
 extern cvar_t sv_gameplayfix_grenadebouncedownslopes;
 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_bias;
+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;
@@ -456,7 +478,7 @@ 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;
@@ -464,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;
@@ -481,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 crash);
 
-void SV_SendClientMessages (void);
+void SV_ClientCommands(const char *fmt, ...) DP_FUNC_PRINTF(1);
+
+void SV_SendClientMessages(void);
 
 void SV_ReadClientMessage(void);
 
@@ -503,14 +532,14 @@ int SV_SoundIndex(const char *s, int precachemode);
 
 int SV_ParticleEffectIndex(const char *name);
 
-dp_model_t *SV_GetModelByIndex(int modelindex);
-dp_model_t *SV_GetModelFromEdict(prvm_edict_t *ed);
+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);
@@ -521,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
@@ -536,39 +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_GetEntityMatrix (prvm_edict_t *ent, matrix4x4_t *out, qboolean viewmatrix);
+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