-
Автор темы
- #1
Вопрос в шапке.
Вызывается функция в этом куске.
А вот и сама функция
Вызывается функция в этом куске.
C++:
const auto simtime_delta = e->m_flSimulationTime() - e->m_flOldSimulationTime();
const auto choked_ticks = ((simtime_delta / m_globals()->m_intervalpertick) + 0.5);
const auto simulation_tick_delta = choked_ticks - 2;
const auto delta_ticks = (std::clamp(TIME_TO_TICKS(m_engine()->GetNetChannelInfo()->GetLatency(1) + m_engine()->GetNetChannelInfo()->GetLatency(0)) + m_globals()->m_tickcount - TIME_TO_TICKS(e->m_flSimulationTime() + util::get_interpolation()), 0, 100)) - simulation_tick_delta;
if (delta_ticks > 0 && records->size() >= 2)
{
auto ticks_left = static_cast<int>(simulation_tick_delta);
ticks_left = std::clamp(ticks_left, 1, 10);
do
{
auto data_origin = record->origin;
auto data_velocity = record->velocity;
auto data_flags = record->flags;
extrapolate(e, data_origin, data_velocity, data_flags, !(e->m_fFlags() & FL_ONGROUND));
record->simulation_time += m_globals()->m_intervalpertick;
record->origin = data_origin;
record->velocity = data_velocity;
--ticks_left;
} while (ticks_left > 0);
}
C++:
void extrapolate(player_t* player, Vector& origin, Vector& velocity, int& flags, bool wasonground)
{
static auto sv_gravity = m_cvar()->FindVar(crypt_str("sv_gravity"));
static auto sv_jump_impulse = m_cvar()->FindVar(crypt_str("sv_jump_impulse"));
if (!(flags & FL_ONGROUND))
velocity.z -= (m_globals()->m_frametime * sv_gravity->GetFloat());
else if (wasonground)
velocity.z = sv_jump_impulse->GetFloat();
const Vector mins = player->GetCollideable()->OBBMins();
const Vector max = player->GetCollideable()->OBBMaxs();
const Vector src = origin;
Vector end = src + (velocity * m_globals()->m_frametime);
Ray_t ray;
ray.Init(src, end, mins, max);
trace_t trace;
CTraceFilter filter;
filter.pSkip = (void*)(player);
m_trace()->TraceRay(ray, MASK_PLAYERSOLID, &filter, &trace);
if (trace.fraction != 1.f)
{
for (int i = 0; i < 2; i++)
{
velocity -= trace.plane.normal * velocity.Dot(trace.plane.normal);
const float dot = velocity.Dot(trace.plane.normal);
if (dot < 0.f)
{
velocity.x -= dot * trace.plane.normal.x;
velocity.y -= dot * trace.plane.normal.y;
velocity.z -= dot * trace.plane.normal.z;
}
end = trace.endpos + (velocity * (m_globals()->m_intervalpertick * (1.f - trace.fraction)));
ray.Init(trace.endpos, end, mins, max);
m_trace()->TraceRay(ray, MASK_PLAYERSOLID, &filter, &trace);
if (trace.fraction == 1.f)
break;
}
}
origin = trace.endpos;
end = trace.endpos;
end.z -= 2.f;
ray.Init(origin, end, mins, max);
m_trace()->TraceRay(ray, MASK_PLAYERSOLID, &filter, &trace);
flags &= ~(1 << 0);
if (trace.DidHit() && trace.plane.normal.z > 0.7f)
flags |= (1 << 0);
}