• Я зарабатываю 100 000 RUB / месяц на этом сайте!

    А знаешь как? Я всего-лишь публикую (создаю темы), а админ мне платит. Трачу деньги на мороженое, робуксы и сервера в Minecraft. А ещё на паль из Китая. 

    Хочешь так же? Пиши и узнавай условия: https://t.me/alex_redact
    Реклама: https://t.me/yougame_official

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

fuck$ociety
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
2 Янв 2019
Сообщения
297
Реакции
78
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как мы знаем, десники ограничены максимальной дельтой, и её нужно вычислять.
Для примера, поможет 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
 
Как мы знаем, десники ограничены максимальной дельтой, и её нужно вычислять.

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


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

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

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


return animstate->yaw_desync_adjustment() * unk2;

}


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




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

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


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

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

Код клиентского SetUpVelocity, поможет разобраться почему вообще происходит десинхронизация.
Вообще всё равно, просто спастил :D
Я в хвх не шарю.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Вот тебе нормальное получение максимальной дельты угла десинка, а то что ты спастил фигня какая то
Код:
Expand Collapse Copy
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;
}
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пожалуйста, авторизуйтесь для просмотра ссылки.

Код клиентского SetUpVelocity, поможет разобраться почему вообще происходит десинхронизация.
C++:
Expand Collapse Copy
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);
            }
        }
спасите...
 
C++:
Expand Collapse Copy
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. В оригинале может быть так
Код:
Expand Collapse Copy
// 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;
  }
}
Хотя я не буду удивлен, если у валв код без цикла лол.
 
Грубо говоря это все не правильно.
Ну точнее на практике это почти не работает ибо ты упускаешь слишком много ньюансов.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
а тут симвал седит
 
Неплохо, но только если не учитывать что ты не объяснил много моментов, тот же GoalFeetYaw, и то что в идеале нужен lby, чтобы работали десинки получше и много чего прчего
 
Вот тебе нормальное получение максимальной дельты угла десинка, а то что ты спастил фигня какая то
Код:
Expand Collapse Copy
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;
}
Код:
Expand Collapse Copy
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;

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