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

Забаненный
Статус
Оффлайн
Регистрация
26 Июл 2019
Сообщения
412
Реакции[?]
136
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
И так. Недавно один человек под ником 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++:
#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++:
if (!cmd || !cmd->command_number)
            return;
Добавить:

C++:
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++:
static auto ofunc = hlclient_hook.get_original<decltype(&hkFrameStageNotify)>(index::FrameStageNotify);
        // may be u will use it lol
Добавить:
C++:
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++:
#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++:
#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++:
#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++:
Prediction::StartPrediction(cmd, g_LocalPlayer); {
//там легитбот, рейджбот, дт, антиаимы, e.t.c)
}
Prediction::EndPrediction(g_LocalPlayer);
Всё, вы спастили и Engine Prediction. Удачи использовать)
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
19 Мар 2019
Сообщения
575
Реакции[?]
115
Поинты[?]
0
Красава, что помог юным пастерам дописать кодик. Гайд нормальный. Жду сдедующий гайд как сделать addon с топ резольвером. Добавь как спастить engine, а то многие не смогут.
 
Забаненный
Статус
Оффлайн
Регистрация
26 Июл 2019
Сообщения
412
Реакции[?]
136
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Красава, что помог юным пастерам дописать кодик. Гайд нормальный. Жду сдедующий гайд как сделать addon с топ резольвером. Добавь как спастить engine, а то многие не смогут.
К сожалению, я не пишу аддоны) Тем более с ресиком)
 
Забаненный
Статус
Оффлайн
Регистрация
19 Дек 2019
Сообщения
542
Реакции[?]
73
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ке
И так. Недавно один человек под ником 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++:
int m_nLastOutgoingCmd;        //0x4CAC
int m_nChokedCmds;             //0x4CB0
Специально для тех людей, которые копировали хуки CreateMove и FrameStageNotify. Их не надо было копировать! Надо было только дополнить!
После:
C++:
if (!cmd || !cmd->command_number)
            return;
Добавить:

C++:
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++:
static auto ofunc = hlclient_hook.get_original<decltype(&hkFrameStageNotify)>(index::FrameStageNotify);
        // may be u will use it lol
Добавить:
C++:
if (!g_EngineClient->IsInGame() || !g_EngineClient->IsConnected() || !g_LocalPlayer)
            g_ViolanesPaster.ResetData();
Всё, вы спастили дт и хайд шотс! Надеюсь, как добавлять кнопки не надо говорить)
P.S Как в сурсах вилки говорилось, для дт нужен Engine Prediction. Если у вас его нет, значит вам надо его спастить с другого источника)
ето для симла?
 
Забаненный
Статус
Оффлайн
Регистрация
19 Дек 2019
Сообщения
542
Реакции[?]
73
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пользователь
Статус
Оффлайн
Регистрация
19 Мар 2019
Сообщения
575
Реакции[?]
115
Поинты[?]
0
Забаненный
Статус
Оффлайн
Регистрация
26 Июл 2019
Сообщения
412
Реакции[?]
136
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Дополнил гайд добавлением Engine Prediction-a. Но сразу скажу: для дт он может быть неправильным.

P.S Ахахахахах, поехали хейтеры) Видимо горят с гайдов, которые помогают пастерам:da:
 
main public enemy
Эксперт
Статус
Оффлайн
Регистрация
30 Ноя 2019
Сообщения
1,531
Реакции[?]
647
Поинты[?]
0
Одобряю,ахуенный гайд но зря ты это сделал
Изначально код был готовый и сделать его могли разве что не тупые,а сейчас и тупые тоже
 
Начинающий
Статус
Оффлайн
Регистрация
27 Фев 2020
Сообщения
255
Реакции[?]
25
Поинты[?]
0
Дополнил гайд добавлением Engine Prediction-a. Но сразу скажу: для дт он может быть неправильным.

P.S Ахахахахах, поехали хейтеры) Видимо горят с гайдов, которые помогают пастерам:da:
Чел блять я не удивлюсь если скоо будет 3 тап в 1тик.
 
Забаненный
Статус
Оффлайн
Регистрация
26 Июл 2019
Сообщения
412
Реакции[?]
136
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
main public enemy
Эксперт
Статус
Оффлайн
Регистрация
30 Ноя 2019
Сообщения
1,531
Реакции[?]
647
Поинты[?]
0
Чел блять я не удивлюсь если скоо будет 3 тап в 1тик.
Трипл тап уже существует )
Правда луа и правда в ските
Но это не совсем триплтап да и не совсем в тик
Это что то типо обычный выстрел + дт = профит
 
Забаненный
Статус
Оффлайн
Регистрация
26 Июл 2019
Сообщения
412
Реакции[?]
136
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Одобряю,ахуенный гайд но зря ты это сделал
Изначально код был готовый и сделать его могли разве что не тупые,а сейчас и тупые тоже
Так гайд специально сделан для ппастеров, которые блять не шарят и вообще пастят первую минуту(но это уже оффтоп)
 
Забаненный
Статус
Оффлайн
Регистрация
8 Ноя 2019
Сообщения
176
Реакции[?]
63
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Трипл тап уже существует )
Правда луа и правда в ските
Но это не совсем триплтап да и не совсем в тик
Это что то типо обычный выстрел + дт = профит
в ските уже нельзя такое сделать тут в ските даже даже не даблтапает часто) а просто стреляет просто кодер сын шлюхи ) даже луа не помогают с этой хуйней
 
quality solution
Участник
Статус
Оффлайн
Регистрация
30 Май 2019
Сообщения
579
Реакции[?]
193
Поинты[?]
0
гайд не полный,нету ни хуков,ни самой вызываемой функции
 
Забаненный
Статус
Оффлайн
Регистрация
26 Июл 2019
Сообщения
412
Реакции[?]
136
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
гайд не полный,нету ни хуков,ни самой вызываемой функции
Здравствуйте. Ссылка на исходники хуков и т.д оставлена. Этот гайд - дополнение для тех, у кого куча ошибок и для тех, кто не гуглил
 
Забаненный
Статус
Оффлайн
Регистрация
26 Июл 2019
Сообщения
412
Реакции[?]
136
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сверху Снизу