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
{
/// 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;
qboolean active;
/// false = don't do ClientDisconnect on drop
qboolean clientconnectcalled;
- /// false = don't send datagrams
+ /// false = don't allow spawn
+ qboolean prespawned;
+ /// false = don't allow begin
qboolean spawned;
+ /// false = don't send datagrams
+ qboolean 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;
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[MAX_SCOREBOARDNAME], old_name[MAX_SCOREBOARDNAME];
// 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
+ int lastmovesequence;
} client_t;
// LordHavoc: corpse code
#define SOLID_CORPSE 5 ///< same as SOLID_BBOX, except it behaves as SOLID_NOT against SOLID_SLIDEBOX objects (players/monsters)
// LordHavoc: 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)
void SV_ConnectClient (int clientnum, netconn_t *netconnection);
void SV_DropClient (qboolean crash);
-void SV_SendClientMessages (void);
+void SV_SendClientMessages(void);
void SV_ReadClientMessage(void);
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_SetupVM(void);
-void SV_VM_Begin(void);
-void SV_VM_End(void);
+const char *Host_TimingReport(char *buf, size_t buflen); ///< for output in Host_Status_f
-const char *Host_TimingReport(void); ///< for output in Host_Status_f
-
-int SV_GetPitchSign(prvm_edict_t *ent);
-void SV_GetEntityMatrix (prvm_edict_t *ent, matrix4x4_t *out, qboolean viewmatrix);
+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, qboolean viewmatrix);
void SV_StartThread(void);
void SV_StopThread(void);
-void SV_LockThreadMutex(void);
-void SV_UnlockThreadMutex(void);
+#define SV_LockThreadMutex() (void)(svs.threaded ? Thread_LockMutex(svs.threadmutex) : 0)
+#define SV_UnlockThreadMutex() (void)(svs.threaded ? Thread_UnlockMutex(svs.threadmutex) : 0)
+
+void VM_CustomStats_Clear(void);
+void VM_SV_UpdateCustomStats(client_t *client, prvm_edict_t *ent, sizebuf_t *msg, int *stats);
+void Host_Savegame_to(prvm_prog_t *prog, const char *name);
+void SV_SendServerinfo(client_t *client);
#endif