Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Я нашёл три метода десинка, решил слить самый первый из них.
- Суть этого метода в том, что fake = netwoked, а real = abs_rotation.
- networked - угол, который устанавливается в тот тик, когда происходит отправка пакетов.
- abs_rotation - переменная из класса CBaseAnimstate, которая во многих sdk называется GoalFeetYaw.
- Десинк АА ограничены максимальной дельтой, поэтому нам нужно её вычислить. В этом нам поможет код из 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));
- }
- return animstate->yaw_desync_adjustment() * unk2;
- }
- Вот некоторые переменные из animstate, которые здесь необычно названы:
- float& m_flSpeedFraction() {
- return *(float*)((uintptr_t)this + 0xF8);
- }
- float& m_flMaxWeaponVelocity() { // ( 2.9411764 / flMaxPlayerSpeed ) * velocity
- 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);
- }
- float& m_flLandingRatio() {
- return *(float*)((uintptr_t)this + 0x11C);
- }
- float& m_flAbsRotation() {
- return *(float*)((uintptr_t)this + 0x80);
- }
- Если вы выведете на экран значения максимальной дельты, то увидите, что во время движения на максимальной скорости она 29, а когда игрок стоит, она 58.
- По-скольку данный метод основан на abs_rotation, но угол не должен меняться больше, чем на максимальную дельту, есть 2 угла, от которых нельзя далеко отходить: последний угол перед отправкой пакетов и abs_rotation.
- Начинаем писать десинк уже в функции АА:
- auto animstate = local_player->GetAnimState();
- float feet_yaw = animstate->m_flAbsRotation();
- static bool b_switch = false;
- if (GLOBAL::should_send_packet)
- b_switch = !b_switch;
- b_switch здесь нужен для джиттера по фейку.
- Объявляем максимальную дельту десинка и дельту между предыдущим углом и реалом
- float feet_delta = MATH::NormalizeYaw(GLOBAL::real_angles.y - feet_yaw);
- float fake_yaw;
- float desync_delta = UTILS::GetMaxFakeDelta(local_player);
- К скрытому углу (тому, который отсылается перед отправкой пакетов) мы будем прибавлять 2 значения поочерёдно в разные стороны для джиттера.
- float delta = UTILS::Clamp<float>(MATH::NormalizeYaw(desync_delta - feet_delta), -desync_delta, desync_delta);
- float negative_delta = UTILS::Clamp<float>(MATH::NormalizeYaw(desync_delta + feet_delta), -desync_delta, desync_delta);
- Переменная, показывающая, какая из дельт больше
- bool c_switch = fabs(negative_delta) > fabs(delta);
- Если дельта между скрытым углом и реалом слишком большая, мы рискуем направить фейк в реал и получить тап от челика без ресольвера.
- Направляем фейк по-дальше от реала:
- if (fabs(feet_delta) > 20.f)
- b_switch = !c_switch;
- И теперь финал: делаем сам джиттер:
- if (b_switch)
- fake_yaw = GLOBAL::real_angles.y - negative_delta;
- else
- fake_yaw = GLOBAL::real_angles.y + delta;
- Ну это, думаю, и так понятно:
- return GLOBAL::should_send_packet ? fake_yaw : DoRealYaw();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement