extrapolation:
void lagcomp::extrapolate( C_CSPlayer* player, Vector& origin, Vector& velocity, int& flags )
{
const Vector mins = player->GetCollideable()->OBBMins();
const Vector maxs = player->GetCollideable()->OBBMaxs();
Vector start = origin;
Vector end = start + ( velocity * interfaces::globals()->interval_per_tick );
Ray_t ray;
ray.Init( start, end, mins, maxs );
trace_t trace;
CTraceFilterWorldOnly filter{};
interfaces::engine_trace()->TraceRay( ray, CONTENTS_SOLID, &filter, &trace );
if ( trace.fraction != 1.f )
{
for ( auto i = 0; i < 2; i++ )
{
if ( velocity.Length() == 0.f )
break;
velocity -= trace.plane.normal * velocity.Dot( trace.plane.normal );
const float adjust = velocity.Dot( trace.plane.normal );
if ( adjust < 0.f )
velocity -= trace.plane.normal * adjust;
start = trace.endpos;
end = start + ( velocity * ( interfaces::globals()->interval_per_tick * ( 1.f - trace.fraction ) ) );
ray.Init( start, end, mins, maxs );
interfaces::engine_trace()->TraceRay( ray, CONTENTS_SOLID, &filter, &trace );
if ( trace.fraction == 1.f )
break;
}
}
start = end = origin = trace.endpos;
end.z -= 2.f;
ray.Init( start, end, mins, maxs );
interfaces::engine_trace()->TraceRay( ray, CONTENTS_SOLID, &filter, &trace );
if ( trace.fraction == 1.f && trace.plane.normal.z < 0.7f )
flags &= ~FL_ONGROUND;
else
flags |= FL_ONGROUND;
}
better extrapolation:
void LagCompensation::PlayerMove( LagRecord* record ) {
vec3_t start, end, normal;
CGameTrace trace;
CTraceFilterWorldOnly filter;
start = record->m_pred_origin;
end = start + ( record->m_pred_velocity * g_csgo.m_globals->m_interval );
g_csgo.m_engine_trace->TraceRay( Ray( start, end, record->m_mins, record->m_maxs ), CONTENTS_SOLID, &filter, &trace );
if ( trace.m_fraction != 1.f ) {
for ( int i{}; i < 2; ++i ) {
if ( record->m_pred_velocity.length( ) == 0.f )
break;
record->m_pred_velocity -= trace.m_plane.m_normal * record->m_pred_velocity.dot( trace.m_plane.m_normal );
float adjust = record->m_pred_velocity.dot( trace.m_plane.m_normal );
if ( adjust < 0.f )
record->m_pred_velocity -= ( trace.m_plane.m_normal * adjust );
start = trace.m_endpos;
end = start + ( record->m_pred_velocity * ( g_csgo.m_globals->m_interval * ( 1.f - trace.m_fraction ) ) );
g_csgo.m_engine_trace->TraceRay( Ray( start, end, record->m_mins, record->m_maxs ), CONTENTS_SOLID, &filter, &trace );
if ( trace.m_fraction == 1.f )
break;
}
}
start = end = record->m_pred_origin = trace.m_endpos;
end.z -= 2.f;
g_csgo.m_engine_trace->TraceRay( Ray( start, end, record->m_mins, record->m_maxs ), CONTENTS_SOLID, &filter, &trace );
if ( trace.m_fraction == 1.f && trace.m_plane.m_normal.z < 0.7f )
record->m_pred_flags &= ~FL_ONGROUND;
else
record->m_pred_flags |= FL_ONGROUND;
if ( record->m_pred_flags & FL_ONGROUND )
record->m_layers[ 4 ].m_cycle = record->m_layers[ 4 ].m_weight = 0.f;
}
note: this is reversed extrapolation, not src free/etc.
Last edited: