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

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

Код предикта:
Prediction.cpp:
Expand Collapse Copy
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:
Expand Collapse Copy
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);
}

Подскажите, что не так, пожалуйста.
 
сенд пакет тру элвейс он сделай и протести ещё раз
 
сенд пакет тру элвейс он сделай и протести ещё раз
1677080912816.png

даблтап по прежнему анрегает, но то что откидывать не будет - логично, я же написал: откидывает с фейклагами
 
Скинь код хуков для даблтапа и крейтмува, а также как реализованы фейклаги.
 
каким хуком шифтишь?
Скинь код хуков для даблтапа и крейтмува, а также как реализованы фейклаги.
CL_Move:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
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;
    }
}
 
Prediction в данном случае к этому не имеет отношения, скорее всего это cl move/sendmove/writeusercmddeltatobuffer и вся эта хрень, коментируй хуки, дебажь, проверь фейклаги сначало потом постепенно добавляй функции.
Меня сильно смущает то, что функция player->Think() никогда не вызывается, все время не проходит проверка thinkticks <= 0 (23 строка).
Эта штука просто так не вызывается, поставь printf и смени команду с теров на кт и увидишь что к чему)
 
Prediction в данном случае к этому не имеет отношения, скорее всего это cl move/sendmove/writeusercmddeltatobuffer и вся эта хрень, коментируй хуки, дебажь, проверь фейклаги сначало потом постепенно добавляй функции.

Эта штука просто так не вызывается, поставь printf и смени команду с теров на кт и увидишь что к чему)
может мне какого нибудь фикса не хватает типа PhysicsSimulate?
 
Фейклаги больше не откидывают, но дт по прежнему анрегает, а еще первая пуля не попадает (из-за неверной тикбазы я так понимаю) в итоге 2 выстрела 0 попаданий, что значит фиксить тикбазу и как это делается
 
Prediction в данном случае к этому не имеет отношения, скорее всего это cl move/sendmove/writeusercmddeltatobuffer и вся эта хрень, коментируй хуки, дебажь, проверь фейклаги сначало потом постепенно добавляй функции.

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

Или же сюда :
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Как раз таки у ТСа есть неправильный код в предикшене. А именно : RunPreThink, RunThink делать это попросту не надо. Вопрос касательно даблтапа : cl_showerror 2 в консоль, увидишь ошибки по тикбейзу = делаешь фикс тикбейза, делается он досаточно просто.

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

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

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

Или же сюда :
Пожалуйста, авторизуйтесь для просмотра ссылки.
вот я сейчас это и смотрю, пытаюсь скорректировать тикбазу в RunCommand:
RunCommand:
Expand Collapse Copy
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 как сразу появлется пред. еррор
 
Мастер.
Согласен, но впринципе если ты хочешь как перфекционист ребилдить предикшн игры то нужно вызывать все функции вплоть до проверки на vehicle и имульсов там. Но тогда нужно и другое затрагивать т.к оверпредикт тоже плохо
reference:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Вот именно это и будет оверпредикт, никто полностью предикшен переписывать/ребилдить не будет ( по крайней мере не один p2c так не делает ). Импульсы игра фиксит, WeaponSelect тоже в порядке, да и команды,кнопки в целом тоже. Углы и прочий ребилд = юзелес т.к глянув в CPrediction::Update( ... ) мы можем увидеть что игра всё это уже делает за нас. Тоесть по логике обновив предикшен в критмуве мы уже половину да починили ( OnGround и прочее фиксить не нужно ).
CPrediction::PerformPrediction уже вызвается в CPrediction::Update .

upd : ВНИМАНИЕ ! С ними всё в порядке в том случае если ничего не ломать.
upd2 : прикрепил рефы на гитхаб, надеюсь в этой теме будет полезно.
Пожалуйста, авторизуйтесь для просмотра ссылки.
( PerformPrediction вызывается и проверяется на тру в CPrediction::Update () )
 
if (EngineClient->GetNetChannelInfo()) { const auto outgoing = EngineClient->GetNetChannelInfo()->GetLatency(FLOW_OUTGOING); int serverTickcount = (outgoing / GlobalVars->interval_per_tick) + 3; player->m_nFinalPredictedTick() = serverTickcount; }
есть какой-то референс на этот кусок?
 
есть какой-то референс на этот кусок?
Не правильный кусок куда, внимания не стоит.
Код попросту не правильный как и весь хук в целом.
вот я сейчас это и смотрю, пытаюсь скорректировать тикбазу в RunCommand:
RunCommand:
Expand Collapse Copy
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++:
Expand Collapse Copy
        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 тиков !!!
Ваша задача компенсировать тикбейз.
 
Не регает дт потому что при шифте тикбазы через cl_move нужно отправлять пакет только с последней командой (send_packet = m_shift_ticks == 1).
Фикс тикбазы неверный. Лучше(подчеркну ЛУЧШЕ, но не значит, что RunCommand это абсолютно неверный вариант) это делать через PhysicsSimulate.
Пожалуйста, авторизуйтесь для просмотра ссылки.

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

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

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

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

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