Esempio n. 1
0
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;

}
Esempio n. 2
0
/**
 * @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;
}
Esempio n. 3
0
/**
 * @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);
	}
}
Esempio n. 4
0
/**
 * @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);
}
Esempio n. 5
0
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 );
	}
}
Esempio n. 6
0
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 );
}