void G_StoreClientPosition( gentity_t* ent ) { int top; if(!G_AntilagSafe(ent)) return; ent->client->topMarker++; if ( ent->client->topMarker >= MAX_CLIENT_MARKERS ) { ent->client->topMarker = 0; } top = ent->client->topMarker; VectorCopy(ent->r.mins, ent->client->clientMarkers[top].mins); VectorCopy(ent->r.maxs, ent->client->clientMarkers[top].maxs); // change to trbase instead of origin, correct for client (use s!!) VectorCopy(ent->s.pos.trBase, ent->client->clientMarkers[top].origin); ent->client->clientMarkers[top].time = level.time; //ent->client->clientMarkers[top].servertime = level.time; //josh: more info needed for head / leg shots // tjw: It seems that s.apos.trBase and ps.viewangles are in sync and // the only usable angles for determining the direction the client // is pointing. I don't know wtf r.currentAngles, // s.angles, and s.angles2 are for. // josh: maybe they were just copying the angle into every // angle they could think of just in case. VectorCopy(ent->s.apos.trBase, ent->client->clientMarkers[top].viewangles); ent->client->clientMarkers[top].eFlags = ent->s.eFlags; ent->client->clientMarkers[top].pm_flags = ent->client->ps.pm_flags; ent->client->clientMarkers[top].viewheight = ent->client->ps.viewheight; // forty - realistic hitboxes - Torso Markers ent->client->clientMarkers[top].torsoOldFrameModel = ent->torsoFrame.oldFrameModel; ent->client->clientMarkers[top].torsoFrameModel = ent->torsoFrame.frameModel; ent->client->clientMarkers[top].torsoOldFrame = ent->torsoFrame.oldFrame; ent->client->clientMarkers[top].torsoFrame = ent->torsoFrame.frame; ent->client->clientMarkers[top].torsoOldFrameTime = ent->torsoFrame.oldFrameTime; ent->client->clientMarkers[top].torsoFrameTime = ent->torsoFrame.frameTime; ent->client->clientMarkers[top].torsoYawAngle = ent->torsoFrame.yawAngle; ent->client->clientMarkers[top].torsoPitchAngle = ent->torsoFrame.pitchAngle; ent->client->clientMarkers[top].torsoYawing = ent->torsoFrame.yawing; ent->client->clientMarkers[top].torsoPitching = ent->torsoFrame.pitching; // forty - realistic hitboxes - Legs Markers ent->client->clientMarkers[top].legsOldFrameModel = ent->legsFrame.oldFrameModel; ent->client->clientMarkers[top].legsFrameModel = ent->legsFrame.frameModel; ent->client->clientMarkers[top].legsOldFrame = ent->legsFrame.oldFrame; ent->client->clientMarkers[top].legsFrame = ent->legsFrame.frame; ent->client->clientMarkers[top].legsOldFrameTime = ent->legsFrame.oldFrameTime; ent->client->clientMarkers[top].legsFrameTime = ent->legsFrame.frameTime; ent->client->clientMarkers[top].legsYawAngle = ent->legsFrame.yawAngle; ent->client->clientMarkers[top].legsPitchAngle = ent->legsFrame.pitchAngle; ent->client->clientMarkers[top].legsYawing = ent->legsFrame.yawing; ent->client->clientMarkers[top].legsPitching = ent->legsFrame.pitching; }
/** * @brief G_StoreClientPosition * @param[in,out] ent */ void G_StoreClientPosition(gentity_t *ent) { int top; if (!G_AntilagSafe(ent)) { return; } ent->client->topMarker++; if (ent->client->topMarker >= MAX_CLIENT_MARKERS) { ent->client->topMarker = 0; } top = ent->client->topMarker; VectorCopy(ent->r.mins, ent->client->clientMarkers[top].mins); VectorCopy(ent->r.maxs, ent->client->clientMarkers[top].maxs); VectorCopy(ent->s.pos.trBase, ent->client->clientMarkers[top].origin); ent->client->clientMarkers[top].time = level.time; // store all angles & frame info VectorCopy(ent->s.apos.trBase, ent->client->clientMarkers[top].viewangles); ent->client->clientMarkers[top].eFlags = ent->s.eFlags; ent->client->clientMarkers[top].pm_flags = ent->client->ps.pm_flags; ent->client->clientMarkers[top].viewheight = ent->client->ps.viewheight; // Torso Markers ent->client->clientMarkers[top].torsoOldFrameModel = ent->torsoFrame.oldFrameModel; ent->client->clientMarkers[top].torsoFrameModel = ent->torsoFrame.frameModel; ent->client->clientMarkers[top].torsoOldFrame = ent->torsoFrame.oldFrame; ent->client->clientMarkers[top].torsoFrame = ent->torsoFrame.frame; ent->client->clientMarkers[top].torsoOldFrameTime = ent->torsoFrame.oldFrameTime; ent->client->clientMarkers[top].torsoFrameTime = ent->torsoFrame.frameTime; ent->client->clientMarkers[top].torsoYawAngle = ent->torsoFrame.yawAngle; ent->client->clientMarkers[top].torsoPitchAngle = ent->torsoFrame.pitchAngle; ent->client->clientMarkers[top].torsoYawing = ent->torsoFrame.yawing; ent->client->clientMarkers[top].torsoPitching = ent->torsoFrame.pitching; // Legs Markers ent->client->clientMarkers[top].legsOldFrameModel = ent->legsFrame.oldFrameModel; ent->client->clientMarkers[top].legsFrameModel = ent->legsFrame.frameModel; ent->client->clientMarkers[top].legsOldFrame = ent->legsFrame.oldFrame; ent->client->clientMarkers[top].legsFrame = ent->legsFrame.frame; ent->client->clientMarkers[top].legsOldFrameTime = ent->legsFrame.oldFrameTime; ent->client->clientMarkers[top].legsFrameTime = ent->legsFrame.frameTime; ent->client->clientMarkers[top].legsYawAngle = ent->legsFrame.yawAngle; ent->client->clientMarkers[top].legsPitchAngle = ent->legsFrame.pitchAngle; ent->client->clientMarkers[top].legsYawing = ent->legsFrame.yawing; ent->client->clientMarkers[top].legsPitching = ent->legsFrame.pitching; }
/** * @brief G_ReAdjustSingleClientPosition * @param[in,out] ent */ void G_ReAdjustSingleClientPosition(gentity_t *ent) { if (!G_AntilagSafe(ent)) { return; } // restore from backup if (ent->client->backupMarker.time == level.time) { VectorCopy(ent->client->backupMarker.origin, ent->r.currentOrigin); VectorCopy(ent->client->backupMarker.mins, ent->r.mins); VectorCopy(ent->client->backupMarker.maxs, ent->r.maxs); // Head, Legs stuff VectorCopy(ent->client->backupMarker.viewangles, ent->client->ps.viewangles); ent->client->ps.eFlags = ent->client->backupMarker.eFlags; ent->client->ps.pm_flags = ent->client->backupMarker.pm_flags; ent->client->ps.viewheight = ent->client->backupMarker.viewheight; ent->client->backupMarker.time = 0; // Torso Markers ent->torsoFrame.oldFrameModel = ent->client->backupMarker.torsoOldFrameModel; ent->torsoFrame.frameModel = ent->client->backupMarker.torsoFrameModel; ent->torsoFrame.oldFrame = ent->client->backupMarker.torsoOldFrame; ent->torsoFrame.frame = ent->client->backupMarker.torsoFrame; ent->torsoFrame.oldFrameTime = ent->client->backupMarker.torsoOldFrameTime; ent->torsoFrame.frameTime = ent->client->backupMarker.torsoFrameTime; ent->torsoFrame.yawAngle = ent->client->backupMarker.torsoYawAngle; ent->torsoFrame.pitchAngle = ent->client->backupMarker.torsoPitchAngle; ent->torsoFrame.yawing = ent->client->backupMarker.torsoYawing; ent->torsoFrame.pitching = ent->client->backupMarker.torsoPitching; // Legs Markers ent->legsFrame.oldFrameModel = ent->client->backupMarker.legsOldFrameModel; ent->legsFrame.frameModel = ent->client->backupMarker.legsFrameModel; ent->legsFrame.oldFrame = ent->client->backupMarker.legsOldFrame; ent->legsFrame.frame = ent->client->backupMarker.legsFrame; ent->legsFrame.oldFrameTime = ent->client->backupMarker.legsOldFrameTime; ent->legsFrame.frameTime = ent->client->backupMarker.legsFrameTime; ent->legsFrame.yawAngle = ent->client->backupMarker.legsYawAngle; ent->legsFrame.pitchAngle = ent->client->backupMarker.legsPitchAngle; // time stamp for BuildHead/Leg ent->timeShiftTime = 0; trap_LinkEntity(ent); } }
/** * @brief G_AdjustSingleClientPosition * @param[in,out] ent * @param[in] time */ static void G_AdjustSingleClientPosition(gentity_t *ent, int time) { int i, j; if (time > level.time) { time = level.time; } // no lerping forward.... if (!G_AntilagSafe(ent)) { return; } // find a pair of markers which bound the requested time i = j = ent->client->topMarker; do { if (ent->client->clientMarkers[i].time <= time) { break; } j = i; i--; if (i < 0) { i = MAX_CLIENT_MARKERS - 1; } } while (i != ent->client->topMarker); if (i == j) // oops, no valid stored markers { return; } // save current position to backup if (ent->client->backupMarker.time != level.time) { VectorCopy(ent->r.currentOrigin, ent->client->backupMarker.origin); VectorCopy(ent->r.mins, ent->client->backupMarker.mins); VectorCopy(ent->r.maxs, ent->client->backupMarker.maxs); // Head, Legs VectorCopy(ent->client->ps.viewangles, ent->client->backupMarker.viewangles); ent->client->backupMarker.eFlags = ent->client->ps.eFlags; ent->client->backupMarker.pm_flags = ent->client->ps.pm_flags; ent->client->backupMarker.viewheight = ent->client->ps.viewheight; ent->client->backupMarker.time = level.time; // Torso Markers ent->client->backupMarker.torsoOldFrameModel = ent->torsoFrame.oldFrameModel; ent->client->backupMarker.torsoFrameModel = ent->torsoFrame.frameModel; ent->client->backupMarker.torsoOldFrame = ent->torsoFrame.oldFrame; ent->client->backupMarker.torsoFrame = ent->torsoFrame.frame; ent->client->backupMarker.torsoOldFrameTime = ent->torsoFrame.oldFrameTime; ent->client->backupMarker.torsoFrameTime = ent->torsoFrame.frameTime; ent->client->backupMarker.torsoYawAngle = ent->torsoFrame.yawAngle; ent->client->backupMarker.torsoPitchAngle = ent->torsoFrame.pitchAngle; ent->client->backupMarker.torsoYawing = ent->torsoFrame.yawing; ent->client->backupMarker.torsoPitching = ent->torsoFrame.pitching; // Legs Markers ent->client->backupMarker.legsOldFrameModel = ent->legsFrame.oldFrameModel; ent->client->backupMarker.legsFrameModel = ent->legsFrame.frameModel; ent->client->backupMarker.legsOldFrame = ent->legsFrame.oldFrame; ent->client->backupMarker.legsFrame = ent->legsFrame.frame; ent->client->backupMarker.legsOldFrameTime = ent->legsFrame.oldFrameTime; ent->client->backupMarker.legsFrameTime = ent->legsFrame.frameTime; ent->client->backupMarker.legsYawAngle = ent->legsFrame.yawAngle; ent->client->backupMarker.legsPitchAngle = ent->legsFrame.pitchAngle; ent->client->backupMarker.legsYawing = ent->legsFrame.yawing; ent->client->backupMarker.legsPitching = ent->legsFrame.pitching; } if (i != ent->client->topMarker) { float frac = (float)(time - ent->client->clientMarkers[i].time) / (float)(ent->client->clientMarkers[j].time - ent->client->clientMarkers[i].time); //LerpPosition(ent->client->clientMarkers[i].origin, ent->client->clientMarkers[j].origin, frac, ent->r.currentOrigin); //LerpPosition(ent->client->clientMarkers[i].mins, ent->client->clientMarkers[j].mins, frac, ent->r.mins); //LerpPosition(ent->client->clientMarkers[i].maxs, ent->client->clientMarkers[j].maxs, frac, ent->r.maxs); // Using TimeShiftLerp since it follows the client exactly meaning less roundoff error TimeShiftLerp( ent->client->clientMarkers[i].origin, ent->client->clientMarkers[j].origin, frac, ent->r.currentOrigin); TimeShiftLerp( ent->client->clientMarkers[i].mins, ent->client->clientMarkers[j].mins, frac, ent->r.mins); TimeShiftLerp( ent->client->clientMarkers[i].maxs, ent->client->clientMarkers[j].maxs, frac, ent->r.maxs); // These are for Head / Legs ent->client->ps.viewangles[0] = LerpAngle( ent->client->clientMarkers[i].viewangles[0], ent->client->clientMarkers[j].viewangles[0], frac); ent->client->ps.viewangles[1] = LerpAngle( ent->client->clientMarkers[i].viewangles[1], ent->client->clientMarkers[j].viewangles[1], frac); ent->client->ps.viewangles[2] = LerpAngle( ent->client->clientMarkers[i].viewangles[2], ent->client->clientMarkers[j].viewangles[2], frac); // Set the ints to the closest ones in time since you can't lerp them. if ((ent->client->clientMarkers[j].time - time) < (time - ent->client->clientMarkers[i].time)) { ent->client->ps.eFlags = ent->client->clientMarkers[j].eFlags; ent->client->ps.pm_flags = ent->client->clientMarkers[j].pm_flags; ent->client->ps.viewheight = ent->client->clientMarkers[j].viewheight; // Torso Markers ent->torsoFrame.oldFrameModel = ent->client->clientMarkers[j].torsoOldFrameModel; ent->torsoFrame.frameModel = ent->client->clientMarkers[j].torsoFrameModel; ent->torsoFrame.oldFrame = ent->client->clientMarkers[j].torsoOldFrame; ent->torsoFrame.frame = ent->client->clientMarkers[j].torsoFrame; ent->torsoFrame.oldFrameTime = ent->client->clientMarkers[j].torsoOldFrameTime; ent->torsoFrame.frameTime = ent->client->clientMarkers[j].torsoFrameTime; ent->torsoFrame.yawAngle = ent->client->clientMarkers[j].torsoYawAngle; ent->torsoFrame.pitchAngle = ent->client->clientMarkers[j].torsoPitchAngle; ent->torsoFrame.yawing = ent->client->clientMarkers[j].torsoYawing; ent->torsoFrame.pitching = ent->client->clientMarkers[j].torsoPitching; // Legs Markers ent->legsFrame.oldFrameModel = ent->client->clientMarkers[j].legsOldFrameModel; ent->legsFrame.frameModel = ent->client->clientMarkers[j].legsFrameModel; ent->legsFrame.oldFrame = ent->client->clientMarkers[j].legsOldFrame; ent->legsFrame.frame = ent->client->clientMarkers[j].legsFrame; ent->legsFrame.oldFrameTime = ent->client->clientMarkers[j].legsOldFrameTime; ent->legsFrame.frameTime = ent->client->clientMarkers[j].legsFrameTime; ent->legsFrame.yawAngle = ent->client->clientMarkers[j].legsYawAngle; ent->legsFrame.pitchAngle = ent->client->clientMarkers[j].legsPitchAngle; ent->legsFrame.yawing = ent->client->clientMarkers[j].legsYawing; ent->legsFrame.pitching = ent->client->clientMarkers[j].legsPitching; // time stamp for BuildHead/Leg ent->timeShiftTime = ent->client->clientMarkers[j].time; } else { ent->client->ps.eFlags = ent->client->clientMarkers[i].eFlags; ent->client->ps.pm_flags = ent->client->clientMarkers[i].pm_flags; ent->client->ps.viewheight = ent->client->clientMarkers[i].viewheight; // Torso Markers ent->torsoFrame.oldFrameModel = ent->client->clientMarkers[i].torsoOldFrameModel; ent->torsoFrame.frameModel = ent->client->clientMarkers[i].torsoFrameModel; ent->torsoFrame.oldFrame = ent->client->clientMarkers[i].torsoOldFrame; ent->torsoFrame.frame = ent->client->clientMarkers[i].torsoFrame; ent->torsoFrame.oldFrameTime = ent->client->clientMarkers[i].torsoOldFrameTime; ent->torsoFrame.frameTime = ent->client->clientMarkers[i].torsoFrameTime; ent->torsoFrame.yawAngle = ent->client->clientMarkers[i].torsoYawAngle; ent->torsoFrame.pitchAngle = ent->client->clientMarkers[i].torsoPitchAngle; ent->torsoFrame.yawing = ent->client->clientMarkers[i].torsoYawing; ent->torsoFrame.pitching = ent->client->clientMarkers[i].torsoPitching; // Legs Markers ent->legsFrame.oldFrameModel = ent->client->clientMarkers[i].legsOldFrameModel; ent->legsFrame.frameModel = ent->client->clientMarkers[i].legsFrameModel; ent->legsFrame.oldFrame = ent->client->clientMarkers[i].legsOldFrame; ent->legsFrame.frame = ent->client->clientMarkers[i].legsFrame; ent->legsFrame.oldFrameTime = ent->client->clientMarkers[i].legsOldFrameTime; ent->legsFrame.frameTime = ent->client->clientMarkers[i].legsFrameTime; ent->legsFrame.yawAngle = ent->client->clientMarkers[i].legsYawAngle; ent->legsFrame.pitchAngle = ent->client->clientMarkers[i].legsPitchAngle; ent->legsFrame.yawing = ent->client->clientMarkers[i].legsYawing; ent->legsFrame.pitching = ent->client->clientMarkers[i].legsPitching; // time stamp for BuildHead/Leg ent->timeShiftTime = ent->client->clientMarkers[i].time; } /* FIXME if ( debugger && debugger->client) { // print some debugging stuff exactly like what the client does // it starts with "Rec:" to let you know it backward-reconciled char msg[2048]; Com_sprintf( msg, sizeof(msg), "print \"^1Rec: time: %d, j: %d, k: %d, origin: %0.2f %0.2f %0.2f\n" "^2frac: %0.4f, origin1: %0.2f %0.2f %0.2f, origin2: %0.2f %0.2f %0.2f\n" "^7level.time: %d, est time: %d, level.time delta: %d, est real ping: %d\n\"", time, ent->client->clientMarkers[i].time, ent->client->clientMarkers[j].time, ent->r.currentOrigin[0], ent->r.currentOrigin[1], ent->r.currentOrigin[2], frac, ent->client->clientMarkers[i].origin[0], ent->client->clientMarkers[i].origin[1], ent->client->clientMarkers[i].origin[2], ent->client->clientMarkers[j].origin[0], ent->client->clientMarkers[j].origin[1], ent->client->clientMarkers[j].origin[2], level.time, level.time + debugger->client->frameOffset, level.time - time, level.time + debugger->client->frameOffset - time); trap_SendServerCommand( debugger - g_entities, msg ); } */ } else { VectorCopy(ent->client->clientMarkers[j].origin, ent->r.currentOrigin); VectorCopy(ent->client->clientMarkers[j].mins, ent->r.mins); VectorCopy(ent->client->clientMarkers[j].maxs, ent->r.maxs); // BuildHead/Legs uses these VectorCopy(ent->client->clientMarkers[j].viewangles, ent->client->ps.viewangles); ent->client->ps.eFlags = ent->client->clientMarkers[j].eFlags; ent->client->ps.pm_flags = ent->client->clientMarkers[j].pm_flags; ent->client->ps.viewheight = ent->client->clientMarkers[j].viewheight; // Torso Markers ent->torsoFrame.oldFrameModel = ent->client->clientMarkers[j].torsoOldFrameModel; ent->torsoFrame.frameModel = ent->client->clientMarkers[j].torsoFrameModel; ent->torsoFrame.oldFrame = ent->client->clientMarkers[j].torsoOldFrame; ent->torsoFrame.frame = ent->client->clientMarkers[j].torsoFrame; ent->torsoFrame.oldFrameTime = ent->client->clientMarkers[j].torsoOldFrameTime; ent->torsoFrame.frameTime = ent->client->clientMarkers[j].torsoFrameTime; ent->torsoFrame.yawAngle = ent->client->clientMarkers[j].torsoYawAngle; ent->torsoFrame.pitchAngle = ent->client->clientMarkers[j].torsoPitchAngle; ent->torsoFrame.yawing = ent->client->clientMarkers[j].torsoYawing; ent->torsoFrame.pitching = ent->client->clientMarkers[j].torsoPitching; // Legs Markers ent->legsFrame.oldFrameModel = ent->client->clientMarkers[j].legsOldFrameModel; ent->legsFrame.frameModel = ent->client->clientMarkers[j].legsFrameModel; ent->legsFrame.oldFrame = ent->client->clientMarkers[j].legsOldFrame; ent->legsFrame.frame = ent->client->clientMarkers[j].legsFrame; ent->legsFrame.oldFrameTime = ent->client->clientMarkers[j].legsOldFrameTime; ent->legsFrame.frameTime = ent->client->clientMarkers[j].legsFrameTime; ent->legsFrame.yawAngle = ent->client->clientMarkers[j].legsYawAngle; ent->legsFrame.pitchAngle = ent->client->clientMarkers[j].legsPitchAngle; ent->legsFrame.yawing = ent->client->clientMarkers[j].legsYawing; ent->legsFrame.pitching = ent->client->clientMarkers[j].legsPitching; // time stamp for BuildHead/Leg ent->timeShiftTime = ent->client->clientMarkers[j].time; } trap_LinkEntity(ent); }
void G_ReAdjustSingleClientPosition( gentity_t* ent ) { if(!G_AntilagSafe(ent)) return; if( ent->client->backupMarker.time == level.time) { VectorCopy( ent->client->backupMarker.origin, ent->r.currentOrigin ); VectorCopy( ent->client->backupMarker.mins, ent->r.mins ); VectorCopy( ent->client->backupMarker.maxs, ent->r.maxs ); //josh: Head, Legs stuff VectorCopy(ent->client->backupMarker.viewangles, ent->client->ps.viewangles); // josh: don't restore the helmet if they just lost it // There are two reasons why you might not have a helmet anymore // 1) you were headshot by an unlagged trace. In this case, you should // still not have your helmet. // 2) you just barely got a helmet from an ammo pack so that you don't // have one back in time when the trace is done. In this case, you // should have a helmet again. BUT you don't want to just let them // keep the helmet back in time since they should still take extra // headshot damage. //if (ent->client->ps.eFlags & EF_HEADSHOT) // ent->client->backupMarker.eFlags |= EF_HEADSHOT; // Handle this where the headshot happens instead of here. Just // adjust the backup marker there instead. ent->client->ps.eFlags = ent->client->backupMarker.eFlags; ent->client->ps.pm_flags = ent->client->backupMarker.pm_flags; ent->client->ps.viewheight = ent->client->backupMarker.viewheight; //ent->client->backupMarker.servertime = 0; ent->client->backupMarker.time = 0; // forty - realistic hitboxes - Torso Markers ent->torsoFrame.oldFrameModel = ent->client->backupMarker.torsoOldFrameModel; ent->torsoFrame.frameModel = ent->client->backupMarker.torsoFrameModel; ent->torsoFrame.oldFrame = ent->client->backupMarker.torsoOldFrame; ent->torsoFrame.frame = ent->client->backupMarker.torsoFrame; ent->torsoFrame.oldFrameTime = ent->client->backupMarker.torsoOldFrameTime; ent->torsoFrame.frameTime = ent->client->backupMarker.torsoFrameTime; ent->torsoFrame.yawAngle = ent->client->backupMarker.torsoYawAngle; ent->torsoFrame.pitchAngle = ent->client->backupMarker.torsoPitchAngle; ent->torsoFrame.yawing = ent->client->backupMarker.torsoYawing; ent->torsoFrame.pitching = ent->client->backupMarker.torsoPitching; // forty - realistic hitboxes - Legs Markers ent->legsFrame.oldFrameModel = ent->client->backupMarker.legsOldFrameModel; ent->legsFrame.frameModel = ent->client->backupMarker.legsFrameModel; ent->legsFrame.oldFrame = ent->client->backupMarker.legsOldFrame; ent->legsFrame.frame = ent->client->backupMarker.legsFrame; ent->legsFrame.oldFrameTime = ent->client->backupMarker.legsOldFrameTime; ent->legsFrame.frameTime = ent->client->backupMarker.legsFrameTime; ent->legsFrame.yawAngle = ent->client->backupMarker.legsYawAngle; ent->legsFrame.pitchAngle = ent->client->backupMarker.legsPitchAngle; // forty - realistic hitboxes - time stamp for BuildHead/Leg ent->timeShiftTime = 0; trap_LinkEntity( ent ); } }
void G_AdjustSingleClientPosition( gentity_t* ent, int time, gentity_t* debugger) { int i, j; // unlagged analogies: antilag i = unlagged j, antilag j = unlagged k if( time > level.time ) { time = level.time; } // no lerping forward.... You mean extrapolating, not lerping (inter) if(!G_AntilagSafe(ent)) return; // find a pair of markers which bound the requested time i = j = ent->client->topMarker; do { if( ent->client->clientMarkers[i].time <= time ) { break; } j = i; i--; if( i < 0 ) { i = MAX_CLIENT_MARKERS - 1; } } while( i != ent->client->topMarker ); if( i == j ) { // oops, no valid stored markers return; } // josh: from unlagged make sure it doesn't get backed-up twice if ( ent->client->backupMarker.time != level.time ) { VectorCopy(ent->r.currentOrigin, ent->client->backupMarker.origin); VectorCopy(ent->r.mins, ent->client->backupMarker.mins); VectorCopy(ent->r.maxs, ent->client->backupMarker.maxs); //josh: for Head, Legs VectorCopy(ent->client->ps.viewangles, ent->client->backupMarker.viewangles); ent->client->backupMarker.eFlags = ent->client->ps.eFlags; ent->client->backupMarker.pm_flags = ent->client->ps.pm_flags; ent->client->backupMarker.viewheight = ent->client->ps.viewheight; // josh: This was missing, but needed or else no readjustment ent->client->backupMarker.time = level.time; // forty - realistic hitboxes - Torso Markers ent->client->backupMarker.torsoOldFrameModel = ent->torsoFrame.oldFrameModel; ent->client->backupMarker.torsoFrameModel = ent->torsoFrame.frameModel; ent->client->backupMarker.torsoOldFrame = ent->torsoFrame.oldFrame; ent->client->backupMarker.torsoFrame = ent->torsoFrame.frame; ent->client->backupMarker.torsoOldFrameTime = ent->torsoFrame.oldFrameTime; ent->client->backupMarker.torsoFrameTime = ent->torsoFrame.frameTime; ent->client->backupMarker.torsoYawAngle = ent->torsoFrame.yawAngle; ent->client->backupMarker.torsoPitchAngle = ent->torsoFrame.pitchAngle; ent->client->backupMarker.torsoYawing = ent->torsoFrame.yawing; ent->client->backupMarker.torsoPitching = ent->torsoFrame.pitching; // forty - realistic hitboxes - Legs Markers ent->client->backupMarker.legsOldFrameModel = ent->legsFrame.oldFrameModel; ent->client->backupMarker.legsFrameModel = ent->legsFrame.frameModel; ent->client->backupMarker.legsOldFrame = ent->legsFrame.oldFrame; ent->client->backupMarker.legsFrame = ent->legsFrame.frame; ent->client->backupMarker.legsOldFrameTime = ent->legsFrame.oldFrameTime; ent->client->backupMarker.legsFrameTime = ent->legsFrame.frameTime; ent->client->backupMarker.legsYawAngle = ent->legsFrame.yawAngle; ent->client->backupMarker.legsPitchAngle = ent->legsFrame.pitchAngle; ent->client->backupMarker.legsYawing = ent->legsFrame.yawing; ent->client->backupMarker.legsPitching = ent->legsFrame.pitching; } if(i != ent->client->topMarker) { //float frac = ((float)(ent->client->clientMarkers[j].time - time)) / (ent->client->clientMarkers[j].time - ent->client->clientMarkers[i].time); //josh: reversing the order to better match the client and prevent //roundoff error float frac = (float)(time - ent->client->clientMarkers[i].time) / (float)(ent->client->clientMarkers[j].time - ent->client->clientMarkers[i].time); //LerpPosition(ent->client->clientMarkers[i].origin, ent->client->clientMarkers[j].origin, frac, ent->r.currentOrigin); //LerpPosition(ent->client->clientMarkers[i].mins, ent->client->clientMarkers[j].mins, frac, ent->r.mins); //LerpPosition(ent->client->clientMarkers[i].maxs, ent->client->clientMarkers[j].maxs, frac, ent->r.maxs); //josh: Using TimeShiftLerp since it follows the client exactly //meaning less roundoff error TimeShiftLerp( ent->client->clientMarkers[i].origin, ent->client->clientMarkers[j].origin, frac, ent->r.currentOrigin); TimeShiftLerp( ent->client->clientMarkers[i].mins, ent->client->clientMarkers[j].mins, frac, ent->r.mins); TimeShiftLerp( ent->client->clientMarkers[i].maxs, ent->client->clientMarkers[j].maxs, frac, ent->r.maxs); // These are for Head / Legs ent->client->ps.viewangles[0] = LerpAngle( ent->client->clientMarkers[i].viewangles[0], ent->client->clientMarkers[j].viewangles[0], frac); ent->client->ps.viewangles[1] = LerpAngle( ent->client->clientMarkers[i].viewangles[1], ent->client->clientMarkers[j].viewangles[1], frac); ent->client->ps.viewangles[2] = LerpAngle( ent->client->clientMarkers[i].viewangles[2], ent->client->clientMarkers[j].viewangles[2], frac); // josh: Set the ints to the closest ones in time since you can't // lerp them. if((ent->client->clientMarkers[j].time - time) < (time - ent->client->clientMarkers[i].time)) { ent->client->ps.eFlags = ent->client->clientMarkers[j].eFlags; ent->client->ps.pm_flags = ent->client->clientMarkers[j].pm_flags; ent->client->ps.viewheight = ent->client->clientMarkers[j].viewheight; // forty - realistic hitboxes - Torso Markers ent->torsoFrame.oldFrameModel = ent->client->clientMarkers[j].torsoOldFrameModel; ent->torsoFrame.frameModel = ent->client->clientMarkers[j].torsoFrameModel; ent->torsoFrame.oldFrame = ent->client->clientMarkers[j].torsoOldFrame; ent->torsoFrame.frame = ent->client->clientMarkers[j].torsoFrame; ent->torsoFrame.oldFrameTime = ent->client->clientMarkers[j].torsoOldFrameTime; ent->torsoFrame.frameTime = ent->client->clientMarkers[j].torsoFrameTime; ent->torsoFrame.yawAngle = ent->client->clientMarkers[j].torsoYawAngle; ent->torsoFrame.pitchAngle = ent->client->clientMarkers[j].torsoPitchAngle; ent->torsoFrame.yawing = ent->client->clientMarkers[j].torsoYawing; ent->torsoFrame.pitching = ent->client->clientMarkers[j].torsoPitching; // forty - realistic hitboxes - Legs Markers ent->legsFrame.oldFrameModel = ent->client->clientMarkers[j].legsOldFrameModel; ent->legsFrame.frameModel = ent->client->clientMarkers[j].legsFrameModel; ent->legsFrame.oldFrame = ent->client->clientMarkers[j].legsOldFrame; ent->legsFrame.frame = ent->client->clientMarkers[j].legsFrame; ent->legsFrame.oldFrameTime = ent->client->clientMarkers[j].legsOldFrameTime; ent->legsFrame.frameTime = ent->client->clientMarkers[j].legsFrameTime; ent->legsFrame.yawAngle = ent->client->clientMarkers[j].legsYawAngle; ent->legsFrame.pitchAngle = ent->client->clientMarkers[j].legsPitchAngle; ent->legsFrame.yawing = ent->client->clientMarkers[j].legsYawing; ent->legsFrame.pitching = ent->client->clientMarkers[j].legsPitching; // forty - realistic hitboxes - time stamp for BuildHead/Leg ent->timeShiftTime = ent->client->clientMarkers[j].time; } else { ent->client->ps.eFlags = ent->client->clientMarkers[i].eFlags; ent->client->ps.pm_flags = ent->client->clientMarkers[i].pm_flags; ent->client->ps.viewheight = ent->client->clientMarkers[i].viewheight; // forty - realistic hitboxes - Torso Markers ent->torsoFrame.oldFrameModel = ent->client->clientMarkers[i].torsoOldFrameModel; ent->torsoFrame.frameModel = ent->client->clientMarkers[i].torsoFrameModel; ent->torsoFrame.oldFrame = ent->client->clientMarkers[i].torsoOldFrame; ent->torsoFrame.frame = ent->client->clientMarkers[i].torsoFrame; ent->torsoFrame.oldFrameTime = ent->client->clientMarkers[i].torsoOldFrameTime; ent->torsoFrame.frameTime = ent->client->clientMarkers[i].torsoFrameTime; ent->torsoFrame.yawAngle = ent->client->clientMarkers[i].torsoYawAngle; ent->torsoFrame.pitchAngle = ent->client->clientMarkers[i].torsoPitchAngle; ent->torsoFrame.yawing = ent->client->clientMarkers[i].torsoYawing; ent->torsoFrame.pitching = ent->client->clientMarkers[i].torsoPitching; // forty - realistic hitboxes - Legs Markers ent->legsFrame.oldFrameModel = ent->client->clientMarkers[i].legsOldFrameModel; ent->legsFrame.frameModel = ent->client->clientMarkers[i].legsFrameModel; ent->legsFrame.oldFrame = ent->client->clientMarkers[i].legsOldFrame; ent->legsFrame.frame = ent->client->clientMarkers[i].legsFrame; ent->legsFrame.oldFrameTime = ent->client->clientMarkers[i].legsOldFrameTime; ent->legsFrame.frameTime = ent->client->clientMarkers[i].legsFrameTime; ent->legsFrame.yawAngle = ent->client->clientMarkers[i].legsYawAngle; ent->legsFrame.pitchAngle = ent->client->clientMarkers[i].legsPitchAngle; ent->legsFrame.yawing = ent->client->clientMarkers[i].legsYawing; ent->legsFrame.pitching = ent->client->clientMarkers[i].legsPitching; // forty - realistic hitboxes - time stamp for BuildHead/Leg ent->timeShiftTime = ent->client->clientMarkers[i].time; } if ( debugger && debugger->client) { // print some debugging stuff exactly like what the client does // it starts with "Rec:" to let you know it backward-reconciled char msg[2048]; Com_sprintf( msg, sizeof(msg), "print \"^1Rec: time: %d, j: %d, k: %d, origin: %0.2f %0.2f %0.2f\n" "^2frac: %0.4f, origin1: %0.2f %0.2f %0.2f, origin2: %0.2f %0.2f %0.2f\n" "^7level.time: %d, est time: %d, level.time delta: %d, est real ping: %d\n\"", time, ent->client->clientMarkers[i].time, ent->client->clientMarkers[j].time, ent->r.currentOrigin[0], ent->r.currentOrigin[1], ent->r.currentOrigin[2], frac, ent->client->clientMarkers[i].origin[0], ent->client->clientMarkers[i].origin[1], ent->client->clientMarkers[i].origin[2], ent->client->clientMarkers[j].origin[0], ent->client->clientMarkers[j].origin[1], ent->client->clientMarkers[j].origin[2], level.time, level.time + debugger->client->frameOffset, level.time - time, level.time + debugger->client->frameOffset - time); trap_SendServerCommand( debugger - g_entities, msg ); } } else { VectorCopy( ent->client->clientMarkers[j].origin, ent->r.currentOrigin ); VectorCopy( ent->client->clientMarkers[j].mins, ent->r.mins ); VectorCopy( ent->client->clientMarkers[j].maxs, ent->r.maxs ); //// josh: BuildHead/Legs uses these VectorCopy(ent->client->clientMarkers[j].viewangles, ent->client->ps.viewangles); ent->client->ps.eFlags = ent->client->clientMarkers[j].eFlags; ent->client->ps.pm_flags = ent->client->clientMarkers[j].pm_flags; ent->client->ps.viewheight = ent->client->clientMarkers[j].viewheight; // forty - realistic hitboxes - Torso Markers ent->torsoFrame.oldFrameModel = ent->client->clientMarkers[j].torsoOldFrameModel; ent->torsoFrame.frameModel = ent->client->clientMarkers[j].torsoFrameModel; ent->torsoFrame.oldFrame = ent->client->clientMarkers[j].torsoOldFrame; ent->torsoFrame.frame = ent->client->clientMarkers[j].torsoFrame; ent->torsoFrame.oldFrameTime = ent->client->clientMarkers[j].torsoOldFrameTime; ent->torsoFrame.frameTime = ent->client->clientMarkers[j].torsoFrameTime; ent->torsoFrame.yawAngle = ent->client->clientMarkers[j].torsoYawAngle; ent->torsoFrame.pitchAngle = ent->client->clientMarkers[j].torsoPitchAngle; ent->torsoFrame.yawing = ent->client->clientMarkers[j].torsoYawing; ent->torsoFrame.pitching = ent->client->clientMarkers[j].torsoPitching; // forty - realistic hitboxes - Legs Markers ent->legsFrame.oldFrameModel = ent->client->clientMarkers[j].legsOldFrameModel; ent->legsFrame.frameModel = ent->client->clientMarkers[j].legsFrameModel; ent->legsFrame.oldFrame = ent->client->clientMarkers[j].legsOldFrame; ent->legsFrame.frame = ent->client->clientMarkers[j].legsFrame; ent->legsFrame.oldFrameTime = ent->client->clientMarkers[j].legsOldFrameTime; ent->legsFrame.frameTime = ent->client->clientMarkers[j].legsFrameTime; ent->legsFrame.yawAngle = ent->client->clientMarkers[j].legsYawAngle; ent->legsFrame.pitchAngle = ent->client->clientMarkers[j].legsPitchAngle; ent->legsFrame.yawing = ent->client->clientMarkers[j].legsYawing; ent->legsFrame.pitching = ent->client->clientMarkers[j].legsPitching; // forty - realistic hitboxes - time stamp for BuildHead/Leg ent->timeShiftTime = ent->client->clientMarkers[j].time; } trap_LinkEntity( ent ); }