Гайд Как добавить Doubletap and Hide Shots(by @violanes)

  • Автор темы Автор темы 4byv4ne
  • Дата начала Дата начала
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
26 Июл 2019
Сообщения
413
Реакции
136
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
И так. Недавно один человек под ником @violanes скинул исходники дт и hide shots под ксгосимпл. Сразу скажу, этот гайд для тех, кто пытался сделать дт и для тех, у кого посыпались ошибки. Ссылка на исходники дт -
https://yougame.biz/threads/134913/ (Если что, неееееееееееееееееееее реклама, не переходить ни в коем случае:da:)
Так как наши пастеры не справились с задачей додумать код, то скину тут все действия для его фикса)
Поехали!
В Hooks.hpp в namespace index после void Shutdown(); добавляем inline vfunc_hook prediction_hook;
После constexpr auto LockCursor = 67; добавляем constexpr auto RunCommand = 19;
Далее переходим в Hooks.cpp и после sv_cheats.setup(sv_cheats_con); добавляем prediction_hook.setup(g_Prediction);
А после sv_cheats.hook_index(index::SvCheatsGetBool, hkSvCheatsGetBool); вставляем prediction_hook.hook_index(index::RunCommand, hkRunCommand);
Заменяем весь файл CClientState.hpp таким содержанием:

C++:
Expand Collapse Copy
#pragma once

#include <cstdint>

// Created with ReClass.NET by KN4CK3R
#pragma pack(push, 1)

class INetMsg
{
public:
    virtual    ~INetMsg() = default;

    virtual void SetNetChan(void*) = 0;
    virtual void SetReliable(bool) = 0;
    virtual bool Process() = 0;
    virtual    bool ReadFromBuffer(void*) = 0;
    virtual    bool WriteToBuffer(void*) = 0;
    virtual bool IsReliable() const = 0;
    virtual int    GetType() const = 0;
    virtual int    GetGroup() const = 0;
    virtual const char* GetName() const = 0;
    virtual void* GetNetChannel() const = 0;
    virtual const char* ToString() const = 0;
};
class INetChannel
{
public:

    uint8_t pad_0x0000[0x17];
    bool m_bShouldDelete;
    int m_nOutSequenceNr;
    int m_nInSequenceNr;
    int m_nOutSequenceNrAck;
    int m_nOutReliableState;
    int m_nInReliableState;
    int m_nChokedPackets;
};

class CClockDriftMgr
{
public:
    float m_ClockOffsets[16];   //0x0000
    uint32_t m_iCurClockOffset; //0x0044
    uint32_t m_nServerTick;     //0x0048
    uint32_t m_nClientTick;     //0x004C
}; //Size: 0x0050

class CClientState {
public:
    void ForceFullUpdate() {
        *reinterpret_cast<int*>(std::uintptr_t(this) + 0x174) = -1;
    }

    char pad_0000[148]; //0x0000
    INetChannel* m_NetChannel; //0x0094
    char pad_0098[8]; //0x0098
    uint32_t m_nChallengeNr; //0x00A0
    char pad_00A4[100]; //0x00A4
    uint32_t m_nSignonState; //0x0108
    char pad_010C[8]; //0x010C
    float m_flNextCmdTime; //0x0114
    uint32_t m_nServerCount; //0x0118
    uint32_t m_nCurrentSequence; //0x011C
    char pad_0120[84]; //0x0120
    uint32_t m_nDeltaTick; //0x0174
    bool m_bPaused; //0x0178
    char pad_0179[7]; //0x0179
    uint32_t m_nViewEntity; //0x0180
    uint32_t m_nPlayerSlot; //0x0184
    char m_szLevelName[260]; //0x0188
    char m_szLevelNameShort[80]; //0x028C
    char m_szGroupName[80]; //0x02B4
    char pad_02DC[92]; //0x02DC
    uint32_t m_nMaxClients; //0x0310
    char pad_0314[18820]; //0x0314
    float m_flLastServerTickTime; //0x4C98
    bool insimulation; //0x4C9C
    char pad_4C9D[3]; //0x4C9D
    uint32_t oldtickcount; //0x4CA0
    float m_tickRemainder; //0x4CA4
    float m_frameTime; //0x4CA8
    uint32_t m_nLastOutgoingCmd; //0x4CAC
    uint32_t m_nChokedCmds; //0x4CB0 new = 4D28
    uint32_t last_command_ack; //0x4CB4
    uint32_t command_ack; //0x4CB8
    uint32_t m_nSoundSequence; //0x4CBC
    char pad_4CC0[80]; //0x4CC0
    Vector viewangles; //0x4D10
    char pad_4D1C[208]; //0x4D1C
}; //Size: 0x4D1C

#pragma pack(pop)

static_assert(FIELD_OFFSET(CClientState, m_NetChannel) == 0x0094, "Wrong struct offset");
static_assert(FIELD_OFFSET(CClientState, m_nCurrentSequence) == 0x011C, "Wrong struct offset");
static_assert(FIELD_OFFSET(CClientState, m_nDeltaTick) == 0x0174, "Wrong struct offset");
Специально для тех людей, которые копировали хуки CreateMove и FrameStageNotify. Их не надо было копировать! Надо было только дополнить!
После:
C++:
Expand Collapse Copy
if (!cmd || !cmd->command_number)
            return;
Добавить:

C++:
Expand Collapse Copy
if (!g_ViolanesPaster.CanProcessPacket(cmd))
        {
            bSendPacket = false;
            return;
        }

        g_ViolanesPaster.g_nTicks = cmd->tick_count;
        g_ViolanesPaster.DoubleTap(cmd, &bSendPacket);
        g_ViolanesPaster.ShiftTickbase(cmd, bSendPacket);
После:
C++:
Expand Collapse Copy
static auto ofunc = hlclient_hook.get_original<decltype(&hkFrameStageNotify)>(index::FrameStageNotify);
        // may be u will use it lol
Добавить:
C++:
Expand Collapse Copy
if (!g_EngineClient->IsInGame() || !g_EngineClient->IsConnected() || !g_LocalPlayer)
            g_ViolanesPaster.ResetData();
Всё, вы спастили дт и хайд шотс! Надеюсь, как добавлять кнопки не надо говорить)
P.S Как в сурсах вилки говорилось, для дт нужен Engine Prediction. Если у вас его нет, значит вам надо его спастить с другого источника)(ну или отсюда же)
P.P.S Спасибо @Dreammm за указанную ошибку)
В Hooks.hpp после int __fastcall hkDoPostScreenEffects(void* _this, int, int a1); добавляем void __fastcall hkRunCommand(IPrediction* m_pPrediction, uint32_t, C_BasePlayer* m_pPlayer, CUserCmd* m_pCmd, IMoveHelper* m_pMoveHelper);

У кого не получилось из других источников спастить Engine Prediction, оставлю тут исходник. Для ксгосимпла ready-to-paste)
Создаём два файла: predictionsystem.cpp и predictionsystem.h .
C++:
Expand Collapse Copy
#include "predictionsystem.h"

namespace Prediction
{
    float m_flOldCurTime;
    float m_flOldFrametime;
    CMoveData moveData;

    int* predictionRandomSeed = NULL;
    C_BasePlayer* predictionPlayer = NULL;
    void Init() {
        predictionRandomSeed = *(int**)(Utils::FindSignature(("client_panorama.dll"), ("8B 0D ? ? ? ? BA ? ? ? ? E8 ? ? ? ? 83 C4 04")) + 2);
        predictionPlayer = *reinterpret_cast<C_BasePlayer**>(Utils::FindSignature(("client_panorama.dll"), "89 35 ? ? ? ? F3 0F 10 46") + 2);
    }
    void StartPrediction(CUserCmd* pCmd, C_BasePlayer* entity) {
        *predictionRandomSeed = MD5_PseudoRandom(pCmd->command_number) & 0x7FFFFFFF;
        predictionPlayer = entity;

        m_flOldCurTime = g_GlobalVars->curtime;
        m_flOldFrametime = g_GlobalVars->frametime;

        g_GlobalVars->curtime = entity->m_nTickBase() * g_GlobalVars->interval_per_tick;
        g_GlobalVars->frametime = g_GlobalVars->interval_per_tick;

        Vector oldVelocity = entity->m_vecVelocity();

        //Here we're doing CBasePlayer::UpdateButtonState
        moveData.m_nButtons = pCmd->buttons;
        int buttonsChanged = pCmd->buttons ^ *reinterpret_cast<int*>(uintptr_t(entity) + 0x31E8);
        *reinterpret_cast<int*>(uintptr_t(entity) + 0x31DC) = (uintptr_t(entity) + 0x31E8);
        *reinterpret_cast<int*>(uintptr_t(entity) + 0x31E8) = pCmd->buttons;
        *reinterpret_cast<int*>(uintptr_t(entity) + 0x31E0) = pCmd->buttons & buttonsChanged;  //m_afButtonPressed ~ The changed ones still down are "pressed"
        *reinterpret_cast<int*>(uintptr_t(entity) + 0x31E4) = buttonsChanged & ~pCmd->buttons; //m_afButtonReleased ~ The ones not down are "released"

        g_GameMovement->StartTrackPredictionErrors(entity);

        memset(&moveData, 0, sizeof(CMoveData));
        g_MoveHelper->SetHost(entity);
        g_Prediction->SetupMove(entity, pCmd, g_MoveHelper, &moveData);
        g_GameMovement->ProcessMovement(entity, &moveData);
        g_Prediction->FinishMove(entity, pCmd, &moveData);

        entity->m_vecVelocity() = oldVelocity;
    }

    void EndPrediction(C_BasePlayer* entity) {
        g_GameMovement->FinishTrackPredictionErrors(entity);
        g_MoveHelper->SetHost(nullptr);

        *predictionRandomSeed = -1;
        predictionPlayer = nullptr;

        g_GlobalVars->curtime = m_flOldCurTime;
        g_GlobalVars->frametime = m_flOldFrametime;
    }
}
C++:
Expand Collapse Copy
#pragma once

#include "../options.hpp"

#include "../valve_sdk/csgostructs.hpp"

#include "../helpers/math.hpp"

#include "../helpers/utils.hpp"

#include "../singleton.hpp"

#include "../helpers/input.hpp"


#include <deque>


namespace Prediction

{

    void Init();

    void StartPrediction(CUserCmd* pCmd, C_BasePlayer* entity);

    void Predict();

    void EndPrediction(C_BasePlayer* entity);

}
Определение для Utils::FindSignature:
Где вставите - по идее неважно.
C++:
Expand Collapse Copy
#include <Psapi.h>
#define INRANGE(x,a,b)   (x >= a && x <= b)
#define GET_BYTE( x )    (GET_BITS(x[0]) << 4 | GET_BITS(x[1]))
#define GET_BITS( x )    (INRANGE((x&(~0x20)),'A','F') ? ((x&(~0x20)) - 'A' + 0xa) : (INRANGE(x,'0','9') ? x - '0' : 0))
    uintptr_t FindSignature(const char* szModule, const char* szSignature)
    {
        const char* pat = szSignature;
        DWORD firstMatch = 0;
        DWORD rangeStart = reinterpret_cast<DWORD>(GetModuleHandleA(szModule));
        MODULEINFO miModInfo;
        GetModuleInformation(GetCurrentProcess(), reinterpret_cast<HMODULE>(rangeStart), &miModInfo, sizeof(MODULEINFO));
        DWORD rangeEnd = rangeStart + miModInfo.SizeOfImage;
        for (DWORD pCur = rangeStart; pCur < rangeEnd; pCur++)
        {
            if (!*pat)
                return firstMatch;

            if (*(PBYTE)pat == '\?' || *(BYTE*)pCur == GET_BYTE(pat))
            {
                if (!firstMatch)
                    firstMatch = pCur;

                if (!pat[2])
                    return firstMatch;

                if (*(PWORD)pat == '\?\?' || *(PBYTE)pat != '\?')
                    pat += 3;

                else
                    pat += 2;
            }
            else
            {
                pat = szSignature;
                firstMatch = 0;
            }
        }
        return NULL;
    }
После char ConsoleReadKey(); добавить uintptr_t FindSignature(const char* szModule, const char* szSignature);
Далее идём в Hooks.cpp и после prediction_hook.setup(g_Prediction); добавляем Prediction::Init();
Так, стоп, забыл. После #include "Tickbase.h" добавляем #include "features/predictionsystem.h"(все пути меняете на свои)
Спускаемся в CreateMove и добавляем:

C++:
Expand Collapse Copy
Prediction::StartPrediction(cmd, g_LocalPlayer); {
//там легитбот, рейджбот, дт, антиаимы, e.t.c)
}
Prediction::EndPrediction(g_LocalPlayer);
Всё, вы спастили и Engine Prediction. Удачи использовать)
 
