Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions inc/common/msg.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ typedef struct {
uint8_t fov;
uint8_t rdflags;
int16_t stats[MAX_STATS_NEW];
int16_t betterspec_vangles[3][3];
} player_packed_t;

typedef enum {
Expand Down
1 change: 1 addition & 0 deletions inc/common/protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@ typedef enum {
#define AQPS_PMFLAGS BIT(0)
#define AQPS_TIMESTAMP BIT(1)
#define AQPS_LEGHITS BIT(2)
#define AQPS_BETTERSPEC BIT(3)


//==============================================
Expand Down
6 changes: 6 additions & 0 deletions inc/shared/shared.h
Original file line number Diff line number Diff line change
Expand Up @@ -1763,6 +1763,9 @@ typedef struct {
int rdflags; // refdef flags

short stats[MAX_STATS_OLD]; // fast status bar updates
#ifdef AQTION_EXTENSION
vec3_t betterspec_vangles[3];
#endif
} player_state_old_t;

#if USE_NEW_GAME_API
Expand Down Expand Up @@ -1791,6 +1794,9 @@ typedef struct {
int reserved[4];

int16_t stats[MAX_STATS_NEW]; // fast status bar updates
#ifdef AQTION_EXTENSION
vec3_t betterspec_vangles[3];
#endif
} player_state_new_t;
#endif

Expand Down
27 changes: 27 additions & 0 deletions src/action/p_antilag.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,3 +171,30 @@ void antilag_unmove_all(void)
gi.linkentity(who);
}
}

void betterspec_serverframe(edict_t *ent)
{
//ended up being unused
}

void betterspec_clientframe(edict_t *ent)
{
gclient_t *client = ent->client;
if (ent->client->chase_target)
UpdateChaseCam(ent); //make chasecam less glitchly, still not perfect
float advanced_since_svframe = client->antilag_state.curr_timestamp - level.time + FRAMETIME;
advanced_since_svframe *= 1000;
if (advanced_since_svframe <= 0) return;
int index = -1;
if (advanced_since_svframe <= 25) {
index = 0;
}
else if (advanced_since_svframe <= 50) {
index = 1;
}
else if (advanced_since_svframe <= 75) {
index = 2;
}
if (index == -1) return;
VectorCopy(client->ps.viewangles, client->ps.betterspec_vangles[index]);
}
2 changes: 2 additions & 0 deletions src/action/p_antilag.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ extern cvar_t *sv_antilag_interp;
void antilag_update(edict_t *ent);
void antilag_rewind_all(edict_t *ent);
void antilag_unmove_all(void);
void betterspec_serverframe(edict_t *ent);
void betterspec_clientframe(edict_t *ent);



Expand Down
9 changes: 7 additions & 2 deletions src/action/p_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -3886,6 +3886,7 @@ void ClientThink(edict_t * ent, usercmd_t * ucmd)
client = ent->client;

client->antilag_state.curr_timestamp += (float)ucmd->msec / 1000; // antilag needs sub-server-frame timestamps
betterspec_clientframe(ent);

if (level.intermission_framenum) {
client->ps.pmove.pm_type = PM_FREEZE;
Expand Down Expand Up @@ -6129,9 +6130,13 @@ void ClientBeginServerFrame(edict_t * ent)

client = ent->client;

if (sv_antilag->value) // if sv_antilag is enabled, we want to track our player position for later reference
//if (sv_antilag->value) // if sv_antilag is enabled, we want to track our player position for later reference
//mikota: leave the update on always
//we still check if it's enabled during the actual rollback
//but I need the antilag states to be updated always
//for betterspec
antilag_update(ent);

betterspec_serverframe(ent);
//PaTMaN's jmod
if(jump->value) {
if ((client->resp.toggle_lca) && (client->pers.spectator))
Expand Down
2 changes: 2 additions & 0 deletions src/client/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,8 @@ extern cvar_t *cl_rollhack;
extern cvar_t *cl_noglow;
extern cvar_t *cl_nobob;
extern cvar_t *cl_nolerp;
extern cvar_t *cl_betterspec_vangles;


//STEPSOUND
extern cvar_t *cl_enhanced_footsteps;
Expand Down
32 changes: 28 additions & 4 deletions src/client/entities.c
Original file line number Diff line number Diff line change
Expand Up @@ -1388,14 +1388,14 @@ void CL_CalcViewValues(void)
}

} else {
int i;
// just use interpolated values
for (i = 0; i < 3; i++) {
for (int i = 0; i < 3; i++) {
cl.refdef.vieworg[i] = SHORT2COORD(ops->pmove.origin[i] +
lerp * (ps->pmove.origin[i] - ops->pmove.origin[i]));
}

#if USE_FPS
LerpVector(keyops->viewoffset, keyps->viewoffset, cl.keylerpfrac, viewoffset);
LerpVector(keyops->viewoffset, keyps->viewoffset, cl.keylerpfrac, viewoffset);
#else
LerpVector(ops->viewoffset, ps->viewoffset, lerp, viewoffset);
#endif
Expand Down Expand Up @@ -1427,7 +1427,31 @@ void CL_CalcViewValues(void)
#endif
} else {
// just use interpolated values
LerpAngles(ops->viewangles, ps->viewangles, lerp, cl.refdef.viewangles);
//betterspec sends 3 additional viewangle values
//to bypass the 10hz restriction.
//spectating viewangles become more accurate
//old lerping:
//OLD ----------------------------> NEW
//new lerping:
//OLD -> BS[0] -> BS[1] -> BS[2] -> NEW
qboolean highfps_server = false; //don't want to do this on high sv_fps servers
#if USE_FPS
if (cl.lerpfrac != cl.keylerpfrac) //idk how else to detect it
highfps_server = true;
#endif
if (highfps_server || VectorEmpty(ps->betterspec_vangles[0]) || cl_betterspec_vangles->integer == 0)
LerpAngles(ops->viewangles, ps->viewangles, lerp, cl.refdef.viewangles);
else {
if (lerp < 0.25) {
LerpAngles(ops->viewangles, ps->betterspec_vangles[0], lerp * 4, cl.refdef.viewangles);
} else if (lerp < 0.5) {
LerpAngles(ps->betterspec_vangles[0], ps->betterspec_vangles[1], (lerp - 0.25) * 4, cl.refdef.viewangles);
} else if (lerp < 0.75) {
LerpAngles(ps->betterspec_vangles[1], ps->betterspec_vangles[2], (lerp - 0.5) * 4, cl.refdef.viewangles);
} else {
LerpAngles(ps->betterspec_vangles[2], ps->viewangles, (lerp - 0.75) * 4, cl.refdef.viewangles);
}
}
}

// don't interpolate blend color
Expand Down
1 change: 1 addition & 0 deletions src/client/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ cvar_t *cl_rollhack;
cvar_t *cl_noglow;
cvar_t *cl_nobob;
cvar_t *cl_nolerp;
cvar_t *cl_betterspec_vangles;

#if USE_DEBUG
cvar_t *cl_shownet;
Expand Down
2 changes: 2 additions & 0 deletions src/client/screen.c
Original file line number Diff line number Diff line change
Expand Up @@ -1401,6 +1401,8 @@ void SCR_Init(void)
xhair_elasticity = Cvar_Get("xhair_elasticity","1",0);
xhair_enabled = Cvar_Get("xhair_enabled","0",0);

cl_betterspec_vangles = Cvar_Get("cl_betterspec_vangles", "1", 0);

r_maxfps = Cvar_Get("r_maxfps","0",0);

ch_health = Cvar_Get("ch_health", "0", 0);
Expand Down
37 changes: 35 additions & 2 deletions src/common/msg.c
Original file line number Diff line number Diff line change
Expand Up @@ -851,7 +851,8 @@ void MSG_PackPlayerOld(player_packed_t *out, const player_state_old_t *in)
PACK_OFFSET(out->kick_angles, in->kick_angles);
PACK_OFFSET(out->gunoffset, in->gunoffset);
PACK_OFFSET(out->gunangles, in->gunangles);

for(int i=0; i<3; i++)
PACK_ANGLES(out->betterspec_vangles[i], in->betterspec_vangles[i]);
out->gunindex = in->gunindex;
out->gunframe = in->gunframe;
PACK_BLEND(out->blend, in->blend);
Expand All @@ -871,7 +872,9 @@ void MSG_PackPlayerNew(player_packed_t *out, const player_state_new_t *in)
PACK_OFFSET(out->kick_angles, in->kick_angles);
PACK_OFFSET(out->gunoffset, in->gunoffset);
PACK_OFFSET(out->gunangles, in->gunangles);

for(int i=0; i<3; i++) {
PACK_ANGLES(out->betterspec_vangles[i], in->betterspec_vangles[i]);
}
out->gunindex = in->gunindex;
out->gunframe = in->gunframe;
PACK_BLEND(out->blend, in->blend);
Expand Down Expand Up @@ -1428,6 +1431,13 @@ int MSG_WriteDeltaPlayerstate_Aqtion(const player_packed_t *from,

if (from->viewangles[2] != to->viewangles[2])
eflags |= EPS_VIEWANGLE2;
#ifdef AQTION_EXTENSION
//betterspec makes chasecam glitchy, but
//I don't know how to pass this info from game
//to the server :<
//if (chase_mode == 2)
aqtflags |= AQPS_BETTERSPEC;
#endif
}
else {
// save previous state
Expand Down Expand Up @@ -1574,6 +1584,12 @@ int MSG_WriteDeltaPlayerstate_Aqtion(const player_packed_t *from,
MSG_WriteShort(to->pmove.pm_timestamp);
if (aqtflags & AQPS_LEGHITS)
MSG_WriteByte(to->pmove.pm_aq2_leghits);
if (aqtflags & AQPS_BETTERSPEC) {
for(int i=0; i<3; i++) {
for (int j=0; j<3; j++)
MSG_WriteShort(to->betterspec_vangles[i][j]);
}
}
#endif

//
Expand Down Expand Up @@ -2952,6 +2968,14 @@ void MSG_ParseDeltaPlayerstate_Aqtion(const player_state_t *from,

if (aqtflags & AQPS_LEGHITS)
to->pmove.pm_aq2_leghits = MSG_ReadByte();

if (aqtflags & AQPS_BETTERSPEC) {
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
to->betterspec_vangles[i][j] = MSG_ReadAngle16();
}
}
}
#else
aqtflags = MSG_ReadByte();

Expand All @@ -2963,6 +2987,15 @@ void MSG_ParseDeltaPlayerstate_Aqtion(const player_state_t *from,

if (aqtflags & AQPS_LEGHITS)
MSG_ReadByte();

if (aqtflags & AQPS_BETTERSPEC) {
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
MSG_ReadShort();
}
}
}

#endif

//
Expand Down
Loading
Loading