-
Автор темы
- #1
Без лишних слов продолжаем писать код, набросал маленький план, что мы сегодня сделаем:
Сделаем класс для ClientState, классы для каждого игрока(ведь гораздо удобнее использовать всем привычные классы).
Итак, создаем файл engine.hpp и наполняем его следующей начинкой:
Вроде бы все хорошо, но ругается на отсутствие vector.hpp, создаем его и заполняем этим:
теперь можем вернуться к классу, создаем engine.cpp и наполняем его:
итак теперь идем в globals.hpp и добавляем
в globals.cpp то же самое:
итак теперь все что нужно мы добавили, идем в main.cpp и добавляем две строки
За что отвечают эти две функции(GetModule и Read) мы уже разобрали, так что не будем на них останавливаться идем дальше и удаляем строки отвечающие за получение localplayer'a, надеюсь с этим у вас проблем не будет
создадим наконец файл entity.hpp и пихаем следующее:
после этого создаем entity.cpp и заполняем следующим:
теперь у нас есть нормальный класс для энтити и мы можем отказаться от многой бесполезнейшей херни ибо у нас теперь класс.
Помните бесконечный цикл в функции main? Давайте видоизменим его и добавим обновление информации об игроках:
идем в функцию GlowThread и добавляем в самый верх бесконечного цикла
в цикле на каждого игрока убираем все нахуй и пишем код заного(а хули вы хотите я только так и делаю)
Теперь создадим enums.hpp где будут храниться все перечисления и отправляем туда следующее:
идем в main.cpp и создаем функцию BHopThread
и просто запускаем поток так же как и поток с GlowESP
На этом все, по итогу мы получили нормальный entity и clientstate(engine) класс, бхоп, следующий урок скорее всего будет по триггерботу, посмотрим.
Если есть какие-то вопросы - задавайте, постараюсь ответить
Сделаем класс для ClientState, классы для каждого игрока(ведь гораздо удобнее использовать всем привычные классы).
Итак, создаем файл engine.hpp и наполняем его следующей начинкой:
Код:
#pragma once
#include "vector.hpp"
class Engine
{
public:
int GetLocalPlayer(); // Нужно, чтобы получить индекс нашего игрока
bool IsInGame(); // Проверка, находимся ли мы в игре
Vector GetViewAngles(); // Зачатки аимбота: получаем углы нашего игрока
void SetViewAngles(const Vector& viewangles); // Зачатки аимбота: устанавливаем углы нашего игрока
};
extern Engine* g_pEngine;
Код:
#pragma once
#include <cmath.h>
class Vector
{
public:
Vector() { x = y = z = NULL };
Vector(float X, float Y, float Z)
{
x = X;
y = Y;
z = Z;
}
float Length() const // В будущем понадобится
{
return sqrt(x*x + y * y + z * z);
}
float LengthSqr() const // В будущем понадобится
{
return (x*x + y * y + z * z);
}
float DistTo(const Vector &vOther) const // В будущем понадобится
{
Vector delta;
delta.x = x - vOther.x;
delta.y = y - vOther.y;
delta.z = z - vOther.z;
return delta.Length();
}
float DistToSqr(const Vector &vOther) const // В будущем понадобится
{
Vector delta;
delta.x = x - vOther.x;
delta.y = y - vOther.y;
delta.z = z - vOther.z;
return delta.LengthSqr();
}
float x, y, z;
};
Код:
#include "engine.hpp"
Engine* g_pEngine = new Engine();
bool Engine::IsInGame()
{
if (!g_Offsets->ClientState)
return false;
return (process->Read<int>(g_Offsets->ClientState + 0x108) == (int)SIGNONSTATE_FULL);
}
int Engine::GetLocalPlayer()
{
if (!g_Offsets->ClientState)
return -1;
return process->Read<int>(g_Offsets->ClientState + 0x180);
}
Vector Engine::GetViewAngles()
{
if (!g_Offsets->ClientState)
return Vector();
return process->Read<Vector>(g_Offsets->ClientState + 0x4CE0);
}
void Engine::SetViewAngles(const Vector& viewangles)
{
if (!g_Offsets->ClientState)
return;
process->Write<Vector>(g_Offsets->ClientState + 0x4CE0, viewangles);
}
Код:
extern uintptr_t clientstate;
Код:
uintptr_t clientstate = NULL;
Код:
globals::engineModule = Mem->GetModule(globals::processID, L"engine.dll");
globals::clientstate = Mem->Read<uintptr_t>(globals::engineModule + Offsets::dwClientState);
создадим наконец файл entity.hpp и пихаем следующее:
Код:
#pragma once
#include <Windows.h>
#include <iostream>
class CPlayer
{
public:
CPlayer();
void Update(BYTE PlayerIndex); // Обновляем данные об игроке
uintptr_t GetPointer(); // Получаем указатель на персонажа
int GetTeam(); // Получаем команду персонажа
int GetHealth(); // Получаем здоровье персонажа
int GetGlowIndex(); // Получаем GlowIndex персонажа
int GetFlags(); // Получаем флаги игрока
bool IsValid(); // Проверка на валидность игрока
private:
uintptr_t pointer; // Здесь хранится указатель на персонажа
int health; // Здесь хранится здоровье
int team; // Здесь хранится команда
int glowIndex; // Здесь хранится GlowIndex
int flags; // Здесь хранятся флаги игрока
};
extern CPlayer PlayerList[64]; // Список всех энтити
extern CPlayer LocalPlayer;
Код:
#include "entity.hpp"
CPlayer PlayerList[65];
CPlayer LocalPlayer;
CPlayer::CPlayer()
{
// Обнуляем все переменные
pointer = NULL;
health = NULL;
team = NULL;
glowIndex = NULL;
flags = NULL;
}
void CPlayer::Update(BYTE PlayerIndex)
{
// Обновляем данные об игроке
pointer = Mem->Read<uintptr_t>(globals::clientModule + Offsets::dwEntityList + PlayerIndex * 0x10);
if (!pointer)
return;
team = Mem->Read<int>(pointer + Netvars::m_iTeamNum); // Получаем команду игрока
health = Mem->Read<int>(pointer + Netvars::m_iHealth); // Получаем здоровье игрока
glowIndex = Mem->Read<int>(pointer + Netvars::m_iGlowIndex); // Получаем GlowIndex игрока
flags = Mem->Read<int>(pointer + Netvars::m_fFlags); // Получаем флаги игрока
}
uintptr_t CPlayer::GetPointer()
{
return pointer; // Возвращаем указатель
}
int CPlayer::GetTeam()
{
return team; // Возвращаем команду
}
int CPlayer::GetHealth()
{
return health; // Возвращаем здоровье
}
int CPlayer::GetGlowIndex()
{
return glowIndex; // Возвращаем GlowIndex
}
int CPlayer::GetFlags()
{
return flags; // Возвращаем флаги
}
bool CPlayer::IsValid()
{
return pointer != NULL; // Проверка на валидность игрока
}
Помните бесконечный цикл в функции main? Давайте видоизменим его и добавим обновление информации об игроках:
Код:
while (!GetAsyncKeyState(VK_DELETE))
{
LocalPlayer.Update(g_pEngine->GetLocalPlayer());
for (BYTE PlayerIndex = 0; PlayerIndex < 64; PlayerIndex++)
{
PlayerList[PlayerIndex].Update(PlayerIndex);
}
std::this_thread::sleep_for(1ms);
}
Код:
if (!g_pEngine->IsInGame())
continue;
Код:
if (!PlayerList[i].IsValid()) // Проверяем игрока на валидность
continue;
if (PlayerList[i].GetPointer() == LocalPlayer.GetPointer()) // Не применяем Glow на себя
continue;
int glowIndex = PlayerList[i].GetGlowIndex(); // Получаем glowIndex
GlowStruct Glow;
Glow = Mem->Read<GlowStruct>(glowObject + (glowIndex * 0x38));
if (LocalPlayer.GetTeam() != PlayerList[i].GetTeam()) // Сравниваем команды
{
Glow.red = 1.f;
Glow.green = 0.f;
Glow.blue = 0.f;
Glow.alpha = 1.f;
}
else
{
Glow.red = 0.f;
Glow.green = 0.f;
Glow.blue = 1.f;
Glow.alpha = 1.f;
}
// Ну и здесь все как было так и остается!(стабильность залог успеха111!!1)
Glow.renderWhenOccluded = true;
Glow.renderWhenUnoccluded = false;
Mem->Write<GlowStruct>(glowObject + (glowIndex * 0x38), Glow);
Код:
enum SIGNONSTATE // Перечисление всех состояний, нужно для проверки в игре мы или нет
{
SIGNONSTATE_NONE = 0,
SIGNONSTATE_CHALLENGE = 1,
SIGNONSTATE_CONNECTED = 2,
SIGNONSTATE_NEW = 3,
SIGNONSTATE_PRESPAWN = 4,
SIGNONSTATE_SPAWN = 5,
SIGNONSTATE_FULL = 6,
SIGNONSTATE_CHANGELEVEL = 7
};
enum FLAGS // Флаги ентити, нужно нам для проверки, на земле ли игрок
{
FL_ONGROUND = (1 << 0),
FL_DUCKING = (1 << 1),
FL_WATERJUMP = (1 << 2),
FL_ONTRAIN = (1 << 3),
FL_INRAIN = (1 << 4),
FL_FROZEN = (1 << 5),
FL_ATCONTROLS = (1 << 6),
FL_CLIENT = (1 << 7),
FL_FAKECLIENT = (1 << 8),
FL_INWATER = (1 << 9)
};
Код:
void BHopThread()
{
while (!GetAsyncKeyState(VK_DELETE))
{
if (!g_pEngine->IsInGame()) // Проверяем в игре ли мы
continue;
if (GetAsyncKeyState(VK_SPACE)) // Проверяем нажатие пробела
{
if (LocalPlayer.GetFlags() & FL_ONGROUND) // Проверяем на земле ли мы
Mem->Write<int>(globals::clientModule + Offsets::dwForceJump, 5); // Заставляем персонажа прыгнуть
else // Если же не на земле
Mem->Write<int>(globals::clientModule + Offsets::dwForceJump, 4); // Разрешаем персонажу не прыгать
}
std::this_thread::sleep_for(1ms); // Ждем 1 мс чтобы продолжить цикл
}
}
Код:
std::thread tBHop(BHopThread);
tBHop.detach();
Если есть какие-то вопросы - задавайте, постараюсь ответить
Последнее редактирование: