-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
И так. Недавно один человек под ником violanes скинул исходники дт и hide shots под ксгосимпл. Сразу скажу, этот гайд для тех, кто пытался сделать дт и для тех, у кого посыпались ошибки. Ссылка на исходники дт -
https://yougame.biz/threads/134913/ (Если что, неееееееееееееееееееее реклама, не переходить ни в коем случае)
Так как наши пастеры не справились с задачей додумать код, то скину тут все действия для его фикса)
Поехали!
Специально для тех людей, которые копировали хуки CreateMove и FrameStageNotify. Их не надо было копировать! Надо было только дополнить!
Всё, вы спастили дт и хайд шотс! Надеюсь, как добавлять кнопки не надо говорить)
P.S Как в сурсах вилки говорилось, для дт нужен Engine Prediction. Если у вас его нет, значит вам надо его спастить с другого источника)(ну или отсюда же)
P.P.S Спасибо Dreammm за указанную ошибку)
У кого не получилось из других источников спастить Engine Prediction, оставлю тут исходник. Для ксгосимпла ready-to-paste)
Создаём два файла: predictionsystem.cpp и predictionsystem.h .
Определение для Utils::FindSignature:
Далее идём в Hooks.cpp и после
Так, стоп, забыл. После
Спускаемся в CreateMove и добавляем:
Всё, вы спастили и Engine Prediction. Удачи использовать)
https://yougame.biz/threads/134913/ (Если что, неееееееееееееееееееее реклама, не переходить ни в коем случае)
Так как наши пастеры не справились с задачей додумать код, то скину тут все действия для его фикса)
Поехали!
В Hooks.hpp в namespace index после
После
Далее переходим в Hooks.cpp и после
А после
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");
После:
Добавить:
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);
}
Где вставите - по идее неважно.
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);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);
Последнее редактирование: