-
Автор темы
- #1
Вобщем, фактически, фикс произведен следующим образом:
В методе SetUpAliveLoop для просчета Weight, используется следующая формула:
Чтобы получить m_flSpeedAsPortionOfRunTopSpeed, нужно произвести обратные просчеты, т.е через уравнение
Как пруф предоставляю код с server.dll:
После чего с помощью, опять же, обратных формул, можно получить длину Velocity:
Сам код:
P.S Эта паста уже в паблике лежит, мне кажется, несколько лет, поэтому нет смысла это держать в секрете
Думаю хотя бы объяснил ее суть
А еще, я видел очень много паблик сурсов, которые пастят логику просчета Velocity, которая нужна для экстраполяции, мб хватит это делать....
В методе SetUpAliveLoop для просчета Weight, используется следующая формула:
Чтобы получить m_flSpeedAsPortionOfRunTopSpeed, нужно произвести обратные просчеты, т.е через уравнение
Как пруф предоставляю код с server.dll:
После чего с помощью, опять же, обратных формул, можно получить длину Velocity:
Сам код:
Код:
auto max_speed = weapon && weapon_info ?
std::max<float>((player->is_scoped() ? weapon_info->max_speed_alt : weapon_info->max_speed), 0.001f)
: CS_PLAYER_SPEED_RUN;
if (player->is_walking())
max_speed *= CS_PLAYER_SPEED_WALK_MODIFIER;
if (player->duck_amount() >= 1.f)
max_speed *= CS_PLAYER_SPEED_DUCK_MODIFIER;
if (prev_record) {
if (record->flags.has(FL_ONGROUND) && prev_record->flags.has(FL_ONGROUND)) {
auto& layer_aliveloop = prev_record->layers[ANIMATION_LAYER_ALIVELOOP];
// calculate server value of m_flSpeedAsPortionOfRunTopSpeed via layer from SetupAliveLoop:
/*
code from server.dll:
v27 = 0.0;
v28 = (*(this + 228) - 0.55000001) * 2.8571432;
if ( v28 >= 0.0 )
v27 = fminf(v28, 1.0);
sub_104B02A0(this, 1.0 - v27, 11);
*/
auto base_value = 1.f - layer_aliveloop.weight;
auto fake_speed_portion = base_value / 2.85f;
if (fake_speed_portion > 0.f)
fake_speed_portion += 0.55f;
// adjust the velocity by server m_flSpeedAsPortionOfRunTopSpeed by inverting in-game formulas
// code from game:
/*
m_flSpeedAsPortionOfRunTopSpeed = clamp( m_flVelocityLengthXY / flMaxSpeedRun, 0, 1 );
m_flSpeedAsPortionOfWalkTopSpeed = m_flVelocityLengthXY / (flMaxSpeedRun * CS_PLAYER_SPEED_WALK_MODIFIER);
m_flSpeedAsPortionOfCrouchTopSpeed = m_flVelocityLengthXY / (flMaxSpeedRun * CS_PLAYER_SPEED_DUCK_MODIFIER);
*/
auto anim_velocity_length = std::min<float>(record->velocity.length(), CS_PLAYER_SPEED_RUN);
if (fake_speed_portion > 0.f)
record->velocity *= ((fake_speed_portion * max_speed) / anim_velocity_length);
}
}
Думаю хотя бы объяснил ее суть
А еще, я видел очень много паблик сурсов, которые пастят логику просчета Velocity, которая нужна для экстраполяции, мб хватит это делать....