Гайд Как работают desync aa

fuck$ociety
Забаненный
Статус
Оффлайн
Регистрация
2 Янв 2019
Сообщения
297
Реакции[?]
78
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как мы знаем, десники ограничены максимальной дельтой, и её нужно вычислять.
Для примера, поможет setupvelocity.
float GetMaxFakeDelta(SDK::CBaseEntity* entity)
{
auto animstate = entity->GetAnimState();
float speedfactor = Clamp<float>(animstate->m_flSpeedFraction(), 0.0f, 1.0f);
float unk1 = ((animstate->m_flLandingRatio() * -0.3f) - 0.2f) * speedfactor;
float unk2 = unk1 + 1.0f;
if (animstate->m_fDuckAmount > 0.0f) {
float max_velocity = Clamp<float>(animstate->m_flMaxWeaponVelocity(), 0.0f, 1.0f);
float duck_speed = animstate->m_fDuckAmount * max_velocity;
unk2 += (duck_speed * (0.5f - unk2));
}
Суть метода десника в том, что:
fake = netwoked. //угол, при тике (отправки пакетов)
real = rotation. //переменная анимстате, он же feetYaw


return animstate->yaw_desync_adjustment() * unk2;
}


Переменные в анимстате:


float& m_flSpeedFraction()
{
return *(float*)((uintptr_t)this + 0xF8);
}
float& m_flMaxWeaponVelocity()
{
return *(float*)((uintptr_t)this + 0xFC);
}


float& yaw_desync_adjustment2()
{
return *(float*)((uintptr_t)this + 0x330);
}


float& yaw_desync_adjustment()
{
return *(float*)((uintptr_t)this + 0x334);
}

Нужно запомнить, что во время движения, максимальной скоростью является 29.
Когда игрок стоит, 58.


//by collashe
 
НАЧНИ ПРОГРАММИРОВАТЬ ПРЯМО СЕЙЧАС
Участник
Статус
Оффлайн
Регистрация
19 Июн 2017
Сообщения
608
Реакции[?]
924
Поинты[?]
4K
Как мы знаем, десники ограничены максимальной дельтой, и её нужно вычислять.

Для примера, поможет setupvelocity.


Суть метода десника в том, что:

fake = netwoked. //угол, при тике (отправки пакетов)

real = rotation. //переменная анимстате, он же feetYaw


return animstate->yaw_desync_adjustment() * unk2;

}


Переменные в анимстате:




Нужно запомнить, что во время движения, максимальной скоростью является 29.

Когда игрок стоит, 58.


//by collashe
Зачем ты притащил это говно с лолза сюда? оно даже близко не рабочее, а ты скорее даже не понимаешь почему вообще десинк существует и работает. А если бы и знал, то вряд ли бы создал этот тред. Для всех тех, кто пришел разобраться в работе анимации ксго:
1. https://yougame.biz/threads/70120/
Рабочие десинки с картиночками и кодом, поможет понять как именно реализована десинхронизация серверных анимаций.
2.
Пожалуйста, авторизуйтесь для просмотра ссылки.

Код клиентского SetUpVelocity, поможет разобраться почему вообще происходит десинхронизация.
 
Последнее редактирование:
Каждый кнопки может тыкать...
Пользователь
Статус
Оффлайн
Регистрация
13 Янв 2019
Сообщения
745
Реакции[?]
135
Поинты[?]
0
С лолза взял даже не понимаешь как десинк работает.
 
fuck$ociety
Забаненный
Статус
Оффлайн
Регистрация
2 Янв 2019
Сообщения
297
Реакции[?]
78
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Зачем ты притащил это говно с лолза сюда? оно даже близко не рабочее, а ты скорее даже не понимаешь почему вообще десинк существует и работает. А если бы и знал, то вряд ли бы создал этот тред. Для всех тех, кто пришел разобраться в работе анимации ксго:
1. https://yougame.biz/threads/70120/
Рабочие десинки с картиночками и кодом, поможет понять как именно реализована десинхронизация серверных анимаций.
2.
Пожалуйста, авторизуйтесь для просмотра ссылки.

Код клиентского SetUpVelocity, поможет разобраться почему вообще происходит десинхронизация.
Вообще всё равно, просто спастил :D
Я в хвх не шарю.
 
