[flowers for ur soul]
-
Автор темы
- #1
Всем привет, сегодня я покажу как сделать легит десинк без MaxRotation, ведь нам попросту ненужно максимально возможное значение десинка. Для начала глянем на код SetupVelocity -
Мы можем найти в коде следующее:
Тут мы видим, что с самого начала мы уже имеем максимальную дельту, а также то, что если мы передадим любое неверное значение ( например MaxRotation + 1 ), то наша дельта в любом случае будет максимальная.
Итак, зная, что сам десинк мы делаем, когда bSendPacket = true, а также, что при bSendPacket = true, сервер обрабатываем сразу два отправленных cmd ( CUserCmd ), то можно сделать вывод, что десинк мы выставляем только когда сервер обрабатывает 2 команды ( то есть, когда cmd->CommandNumber делится на 2 )
Теперь добавляем десинк, снова смотрим на SetupVelocity, а именно на ApproachAngle:
Думаю вы уже поняли, какое значение мы будем брать, чтобы наш десинк стал работать, зададим это значение переменной float DesyncVal.
И теперь нам остается просто присвоить это значение нашему cmd->ViewAngles. Если вы хотите изменять направление десинка, то просто домножьте DesyncVal на переменную, отображающую вашу сторону.
Вот и все, всем спасибо, не используйте maxRotation.
Данная тема - гайд, вы должны сами понять, что нужно делать, а не получить уже готовую инфу, так что думайте головой, чтобы правильно все сделать. Подсказка, что нужно доработать: если ваш десинк с лбу брикером, то условие cmd->CommandNumber % 2 надо будет заменить, также количество максимально чокнутых тиков должно зависеть от вашей задержки ( NetChannelInfo ), не стоит забывать и про фикс и нормализацию углов, дабы не получить антрастед / правильно сделать десинк, ну и конечно же для десинка без лбу брикера нужно сделать минимальные движения ( cmd->SideMove ), чтобы иметь больший рассинхрон модели
Credits: violanes
Пожалуйста, авторизуйтесь для просмотра ссылки.
Мы можем найти в коде следующее:
C++:
float flMaxYawModifier = flYawModifier * m_flMaxYaw;
float flMinYawModifier = flYawModifier * m_flMinYaw;
if (eye_feet_delta <= flMaxYawModifier)
{
if (flMinYawModifier > eye_feet_delta)
m_flGoalFeetYaw = fabs(flMinYawModifier) + m_flEyeYaw;
}
else
{
m_flGoalFeetYaw = m_flEyeYaw - fabs(flMaxYawModifier);
}
Итак, зная, что сам десинк мы делаем, когда bSendPacket = true, а также, что при bSendPacket = true, сервер обрабатываем сразу два отправленных cmd ( CUserCmd ), то можно сделать вывод, что десинк мы выставляем только когда сервер обрабатывает 2 команды ( то есть, когда cmd->CommandNumber делится на 2 )
C++:
if ( cmd->CommandNumber % 2 == 1 )
{
// desync ...
bSendPacket = false;
}
if ( g_ClientState->ChockedCommands >= 14 ) // 14 - предел чокнутых пакетов
{
// устанавливаем здесь наш реал
bSendPacket = true;
}
C++:
if (m_flSpeed > 0.1f || fabs(m_flAbsVelocityZ) > 100.0f)
{
m_flGoalFeetYaw = ApproachAngle(
m_flEyeYaw,
m_flGoalFeetYaw,
((m_flGroundFraction * 20.0f) + 30.0f)
* m_flLastClientSideAnimationUpdateTimeDelta);
}
else
{
m_flGoalFeetYaw = ApproachAngle(
pBaseEntity->GetLowerBodyYaw(),
m_flGoalFeetYaw,
m_flLastClientSideAnimationUpdateTimeDelta * 100.0f);
}
И теперь нам остается просто присвоить это значение нашему cmd->ViewAngles. Если вы хотите изменять направление десинка, то просто домножьте DesyncVal на переменную, отображающую вашу сторону.
Вот и все, всем спасибо, не используйте maxRotation.
Данная тема - гайд, вы должны сами понять, что нужно делать, а не получить уже готовую инфу, так что думайте головой, чтобы правильно все сделать. Подсказка, что нужно доработать: если ваш десинк с лбу брикером, то условие cmd->CommandNumber % 2 надо будет заменить, также количество максимально чокнутых тиков должно зависеть от вашей задержки ( NetChannelInfo ), не стоит забывать и про фикс и нормализацию углов, дабы не получить антрастед / правильно сделать десинк, ну и конечно же для десинка без лбу брикера нужно сделать минимальные движения ( cmd->SideMove ), чтобы иметь больший рассинхрон модели
Credits: violanes