Вопрос Откидывают фейклаги. Анреги.

Пользователь
Статус
Онлайн
Регистрация
22 Июн 2020
Сообщения
185
Реакции[?]
69
Поинты[?]
41K
Что более странно, так это то, что фейклаги откидывают только первые минуты 3 игры (именно игры, не времени нахождения на сервере!), потом мееньше, но все равно откидывают. Так же почти постоянно не регает вторую пулю даблтапа (этой проблемы на локалке нет, первая есть). Каждый раз когда откидывает в консоли появляется такое сообщение: Msg from loopback: CCLCMsg_CmdKeyValues rejected by msg bind (53 bytes).

Код предикта:
Prediction.cpp:
void CPrediction::StartCommand(CBasePlayer* player, CUserCmd* cmd) {
    *Cheat.LocalPlayer->GetCurrentCommand() = cmd;
    Cheat.LocalPlayer->GetLastCommand() = *cmd;
    *predictionRandomSeed = cmd->random_seed;
    *predictionEntity = Cheat.LocalPlayer;
}

void CPrediction::RunPreThink(CBasePlayer* player) {
    if (!player->PhysicsRunThink(0))
        return;

    player->PreThink();
}

void CPrediction::RunThink(CBasePlayer* player, double frametime) {
    static auto SetNextThink = reinterpret_cast<void(__thiscall*)(int)>(Utils::PatternScan("client.dll", "55 8B EC 56 57 8B F9 8B B7 ? ? ? ? 8B C6"));
    int thinktick = player->m_nNextThinkTick();

    if (thinktick <= 0 || thinktick > player->m_nTickBase())
        return;

    SetNextThink(0);

    player->Think();
}

void CPrediction::BackupData() {
    if (Cheat.LocalPlayer->GetActiveWeapon()) {
        if (Cheat.LocalPlayer->GetActiveWeapon()->IsGrenade())
            m_fThrowTime = Cheat.LocalPlayer->GetActiveWeapon()->m_flThrowTime();
        m_flNextPrimaryAttack = Cheat.LocalPlayer->GetActiveWeapon()->m_flNextPrimaryAttack();
    }

    m_fFlags = Cheat.LocalPlayer->m_fFlags();
    m_vecVelocity = Cheat.LocalPlayer->m_vecVelocity();
    m_vecAbsVelocity = Cheat.LocalPlayer->m_vecAbsVelocity();

    flOldCurrentTime = GlobalVars->curtime;
    flOldFrameTime = GlobalVars->frametime;
    iOldTickCount = GlobalVars->tickcount;
}

void CPrediction::Start(CUserCmd* cmd) {
    if (!MoveHelper)
        return;

    BackupData();
    StartCommand(Cheat.LocalPlayer, cmd);

    const bool bOldIsFirstPrediction = Prediction->bIsFirstTimePredicted;
    const bool bOldInPrediction = Prediction->bInPrediction;

    GlobalVars->curtime = Cheat.ServerTime;
    GlobalVars->frametime = Prediction->bEnginePaused ? 0.f : GlobalVars->interval_per_tick;
    GlobalVars->tickcount = TIME_TO_TICKS(Cheat.ServerTime);

    Prediction->bIsFirstTimePredicted = false;
    Prediction->bInPrediction = true;

    cmd->buttons |= Cheat.LocalPlayer->GetButtonForced();
    cmd->buttons &= ~(Cheat.LocalPlayer->GetButtonDisabled());

    GameMovement->StartTrackPredictionErrors(Cheat.LocalPlayer);

    if (cmd->weaponselect)
    {
        if (CBaseCombatWeapon* weapon = reinterpret_cast<CBaseCombatWeapon*>(EntityList->GetClientEntity(cmd->weaponselect)))
        {
            if (CCSWeaponData* weapon_data = weapon->GetWeaponInfo())
                Cheat.LocalPlayer->SelectItem(weapon_data->szWeaponName, cmd->weaponsubtype);
        }
    }

    CBaseEntity* vehicle = reinterpret_cast<CBaseEntity*>(EntityList->GetClientEntityFromHandle(Cheat.LocalPlayer->m_hVehicle()));

    if (cmd->impulse)
    {
        if (!vehicle || Cheat.LocalPlayer->UsingStandardWeaponsInVehicle())
            Cheat.LocalPlayer->m_nImpulse() = cmd->impulse;
    }

    Cheat.LocalPlayer->UpdateButtonState(cmd->buttons);

    Prediction->CheckMovingGround(Cheat.LocalPlayer, GlobalVars->frametime);
    Prediction->SetLocalViewAngles(cmd->viewangles);

    MoveHelper->SetHost(Cheat.LocalPlayer);

    RunPreThink(Cheat.LocalPlayer);

    RunThink(Cheat.LocalPlayer, GlobalVars->interval_per_tick);

    Prediction->SetupMove(Cheat.LocalPlayer, cmd, MoveHelper, &moveData);

    if (!vehicle)
        GameMovement->ProcessMovement(Cheat.LocalPlayer, &moveData);
    else
        CallVFunction<void(__thiscall*)(void*, CBasePlayer*, CMoveData*)>(vehicle, 5)(vehicle, Cheat.LocalPlayer, &moveData);


    Prediction->FinishMove(Cheat.LocalPlayer, cmd, &moveData);
    MoveHelper->ProcessImpacts();

    Cheat.LocalPlayer->PostThink();

    GameMovement->FinishTrackPredictionErrors(Cheat.LocalPlayer);
    MoveHelper->SetHost(nullptr);
    GameMovement->Reset();

    Prediction->bInPrediction = bOldInPrediction;
    Prediction->bIsFirstTimePredicted = bOldIsFirstPrediction;
}

void CPrediction::End() {
    if (!MoveHelper)
        return;

    GlobalVars->curtime = flOldCurrentTime;
    GlobalVars->frametime = flOldFrameTime;
    GlobalVars->tickcount = iOldTickCount;

    if (GlobalVars->frametime > 0.f)
        Cheat.LocalPlayer->m_nTickBase()++;

    *Cheat.LocalPlayer->GetCurrentCommand() = nullptr;
    *predictionRandomSeed = -1;
    *predictionEntity = nullptr;
}
Меня сильно смущает то, что функция player->Think() никогда не вызывается, все время не проходит проверка thinkticks <= 0 (23 строка).
Все нетвары я сверял с оригинальной функцией CPrediction::RunCommand, оффсеты по паттернам от туда же брал, вроде все верно.

CBasePlayer.cpp:
int CBasePlayer::GetButtonForced() {
    static const uint32_t m_afButtonsForced = *reinterpret_cast<uint32_t*>(Utils::PatternScan("client.dll", "8B 86 ? ? ? ? 09 47 30", 0x2));
    return *(int*)(this + m_afButtonsForced);
}

int CBasePlayer::GetButtonDisabled() {
    static const uint32_t m_afButtonsDisabled = *reinterpret_cast<uint32_t*>(Utils::PatternScan("client.dll", "8B 86 ? ? ? ? F7 D0 21 47 30", 0x2));
    return *(int*)(this + m_afButtonsDisabled);
}

CUserCmd** CBasePlayer::GetCurrentCommand() {
    static const uint32_t m_pCurrentCommand = *reinterpret_cast<uint32_t*>(Utils::PatternScan("client.dll", "89 BE ? ? ? ? E8 ? ? ? ? 85 FF", 0x2));
    return (CUserCmd**)((uint32_t)this + m_pCurrentCommand);
}

CUserCmd& CBasePlayer::GetLastCommand() {
    static const uint32_t m_LastCmd = *reinterpret_cast<uint32_t*>(Utils::PatternScan("client.dll", "8D 8E ? ? ? ? 89 5C 24 3C", 0x2));
    return *(CUserCmd*)((uint32_t)this + m_LastCmd);
}

void CBasePlayer::Think() {
    CallVFunction<void(__thiscall*)(CBasePlayer*)>(this, 139)(this);
}

bool CBasePlayer::PhysicsRunThink(int nThinkMetod) {
    static auto __physicsRunThink = (bool(__thiscall*)(CBasePlayer*, int))Utils::PatternScan("client.dll", "55 8B EC 83 EC 10 53 56 57 8B F9 8B 87");
    return __physicsRunThink(this, nThinkMetod);
}

void CBasePlayer::PostThink() {
    CallVFunction<void(__thiscall*)(CBasePlayer*)>(this, 320)(this);
}


void CBasePlayer::SelectItem(const char* string, int subtype) {
    static auto select_item_fn = reinterpret_cast<void(__thiscall*)(void*, const char*, int)>(Utils::PatternScan("client.dll", "55 8B EC 56 8B F1 ? ? ? 85 C9 74 71 8B 06"));
    select_item_fn(this, string, subtype);
}

bool CBasePlayer::UsingStandardWeaponsInVehicle() {
    static auto fn = reinterpret_cast<bool(__thiscall*)(CBasePlayer*)>(Utils::PatternScan("client.dll", "56 57 8B F9 8B 97 ? ? ? ? 83 FA FF 74 43"));
    return fn(this);
}

void CBasePlayer::UpdateButtonState(int buttons) {
    m_afButtonsLast() = *m_nButtons();

    *m_nButtons() = buttons;
    int buttonsChanged = m_afButtonsLast() ^ buttons;

    m_afButtonsPressed() = buttonsChanged & buttons;
    m_afButtonsReleased() = buttonsChanged & (~buttons);
}

int& CBasePlayer::m_nImpulse() {
    static uint32_t _m_nImpulse = *reinterpret_cast<uint32_t*>(Utils::PatternScan("client.dll", "89 86 ? ? ? ? 8B 57 30", 0x2));
    return *(int*)(this + _m_nImpulse);
}
Подскажите, что не так, пожалуйста.
 
Пользователь
Статус
Онлайн
Регистрация
22 Июн 2020
Сообщения
185
Реакции[?]
69
Поинты[?]
41K
ЧВК EB_LAN
Эксперт
Статус
Оффлайн
Регистрация
26 Янв 2021
Сообщения
1,553
Реакции[?]
519
Поинты[?]
189K
Участник
Статус
Оффлайн
Регистрация
27 Фев 2019
Сообщения
1,125
Реакции[?]
395
Поинты[?]
50K
Скинь код хуков для даблтапа и крейтмува, а также как реализованы фейклаги.
 
Пользователь
Статус
Онлайн
Регистрация
22 Июн 2020
Сообщения
185
Реакции[?]
69
Поинты[?]
41K
каким хуком шифтишь?
Скинь код хуков для даблтапа и крейтмува, а также как реализованы фейклаги.
CL_Move:
void __cdecl hkCL_Move(float accamulatedExtraSamples, bool bFinalTick) {
    if (!Cheat.LocalPlayer || !Cheat.LocalPlayer->IsAlive())
        return oCL_Move(accamulatedExtraSamples, bFinalTick);

    if (Cheat.targetTickbaseShift > Cheat.tickbaseShift) {
        Cheat.tickbaseShift++;
        return;
    }

    oCL_Move(accamulatedExtraSamples, bFinalTick);

    Cheat.tickbaseShifting = true;
    for (Cheat.targetTickbaseShift = std::clamp(Cheat.targetTickbaseShift, 0, 14); Cheat.tickbaseShift > Cheat.targetTickbaseShift; Cheat.tickbaseShift--) {
        oCL_Move(accamulatedExtraSamples, bFinalTick);
    }
    Cheat.tickbaseShifting = false;
}
CreateMove:
void __stdcall CreateMove(int sequence_number, float sample_frametime, bool active, bool& bSendPacket) {
    static auto oCHLCCreateMove = (tCHLCCreateMove)Hooks::ClientVMT->GetOriginal(22);

    Cheat.LocalPlayer = (CBasePlayer*)EntityList->GetClientEntity(EngineClient->GetLocalPlayer());
    oCHLCCreateMove(Client, sequence_number, sample_frametime, active);

    CUserCmd* cmd = Input->GetUserCmd(sequence_number);
    CVerifiedUserCmd* verified = Input->GetVerifiedCmd(sequence_number);

    Cheat.tracedBullet = false;

    if (!cmd || !cmd->command_number || !Cheat.LocalPlayer || !Cheat.LocalPlayer->IsAlive())
        return oCHLCCreateMove(Client, sequence_number, sample_frametime, active);

    CBaseCombatWeapon* weapon = Cheat.LocalPlayer->GetActiveWeapon();

    if (!weapon)
        return;

    // pre_prediction

    CheatAntiAim->SlowWalk(cmd);

    Miscelleaneus::AutoJump(cmd);
    Miscelleaneus::AutoStrafe(cmd);

    QAngle storedAng = cmd->viewangles;
    Cheat.ServerTime = Utils::GetServerTime(cmd);

    if (ClientState->m_nDeltaTick > 0)
        Prediction->Update(ClientState->m_nDeltaTick, ClientState->m_nDeltaTick > 0, ClientState->m_nLastCommandAck, ClientState->m_nLastOutgoingCommand + ClientState->m_nChokedCommands);

    EnginePrediction->Start(cmd);

    // prediction

    auto backupVel = Cheat.LocalPlayer->m_vecVelocity();
    auto backupAbsVel = Cheat.LocalPlayer->m_vecAbsVelocity();

    Cheat.LocalPlayer->m_vecVelocity() = EnginePrediction->m_vecVelocity;
    Cheat.LocalPlayer->m_vecAbsVelocity() = EnginePrediction->m_vecAbsVelocity;
    weapon->UpdateAccuracyPenality();
    Cheat.weaponInaccuracy = weapon->GetInaccuracy();
    Cheat.weaponSpread = weapon->GetSpread();

    Cheat.LocalPlayer->m_vecVelocity() = backupVel;
    Cheat.LocalPlayer->m_vecAbsVelocity() = backupAbsVel;

    if (Misc.EdgeJump && Misc.EdgeJumpBind.GetState() && !(Cheat.LocalPlayer->m_fFlags() & FL_ONGROUND) && EnginePrediction->m_fFlags & FL_ONGROUND)
        cmd->buttons |= IN_JUMP;

    CheatAntiAim->FakeLag(cmd, bSendPacket);
    CheatAntiAim->FakeDuck(cmd, bSendPacket);
    CheatAntiAim->Angles(cmd, bSendPacket);

    Ragebot->Run(cmd, bSendPacket);

    if (!Cheat.tickbaseShifting)
        DoubleTap->CreateMove(cmd);

    cmd->viewangles.Normalize(Misc.AntiUntrusted);

    if (Cheat.tickbaseShifting) {
        bSendPacket = Cheat.tickbaseShift == 1;
        cmd->buttons &= ~IN_ATTACK;
    }

    if (bSendPacket) {
        Cheat.ShouldUpdateLocalAnims = true;
        Cheat.thirdpersonAngles = cmd->viewangles;
        if (!AntiAim.DesyncModifier.values[1] || Utils::RandomInt(0, 10) > 5)
            CheatAntiAim->jitter = !CheatAntiAim->jitter;
    }

    EnginePrediction->End();

    // createmove

    AutoPeek->CreateMove(cmd);

    Utils::FixMovement(cmd, storedAng);

    CheatAntiAim->LegMovement(cmd);

    if (cmd->buttons & IN_ATTACK && Cheat.LocalPlayer->GetActiveWeapon()->CanShoot() && !Cheat.tracedBullet) {
        Vector forward;
        Utils::AngleVectors(cmd->viewangles, forward);
        FireBulletData_t data;
        AutoWall->FireBullet(Cheat.LocalPlayer, Cheat.LocalPlayer->GetEyePosition(), Cheat.LocalPlayer->GetEyePosition() + forward * 8000, data);

        for (int i = 0; i < data.impactCount; i++) {
            Vector pos = data.impacts[i];

            DebugOverlay->AddBoxOverlay(pos, Vector(-1.5f, -1.5f, -1.5f), Vector(1.5f, 1.5f, 1.5f), QAngle(), Visuals.ClientImpactsColor.color.r, Visuals.ClientImpactsColor.color.g, Visuals.ClientImpactsColor.color.b, Visuals.ClientImpactsColor.color.a, Visuals.Duration);
        }
    }

    DoubleTap->blockCharge = false;

    verified->m_cmd = *cmd;
    verified->m_crc = cmd->GetChecksum();
}

__declspec(naked) void __fastcall hkCHLCCreateMove(IBaseClientDLL* thisptr, void*, int sequence_number, float input_sample_frametime, bool active) {
    __asm {
        push ebp
        mov  ebp, esp
        push ebx
        push esp
        push dword ptr[active]
        push dword ptr[input_sample_frametime]
        push dword ptr[sequence_number]
        call CreateMove
        pop  ebx
        pop  ebp
        retn 0Ch
    }
}
DoubleTap:
void CDoubleTap::CreateMove(CUserCmd* cmd) {
    static int peekingTicks = 0;

    Cheat.ticksToShift = 0;

    if (!Cheat.LocalPlayer || Cheat.LocalPlayer->m_iHealth() == 0) {
        Cheat.targetTickbaseShift = 0;
        return;
    }

    if (!RageBot.DoubleTapBind.GetState() || AntiAim.FakeDuckKey.GetState()) {
        Cheat.targetTickbaseShift = 0;
        return;
    }

    CBaseCombatWeapon* activeWeapon = Cheat.LocalPlayer->GetActiveWeapon();

    if (Cheat.tickbaseShift == 0) { // Need to charge
        if (activeWeapon->IsGrenade() || GlobalVars->realtime - Cheat.lastShotTime < 0.7f || GetAsyncKeyState(VK_LBUTTON) || blockCharge) {
            Cheat.targetTickbaseShift = 0;
            peekingTicks = 0;
            return;
        }
        else {
            Cheat.targetTickbaseShift = 12;
        }
    }
    else if (Cheat.tickbaseShift == 12) { // Charged, can doubletap now
        if (cmd->buttons & IN_ATTACK && activeWeapon->CanShoot() && !activeWeapon->IsGrenade()) {
            Cheat.targetTickbaseShift = 0;
            Cheat.lastShotTime = GlobalVars->realtime;
            peekingTicks = 0;
            return;
        }
        bool ispeeking = false;

        if (CheatAntiAim->IsPeeking()) {
            peekingTicks++;
            ispeeking = true;
        }
        else {
            peekingTicks = 0;
            ispeeking = false;
        }

        if (peekingTicks < 12 && ispeeking)
            Cheat.ticksToShift = 12;
    }
    else { // ???
        Cheat.targetTickbaseShift = 12;
    }
}
FakeLag:
void CAntiAim::FakeLag(CUserCmd* cmd, bool& bSendPacket) {
    static ConVar* sv_maxusrcmdprocessticks = CVar->FindVar("sv_maxusrcmdprocessticks");

    if (!AntiAim.FakeLagEnable)
        return;

    if (Cheat.LocalPlayer->m_MoveType() == MOVETYPE_NOCLIP || Cheat.LocalPlayer->m_fFlags() & FL_FROZEN || freezetime)
        return;

    CBaseCombatWeapon* activeWeapon = Cheat.LocalPlayer->GetActiveWeapon();

    if (!activeWeapon)
        return;

    if (activeWeapon->IsGrenade() && EnginePrediction->m_fThrowTime > GlobalVars->interval_per_tick * 2) {
        bSendPacket = true;

        return;
    }
    else if (cmd->buttons & IN_ATTACK && Cheat.LocalPlayer->GetActiveWeapon()->CanShoot() && !AntiAim.FakeDuckKey.GetState()) {
        bSendPacket = true;

        return;
    }

    int fakelagTicks = 0;
    int fakelagLimit = min(sv_maxusrcmdprocessticks->GetInt() - 2, AntiAim.FakeLagLimit);
    int fakelagMin = 1;

    if (Cheat.tickbaseShift > 0)
        fakelagLimit = 1;

    if (AntiAim.FakeDuckKey.GetState())
        fakelagMin = 14;

    if (Cheat.LocalPlayer->m_vecVelocity().Length() < 50) {
        fakelagTicks = 2;
    }
    else {
        fakelagTicks = int(64.0f / (Cheat.LocalPlayer->m_vecVelocity().Length() * GlobalVars->interval_per_tick) + 1);
    }

    if (AntiAim.FakeLagRandom)
        fakelagTicks = max(min(fakelagTicks + rand() % AntiAim.FakeLagRandom, fakelagLimit), fakelagMin);
    else
        fakelagTicks = max(min(fakelagTicks, fakelagLimit), fakelagMin);
    
    bSendPacket = ClientState->GetChokedCommands() >= fakelagTicks;

    static bool hasPeeked = false;

    if (IsPeeking()) {
        if (!hasPeeked) {
            hasPeeked = true;

            if (ClientState->GetChokedCommands() > 0)
                bSendPacket = true;
        }
    }
    else {
        hasPeeked = false;
    }
}
 
anonymous
Участник
Статус
Оффлайн
Регистрация
18 Окт 2022
Сообщения
608
Реакции[?]
216
Поинты[?]
144K
Prediction в данном случае к этому не имеет отношения, скорее всего это cl move/sendmove/writeusercmddeltatobuffer и вся эта хрень, коментируй хуки, дебажь, проверь фейклаги сначало потом постепенно добавляй функции.
Меня сильно смущает то, что функция player->Think() никогда не вызывается, все время не проходит проверка thinkticks <= 0 (23 строка).
Эта штука просто так не вызывается, поставь printf и смени команду с теров на кт и увидишь что к чему)
 
Пользователь
Статус
Онлайн
Регистрация
22 Июн 2020
Сообщения
185
Реакции[?]
69
Поинты[?]
41K
Prediction в данном случае к этому не имеет отношения, скорее всего это cl move/sendmove/writeusercmddeltatobuffer и вся эта хрень, коментируй хуки, дебажь, проверь фейклаги сначало потом постепенно добавляй функции.

Эта штука просто так не вызывается, поставь printf и смени команду с теров на кт и увидишь что к чему)
может мне какого нибудь фикса не хватает типа PhysicsSimulate?
 
Пользователь
Статус
Онлайн
Регистрация
22 Июн 2020
Сообщения
185
Реакции[?]
69
Поинты[?]
41K
Фейклаги больше не откидывают, но дт по прежнему анрегает, а еще первая пуля не попадает (из-за неверной тикбазы я так понимаю) в итоге 2 выстрела 0 попаданий, что значит фиксить тикбазу и как это делается
 
Начинающий
Статус
Оффлайн
Регистрация
1 Ноя 2022
Сообщения
40
Реакции[?]
8
Поинты[?]
0
Prediction в данном случае к этому не имеет отношения, скорее всего это cl move/sendmove/writeusercmddeltatobuffer и вся эта хрень, коментируй хуки, дебажь, проверь фейклаги сначало потом постепенно добавляй функции.

Эта штука просто так не вызывается, поставь printf и смени команду с теров на кт и увидишь что к чему)
Фейклаги больше не откидывают, но дт по прежнему анрегает, а еще первая пуля не попадает (из-за неверной тикбазы я так понимаю) в итоге 2 выстрела 0 попаданий, что значит фиксить тикбазу и как это делается
Как раз таки у ТСа есть неправильный код в предикшене. А именно : RunPreThink, RunThink делать это попросту не надо. Вопрос касательно даблтапа : cl_showerror 2 в консоль, увидишь ошибки по тикбейзу = делаешь фикс тикбейза, делается он досаточно просто.
может мне какого нибудь фикса не хватает типа PhysicsSimulate?
Именно там ты можешь зафиксить свой тикбейз.Можно это сделать так-же практически напрямую в предикшене а именно в RunCommand т.к весь предикшен игра в любом случае делает на клиенте.
Для более подробной информации можно глянуть вот сюда :
Пожалуйста, авторизуйтесь для просмотра ссылки.

Или же сюда :
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
anonymous
Участник
Статус
Оффлайн
Регистрация
18 Окт 2022
Сообщения
608
Реакции[?]
216
Поинты[?]
144K
Как раз таки у ТСа есть неправильный код в предикшене. А именно : RunPreThink, RunThink делать это попросту не надо. Вопрос касательно даблтапа : cl_showerror 2 в консоль, увидишь ошибки по тикбейзу = делаешь фикс тикбейза, делается он досаточно просто.

Именно там ты можешь зафиксить свой тикбейз.Можно это сделать так-же практически напрямую в предикшене а именно в RunCommand т.к весь предикшен игра в любом случае делает на клиенте.
Для более подробной информации можно глянуть вот сюда :
Пожалуйста, авторизуйтесь для просмотра ссылки.

Или же сюда :
Пожалуйста, авторизуйтесь для просмотра ссылки.
Мастер.
Согласен, но впринципе если ты хочешь как перфекционист ребилдить предикшн игры то нужно вызывать все функции вплоть до проверки на vehicle и имульсов там. Но тогда нужно и другое затрагивать т.к оверпредикт тоже плохо
reference:
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Пользователь
Статус
Онлайн
Регистрация
22 Июн 2020
Сообщения
185
Реакции[?]
69
Поинты[?]
41K
Как раз таки у ТСа есть неправильный код в предикшене. А именно : RunPreThink, RunThink делать это попросту не надо. Вопрос касательно даблтапа : cl_showerror 2 в консоль, увидишь ошибки по тикбейзу = делаешь фикс тикбейза, делается он досаточно просто.

Именно там ты можешь зафиксить свой тикбейз.Можно это сделать так-же практически напрямую в предикшене а именно в RunCommand т.к весь предикшен игра в любом случае делает на клиенте.
Для более подробной информации можно глянуть вот сюда :
Пожалуйста, авторизуйтесь для просмотра ссылки.

Или же сюда :
Пожалуйста, авторизуйтесь для просмотра ссылки.
вот я сейчас это и смотрю, пытаюсь скорректировать тикбазу в RunCommand:
RunCommand:
void __fastcall hkRunCommand(IPrediction* thisptr, void* edx, CBasePlayer* player, CUserCmd* cmd, IMoveHelper* moveHelper) {
    static auto oRunCommand = (tRunCommand)(Hooks::PredictionVMT->GetOriginal(19));

    if (!player || !cmd || player != Cheat.LocalPlayer)
        return oRunCommand(thisptr, edx, player, cmd, moveHelper);

    if (cmd->tick_count >= GlobalVars->tickcount + 72) {
        cmd->hasbeenpredicted = true;

        if (EngineClient->GetNetChannelInfo())
        {
            const auto outgoing = EngineClient->GetNetChannelInfo()->GetLatency(FLOW_OUTGOING);

            int serverTickcount = (outgoing / GlobalVars->interval_per_tick) + 3;
            player->m_nFinalPredictedTick() = serverTickcount;
        }

        player->SetAbsOrigin(player->m_vecOrigin());
        if (GlobalVars->frametime > 0.0f && !Prediction->bEnginePaused) {
            ++player->m_nTickBase();
        }

        return;
    }

    int backupTickbase = Cheat.LocalPlayer->m_nTickBase();

    oRunCommand(thisptr, edx, player, cmd, moveHelper);

    for (int i = 0; i < Cheat.shiftedCommands.size(); i++) {
        auto& command = Cheat.shiftedCommands[i];
        if (command == cmd->command_number || command + 1 == cmd->command_number) {
            Cheat.LocalPlayer->m_nTickBase() = backupTickbase;
            Cheat.shiftedCommands.erase(Cheat.shiftedCommands.begin() + i);
            break;
        }
    }

    MoveHelper = moveHelper;
}
На локалке с пинг 0 работает, но стоит мне прописать net_fakelag 5 как сразу появлется пред. еррор
 
Начинающий
Статус
Оффлайн
Регистрация
1 Ноя 2022
Сообщения
40
Реакции[?]
8
Поинты[?]
0
Мастер.
Согласен, но впринципе если ты хочешь как перфекционист ребилдить предикшн игры то нужно вызывать все функции вплоть до проверки на vehicle и имульсов там. Но тогда нужно и другое затрагивать т.к оверпредикт тоже плохо
reference:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Вот именно это и будет оверпредикт, никто полностью предикшен переписывать/ребилдить не будет ( по крайней мере не один p2c так не делает ). Импульсы игра фиксит, WeaponSelect тоже в порядке, да и команды,кнопки в целом тоже. Углы и прочий ребилд = юзелес т.к глянув в CPrediction::Update( ... ) мы можем увидеть что игра всё это уже делает за нас. Тоесть по логике обновив предикшен в критмуве мы уже половину да починили ( OnGround и прочее фиксить не нужно ).
CPrediction::PerformPrediction уже вызвается в CPrediction::Update .

upd : ВНИМАНИЕ ! С ними всё в порядке в том случае если ничего не ломать.
upd2 : прикрепил рефы на гитхаб, надеюсь в этой теме будет полезно.
Пожалуйста, авторизуйтесь для просмотра ссылки.
( PerformPrediction вызывается и проверяется на тру в CPrediction::Update () )
 
like amiri in my mind
Пользователь
Статус
Оффлайн
Регистрация
4 Дек 2022
Сообщения
308
Реакции[?]
54
Поинты[?]
1K
if (EngineClient->GetNetChannelInfo()) { const auto outgoing = EngineClient->GetNetChannelInfo()->GetLatency(FLOW_OUTGOING); int serverTickcount = (outgoing / GlobalVars->interval_per_tick) + 3; player->m_nFinalPredictedTick() = serverTickcount; }
есть какой-то референс на этот кусок?
 
Начинающий
Статус
Оффлайн
Регистрация
1 Ноя 2022
Сообщения
40
Реакции[?]
8
Поинты[?]
0
есть какой-то референс на этот кусок?
Не правильный кусок куда, внимания не стоит.
Код попросту не правильный как и весь хук в целом.
вот я сейчас это и смотрю, пытаюсь скорректировать тикбазу в RunCommand:
RunCommand:
void __fastcall hkRunCommand(IPrediction* thisptr, void* edx, CBasePlayer* player, CUserCmd* cmd, IMoveHelper* moveHelper) {
    static auto oRunCommand = (tRunCommand)(Hooks::PredictionVMT->GetOriginal(19));

    if (!player || !cmd || player != Cheat.LocalPlayer)
        return oRunCommand(thisptr, edx, player, cmd, moveHelper);

    if (cmd->tick_count >= GlobalVars->tickcount + 72) {
        cmd->hasbeenpredicted = true;

        if (EngineClient->GetNetChannelInfo())
        {
            const auto outgoing = EngineClient->GetNetChannelInfo()->GetLatency(FLOW_OUTGOING);

            int serverTickcount = (outgoing / GlobalVars->interval_per_tick) + 3;
            player->m_nFinalPredictedTick() = serverTickcount;
        }

        player->SetAbsOrigin(player->m_vecOrigin());
        if (GlobalVars->frametime > 0.0f && !Prediction->bEnginePaused) {
            ++player->m_nTickBase();
        }

        return;
    }

    int backupTickbase = Cheat.LocalPlayer->m_nTickBase();

    oRunCommand(thisptr, edx, player, cmd, moveHelper);

    for (int i = 0; i < Cheat.shiftedCommands.size(); i++) {
        auto& command = Cheat.shiftedCommands[i];
        if (command == cmd->command_number || command + 1 == cmd->command_number) {
            Cheat.LocalPlayer->m_nTickBase() = backupTickbase;
            Cheat.shiftedCommands.erase(Cheat.shiftedCommands.begin() + i);
            break;
        }
    }

    MoveHelper = moveHelper;
}
На локалке с пинг 0 работает, но стоит мне прописать net_fakelag 5 как сразу появлется пред. еррор
C++:
        if (EngineClient->GetNetChannelInfo())
        {
            // получаем пинг
            const auto outgoing = EngineClient->GetNetChannelInfo()->GetLatency(FLOW_OUTGOING);

            // дальше просто бесполезный кусок кода
            int serverTickcount = (outgoing / GlobalVars->interval_per_tick) + 3;
            player->m_nFinalPredictedTick() = serverTickcount;
        }
