]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - client.h
no longer sends moves if time is not moving forward, except when paused (this fixes...
[xonotic/darkplaces.git] / client.h
index df05ea43df18387ea5a081bf68796e19cebce478..01d443301dc1563a7aa43f22fe80a03ac4ca4f5e 100644 (file)
--- a/client.h
+++ b/client.h
@@ -27,6 +27,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 // LordHavoc: 256 dynamic lights
 #define MAX_DLIGHTS 256
 
+// this is the maximum number of input packets that can be lost without a
+// misprediction
+#define CL_MAX_USERCMDS 16
+
 // flags for rtlight rendering
 #define LIGHTFLAG_NORMALMODE 1
 #define LIGHTFLAG_REALTIMEMODE 2
@@ -274,8 +278,6 @@ entity_render_t;
 
 typedef struct entity_persistent_s
 {
-       int linkframe;
-
        vec3_t trail_origin;
 
        // particle trail
@@ -300,7 +302,6 @@ entity_persistent_t;
 
 typedef struct entity_s
 {
-       qboolean csqc;
        // baseline state (default values)
        entity_state_t state_baseline;
        // previous state (interpolating from this)
@@ -335,6 +336,7 @@ typedef struct usercmd_s
 
        double time;
        double receivetime;
+       int msec; // for qw moves
        int buttons;
        int impulse;
        int sequence;
@@ -483,10 +485,12 @@ typedef struct client_static_s
        int td_startframe;
        // realtime at second frame of timedemo (LordHavoc: changed to double)
        double td_starttime;
-       // LordHavoc: for measuring maxfps
-       double td_minframetime;
-       // LordHavoc: for measuring minfps
-       double td_maxframetime;
+       double td_onesecondnexttime;
+       double td_onesecondframes;
+       double td_onesecondminframes;
+       double td_onesecondmaxframes;
+       double td_onesecondavgframes;
+       int td_onesecondavgcount;
        // LordHavoc: pausedemo
        qboolean demopaused;
 
@@ -567,18 +571,6 @@ typedef struct
        qboolean drawcrosshair;
 }csqc_vidvars_t;
 
-typedef struct qw_usercmd_s
-{
-       vec3_t angles;
-       short forwardmove, sidemove, upmove;
-       unsigned char padding1[2];
-       unsigned char msec;
-       unsigned char buttons;
-       unsigned char impulse;
-       unsigned char padding2;
-}
-qw_usercmd_t;
-
 typedef enum
 {
        PARTICLE_BILLBOARD = 0,
@@ -652,15 +644,13 @@ typedef struct client_state_s
        // true if playing in a local game and no one else is connected
        int islocalgame;
 
-       // when connecting to the server throw out the first couple move messages
-       // so the player doesn't accidentally do something the first frame
-       int movemessages;
-
        // send a clc_nop periodically until connected
        float sendnoptime;
 
-       // current input to send to the server
+       // current input being accumulated by mouse/joystick/etc input
        usercmd_t cmd;
+       // latest moves sent to the server that have not been confirmed yet
+       usercmd_t movecmd[CL_MAX_USERCMDS];
 
 // information for local display
        // health, etc
@@ -713,10 +703,8 @@ typedef struct client_state_s
        // this is set true by svc_time parsing and causes a new movement to be
        // queued for prediction purposes
        qboolean movement_needupdate;
-       // indicates the queue has been updated and should be replayed
-       qboolean movement_replay;
        // timestamps of latest two predicted moves for interpolation
-       double movement_time[2];
+       double movement_time[4];
        // simulated data (this is valid even if cl.movement is false)
        vec3_t movement_origin;
        vec3_t movement_oldorigin;
@@ -763,6 +751,12 @@ typedef struct client_state_s
        // the timestamp of the last two messages
        double mtime[2];
 
+       // similar to cl.time but this can go past cl.mtime[0] when packets are
+       // not being received, it is still clamped to the cl.mtime[1] to
+       // cl.mtime[0] range whenever a packet is received, it just does not stop
+       // when interpolation finishes
+       double timenonlerp;
+
        // clients view of time, time should be between mtime[0] and mtime[1] to
        // generate a lerp point for other data, oldtime is the previous frame's
        // value of time, frametime is the difference between time and oldtime
@@ -852,7 +846,6 @@ typedef struct client_state_s
        vec3_t playercrouchmaxs;
 
        int max_entities;
-       int max_csqcentities;
        int max_static_entities;
        int max_temp_entities;
        int max_effects;
@@ -863,9 +856,7 @@ typedef struct client_state_s
        int max_particles;
 
        entity_t *entities;
-       entity_t *csqcentities; //[515]: csqc
        unsigned char *entities_active;
-       unsigned char *csqcentities_active;     //[515]: csqc
        entity_t *static_entities;
        entity_t *temp_entities;
        cl_effect_t *effects;
@@ -876,7 +867,6 @@ typedef struct client_state_s
        particle_t *particles;
 
        int num_entities;
-       int num_csqcentities;   //[515]: csqc
        int num_static_entities;
        int num_temp_entities;
        int num_brushmodel_entities;
@@ -944,8 +934,6 @@ typedef struct client_state_s
 
        int qw_validsequence;
 
-       qw_usercmd_t qw_moves[QW_UPDATE_BACKUP];
-
        int qw_deltasequence[QW_UPDATE_BACKUP];
 }
 client_state_t;
@@ -1026,6 +1014,7 @@ void CL_Disconnect (void);
 void CL_Disconnect_f (void);
 
 void CL_UpdateRenderEntity(entity_render_t *ent);
+void CL_UpdateEntities(void);
 
 //
 // cl_input
@@ -1191,6 +1180,10 @@ void CL_MoveParticles(void);
 void R_MoveExplosions(void);
 void R_NewExplosion(const vec3_t org);
 
+void Debug_PolygonBegin(const char *picname, int flags, qboolean draw2d, float linewidth);
+void Debug_PolygonVertex(float x, float y, float z, float s, float t, float r, float g, float b, float a);
+void Debug_PolygonEnd(void);
+
 #include "cl_screen.h"
 
 extern qboolean sb_showscores;