Последнее редактирование:
Красава, что помог юным пастерам дописать кодик. Гайд нормальный. Жду сдедующий гайд как сделать addon с топ резольвером. Добавь как спастить engine, а то многие не смогут.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Красава, что помог юным пастерам дописать кодик. Гайд нормальный. Жду сдедующий гайд как сделать addon с топ резольвером. Добавь как спастить engine, а то многие не смогут.
К сожалению, я не пишу аддоны) Тем более с ресиком)
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ке
И так. Недавно один человек под ником @violanes скинул исходники дт и hide shots под ксгосимпл.(https://yougame.biz/threads/134913/ Если что, неееееееееееееееееееее реклама, не переходить ни в коем случае:da:)
Так как наши пастеры не справились с задачей додумать код, то скину тут все действия для его фикса)
Поехали!
В Hooks.hpp в namespace index после void Shutdown(); добавляем inline vfunc_hook prediction_hook;
Далее переходим в Hooks.cpp и после sv_cheats.setup(sv_cheats_con); добавляем prediction_hook.setup(g_Prediction);
А после sv_cheats.hook_index(index::SvCheatsGetBool, hkSvCheatsGetBool); вставляем prediction_hook.hook_index(index::RunCommand, hkRunCommand);
В CClientState.hpp после 71-й строки добавляем
C++:
Expand Collapse Copy
int m_nLastOutgoingCmd;        //0x4CAC
int m_nChokedCmds;             //0x4CB0
Специально для тех людей, которые копировали хуки CreateMove и FrameStageNotify. Их не надо было копировать! Надо было только дополнить!
После:
C++:
Expand Collapse Copy
if (!cmd || !cmd->command_number)
            return;
Добавить:

C++:
Expand Collapse Copy
if (!g_ViolanesPaster.CanProcessPacket(cmd))
        {
            bSendPacket = false;
            return;
        }

        g_ViolanesPaster.g_nTicks = cmd->tick_count;
        g_ViolanesPaster.DoubleTap(cmd, &bSendPacket);
        g_ViolanesPaster.ShiftTickbase(cmd, bSendPacket);
После:
C++:
Expand Collapse Copy
static auto ofunc = hlclient_hook.get_original<decltype(&hkFrameStageNotify)>(index::FrameStageNotify);
        // may be u will use it lol
Добавить:
C++:
Expand Collapse Copy
if (!g_EngineClient->IsInGame() || !g_EngineClient->IsConnected() || !g_LocalPlayer)
            g_ViolanesPaster.ResetData();
Всё, вы спастили дт и хайд шотс! Надеюсь, как добавлять кнопки не надо говорить)
P.S Как в сурсах вилки говорилось, для дт нужен Engine Prediction. Если у вас его нет, значит вам надо его спастить с другого источника)
ето для симла?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Дополнил гайд добавлением Engine Prediction-a. Но сразу скажу: для дт он может быть неправильным.

P.S Ахахахахах, поехали хейтеры) Видимо горят с гайдов, которые помогают пастерам:da:
 
Одобряю,ахуенный гайд но зря ты это сделал
Изначально код был готовый и сделать его могли разве что не тупые,а сейчас и тупые тоже
 
Дополнил гайд добавлением Engine Prediction-a. Но сразу скажу: для дт он может быть неправильным.

P.S Ахахахахах, поехали хейтеры) Видимо горят с гайдов, которые помогают пастерам:da:
Чел блять я не удивлюсь если скоо будет 3 тап в 1тик.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
  • Мне нравится
Реакции: Tan
Чел блять я не удивлюсь если скоо будет 3 тап в 1тик.
Трипл тап уже существует )
Правда луа и правда в ските
Но это не совсем триплтап да и не совсем в тик
Это что то типо обычный выстрел + дт = профит
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Одобряю,ахуенный гайд но зря ты это сделал
Изначально код был готовый и сделать его могли разве что не тупые,а сейчас и тупые тоже
Так гайд специально сделан для ппастеров, которые блять не шарят и вообще пастят первую минуту(но это уже оффтоп)
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Трипл тап уже существует )
Правда луа и правда в ските
Но это не совсем триплтап да и не совсем в тик
Это что то типо обычный выстрел + дт = профит
в ските уже нельзя такое сделать тут в ските даже даже не даблтапает часто) а просто стреляет просто кодер сын шлюхи ) даже луа не помогают с этой хуйней
 
гайд не полный,нету ни хуков,ни самой вызываемой функции
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
гайд не полный,нету ни хуков,ни самой вызываемой функции
Здравствуйте. Ссылка на исходники хуков и т.д оставлена. Этот гайд - дополнение для тех, у кого куча ошибок и для тех, кто не гуглил
 
дайте индекс runcommand'a
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ждем монеона с хс и дт
 

Похожие темы

Ответы
63
Просмотры
18K
Назад
Сверху Снизу