Тут ты ломаешь m_nFinalPredictedTick а вместе с ним и пол предикшена,нетворкинга в игре.
Трогать его не нужно.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Игра сделала это, фикса этого *нетвара* попросту нету и он не нужен .
Тут тикбейз начинает ходить ( 1,2,3,4,5 etc.. )
Пожалуйста, авторизуйтесь для просмотра ссылки.
и тут вдруг происходит эксплойт , ЭВРИКА ! тикбейз смещается как пример 14 тиков !!!
Ваша задача компенсировать тикбейз.
 
Участник
Статус
Оффлайн
Регистрация
21 Сен 2019
Сообщения
594
Реакции[?]
250
Поинты[?]
23K
Не регает дт потому что при шифте тикбазы через cl_move нужно отправлять пакет только с последней командой (send_packet = m_shift_ticks == 1).
Фикс тикбазы неверный. Лучше(подчеркну ЛУЧШЕ, но не значит, что RunCommand это абсолютно неверный вариант) это делать через PhysicsSimulate.
Пожалуйста, авторизуйтесь для просмотра ссылки.

Самый лучший фикс тикбазы - имплементация серверного AdjustPlayerTimeBase с учётом пинга(в общем надо каким-то образом получить серверный тиккаунт). Тогда чит сам все будет фиксить, как при зарядке, так и при шифте тикбазы.

Отсутствие фикса тикбазы насколько мне известно не должно влиять на регистрацию выстрелов(но из-за этого у тебя конечно чит ломается, и ты можешь миссать).

Возможно ты также столкнешься с проблемой рандомных анрегов(возвращения пуль) шифтя через cl_move, по крайней мере я с этим столкнулся, и меня это вынудило просто свичнуться на олдовый, но рабочий, как часы, метод шифта тикбазы.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
1 Ноя 2022
Сообщения
40
Реакции[?]
8
Поинты[?]
0
Не регает дт потому что при шифте тикбазы через cl_move нужно отправлять пакет только с последней командой (send_packet = m_shift_ticks == 1).
Если что метод который выложили на юц правильный НО ! это лишь пример того как он работает, в идеале же сохранять пакет на шифте а потом уже сравнивать его и работать с ним дальше. Немного не правильно будет разбирать то как нужно делать по простому примеру кода на юц.
Фикс тикбазы неверный. Лучше(подчеркну ЛУЧШЕ, но не значит, что RunCommand это абсолютно неверный вариант) это делать через PhysicsSimulate.
Пожалуйста, авторизуйтесь для просмотра ссылки.

Самый лучший фикс тикбазы - имплементация серверного AdjustPlayerTimeBase с учётом пинга(в общем надо каким-то образом получить серверный тиккаунт).
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
Вспоминаем что физик симулейт делает AdjustPlayerTimeBase на серваке, нам же нужно пофиксить наш тикбейз на клиенте, поэтому при правильном фиксе разницы между ними не будет ) Просто работая в RunCommand мы избежим многие *вложенности*
Отсутствие фикса тикбазы насколько мне известно не должно влиять на регистрацию выстрелов(но из-за этого у тебя конечно чит ломается, и ты можешь миссать).
Влияет , так-же как и на *скорость* самого даблтапа.
вынудило просто свичнуться на олдовый, но рабочий, как часы, метод шифта тикбазы.
CLMove метод лучше будет, т.к он фиксит большинство проблем за нас. Для клмува нам просто нужно немного поработать с пакетами и тикбейзом естественно ( идеальный пример - пакет менеджер в вантапусе, там практически всё идеально хоть и до ж0пы усложнено )

upd : Ну а так разницы нет где мы делаем эксплойты, главное руки прямые. Хоть в SendDatagram делай
 
Пользователь
Статус
Онлайн
Регистрация
22 Июн 2020
Сообщения
185
Реакции[?]
69
Поинты[?]
41K
Не регает дт потому что при шифте тикбазы через cl_move нужно отправлять пакет только с последней командой (send_packet = m_shift_ticks == 1).
1 сообщение 65 строка CreateMove, уже делаю это
Лучше(подчеркну ЛУЧШЕ, но не значит, что RunCommand это абсолютно неверный вариант) это делать через PhysicsSimulate
Уже переписал под PhysicsSimulate, на локалке с пинг 0 отлично работает, чуть пинг больше нуля снова пред. еррор
мусор m_nFinalPredictedTick убрал
чуть позже проверю, т.к. пока с другой проблемой разбираюсь
 
Сверху Снизу