fuck$ociety
Забаненный
Статус
Оффлайн
Регистрация
2 Янв 2019
Сообщения
297
Реакции[?]
78
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
9 Авг 2017
Сообщения
56
Реакции[?]
8
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
fuck$ociety
Забаненный
Статус
Оффлайн
Регистрация
2 Янв 2019
Сообщения
297
Реакции[?]
78
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2018
Сообщения
134
Реакции[?]
35
Поинты[?]
0
Вот тебе нормальное получение максимальной дельты угла десинка, а то что ты спастил фигня какая то
Код:
float C_BasePlayer::GetMaxDesyncAnglesDelta()
{
auto animstate = this->GetBasePlayerAnimState();
float duckammount = animstate->m_fDuckAmount;
float speedfraction = std::max(0.f, std::min(animstate->m_flFeetSpeedForwardsOrSideWays, 1.f));
float speedfactor = std::max(0.f, std::max(1.f, animstate->m_flFeetSpeedUnknownForwardOrSideways));
float unk1 = ((animstate->m_flStopToFullRunningFraction * -0.30000001) - 0.19999999) * speedfraction;
float unk2 = unk1 + 1.f;
if (duckammount > 0)
    unk2 += +((duckammount * speedfactor) * (0.5f - unk2));
return *(float*)((uintptr_t)animstate + 0x334) * unk2;
}
 
Забаненный
Статус
Оффлайн
Регистрация
9 Янв 2019
Сообщения
701
Реакции[?]
295
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пожалуйста, авторизуйтесь для просмотра ссылки.

Код клиентского SetUpVelocity, поможет разобраться почему вообще происходит десинхронизация.
C++:
if (bJustStartedMovingLastUpdate && m_flFeetYawRate <= 0.0f)
    {
        m_flCurrentMoveDirGoalFeetDelta = m_flGoalMoveDirGoalFeetDelta;
 
        C_AnimationLayer *layer = pBaseEntity->GetAnimOverlay(6);
        if (layer && layer->m_nSequence != -1)
        {
            if (*(DWORD*)((DWORD)pBaseEntity->pSeqdesc(layer->m_nSequence) + 0xC4) > 0)
            {
                int tag = ANIMTAG_UNINITIALIZED;
 
                if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, 180.0f)) > 22.5f)
                {
                    if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, 135.0f)) > 22.5f)
                    {
                        if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, 90.0f)) > 22.5f)
                        {
                            if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, 45.0f)) > 22.5f)
                            {
                                if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, 0.0f)) > 22.5f)
                                {
                                    if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, -45.0f)) > 22.5f)
                                    {
                                        if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, -90.0f)) > 22.5f)
                                        {
                                            if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, -135.0f)) <= 22.5f)
                                                tag = ANIMTAG_STARTCYCLE_NW;
                                        }
                                        else
                                        {
                                            tag = ANIMTAG_STARTCYCLE_W;
                                        }
                                    }
                                    else
                                    {
                                        tag = ANIMTAG_STARTCYCLE_SW;
                                    }
                                }
                                else
                                {
                                    tag = ANIMTAG_STARTCYCLE_S;
                                }
                            }
                            else
                            {
                                tag = ANIMTAG_STARTCYCLE_SE;
                            }
                        }
                        else
                        {
                            tag = ANIMTAG_STARTCYCLE_E;
                        }
                    }
                    else
                    {
                        tag = ANIMTAG_STARTCYCLE_NE;
                    }
                }
                else
                {
                    tag = ANIMTAG_STARTCYCLE_N;
                }
                m_flFeetCycle = pBaseEntity->GetFirstSequenceAnimTag(layer->m_nSequence, tag);
            }
        }
спасите...
 
НАЧНИ ПРОГРАММИРОВАТЬ ПРЯМО СЕЙЧАС
Участник
Статус
Оффлайн
Регистрация
19 Июн 2017
Сообщения
608
Реакции[?]
924
Поинты[?]
4K
C++:
if (bJustStartedMovingLastUpdate && m_flFeetYawRate <= 0.0f)
    {
        m_flCurrentMoveDirGoalFeetDelta = m_flGoalMoveDirGoalFeetDelta;

        C_AnimationLayer *layer = pBaseEntity->GetAnimOverlay(6);
        if (layer && layer->m_nSequence != -1)
        {
            if (*(DWORD*)((DWORD)pBaseEntity->pSeqdesc(layer->m_nSequence) + 0xC4) > 0)
            {
                int tag = ANIMTAG_UNINITIALIZED;

                if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, 180.0f)) > 22.5f)
                {
                    if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, 135.0f)) > 22.5f)
                    {
                        if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, 90.0f)) > 22.5f)
                        {
                            if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, 45.0f)) > 22.5f)
                            {
                                if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, 0.0f)) > 22.5f)
                                {
                                    if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, -45.0f)) > 22.5f)
                                    {
                                        if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, -90.0f)) > 22.5f)
                                        {
                                            if (std::fabs(AngleDiff(m_flCurrentMoveDirGoalFeetDelta, -135.0f)) <= 22.5f)
                                                tag = ANIMTAG_STARTCYCLE_NW;
                                        }
                                        else
                                        {
                                            tag = ANIMTAG_STARTCYCLE_W;
                                        }
                                    }
                                    else
                                    {
                                        tag = ANIMTAG_STARTCYCLE_SW;
                                    }
                                }
                                else
                                {
                                    tag = ANIMTAG_STARTCYCLE_S;
                                }
                            }
                            else
                            {
                                tag = ANIMTAG_STARTCYCLE_SE;
                            }
                        }
                        else
                        {
                            tag = ANIMTAG_STARTCYCLE_E;
                        }
                    }
                    else
                    {
                        tag = ANIMTAG_STARTCYCLE_NE;
                    }
                }
                else
                {
                    tag = ANIMTAG_STARTCYCLE_N;
                }
                m_flFeetCycle = pBaseEntity->GetFirstSequenceAnimTag(layer->m_nSequence, tag);
            }
        }
спасите...
Поздравляю, ты узнал как выглядит оптимизация циклов в MSVC. В оригинале может быть так
Код:
// from 180 to -135
for ( int i = 0; i < 8; ++i ) {
  float delta = AngleDiff( this->m_flCurrentMoveDirGoalFeetDelta, 180.0f - static_cast< float >( i ) * 45.0f );
  if ( delta <= 22.5 ) {
    int tag = i + 1;
    this->m_flFeetCycle = m_player->GetFirstSequenceAnimTag( anim_overlay_6->m_nSequence, tag, delta );
    break;
  }
}
Хотя я не буду удивлен, если у валв код без цикла лол.
 
Начинающий
Статус
Оффлайн
Регистрация
25 Мар 2019
Сообщения
7
Реакции[?]
2
Поинты[?]
0
Грубо говоря это все не правильно.
Ну точнее на практике это почти не работает ибо ты упускаешь слишком много ньюансов.
 
Забаненный
Статус
Оффлайн
Регистрация
3 Ноя 2017
Сообщения
142
Реакции[?]
5
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
а тут симвал седит
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
Неплохо, но только если не учитывать что ты не объяснил много моментов, тот же GoalFeetYaw, и то что в идеале нужен lby, чтобы работали десинки получше и много чего прчего
 
Эксперт
Статус
Оффлайн
Регистрация
8 Авг 2018
Сообщения
2,218
Реакции[?]
631
Поинты[?]
0
Вот тебе нормальное получение максимальной дельты угла десинка, а то что ты спастил фигня какая то
Код:
float C_BasePlayer::GetMaxDesyncAnglesDelta()
{
auto animstate = this->GetBasePlayerAnimState();
float duckammount = animstate->m_fDuckAmount;
float speedfraction = std::max(0.f, std::min(animstate->m_flFeetSpeedForwardsOrSideWays, 1.f));
float speedfactor = std::max(0.f, std::max(1.f, animstate->m_flFeetSpeedUnknownForwardOrSideways));
float unk1 = ((animstate->m_flStopToFullRunningFraction * -0.30000001) - 0.19999999) * speedfraction;
float unk2 = unk1 + 1.f;
if (duckammount > 0)
    unk2 += +((duckammount * speedfactor) * (0.5f - unk2));
return *(float*)((uintptr_t)animstate + 0x334) * unk2;
}
Код:
float C_BasePlayer::GetMaxDesyncAnglesDelta()

{

auto animstate = this->GetBasePlayerAnimState();

float duckammount = animstate->m_fDuckAmount;

float speedfraction = std::max(0.f, std::min(animstate->m_flFeetSpeedForwardsOrSideWays, 1.f));

float speedfactor = std::max(0.f, std::max(1.f, animstate->m_flFeetSpeedUnknownForwardOrSideways));

float unk1 = ((animstate->m_flStopToFullRunningFraction * -0.3) - 0.2) * speedfraction;

float unk2 = unk1 + 1.f;

if (duckammount > 0)

    unk2 += +((duckammount * speedfactor) * (0.5f - unk2));

return *(float*)((uintptr_t)animstate + 0x334) * unk2;

}
А чё не так?
Как в сетапе
 
Сверху Снизу