Почему не работает данный бхоп? оффсеты вроде актуальные,но не прыгает.
C++:
#include <Windows.h>
#include <cstdint>
#include <thread>
namespace Offsets
{
constexpr std::ptrdiff_t dwLocalPlayerPawn = 0x1BDBB10;
constexpr std::ptrdiff_t m_fFlags = 0x3F8;
constexpr std::ptrdiff_t dwForceJump = 0x1730530;
}
class Memory
{
public:
static uintptr_t GetClient()
{
static uintptr_t client = reinterpret_cast<uintptr_t>(GetModuleHandleA("client.dll"));
return client;
}
template<typename T>
static T Read(uintptr_t address)
{
if (!IsValidPtr(address)) return T();
return *reinterpret_cast<T*>(address);
}
template<typename T>
static void Write(uintptr_t address, T value)
{
if (!IsValidPtr(address)) return;
DWORD oldProtect;
if (VirtualProtect(reinterpret_cast<LPVOID>(address), sizeof(T), PAGE_READWRITE, &oldProtect)) {
*reinterpret_cast<T*>(address) = value;
VirtualProtect(reinterpret_cast<LPVOID>(address), sizeof(T), oldProtect, &oldProtect);
}
}
private:
static bool IsValidPtr(uintptr_t ptr)
{
if (!ptr) return false;
MEMORY_BASIC_INFORMATION mbi;
if (!VirtualQuery(reinterpret_cast<LPCVOID>(ptr), &mbi, sizeof(mbi)))
return false;
return (mbi.Protect & (PAGE_READWRITE | PAGE_READONLY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE));
}
};
void BHopThread()
{
// Ждем загрузки клиента
int attempts = 0;
while (!Memory::GetClient() && attempts < 30) {
std::this_thread::sleep_for(std::chrono::seconds(1));
attempts++;
}
if (!Memory::GetClient()) {
return; // Не нашли client.dll
}
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(2));
// Выход по END
if (GetAsyncKeyState(VK_END) & 1) break;
// BHop по SPACE
if (GetAsyncKeyState(VK_SPACE) & 0x8000)
{
uintptr_t localPlayer = Memory::Read<uintptr_t>(Memory::GetClient() + Offsets::dwLocalPlayerPawn);
if (!localPlayer) continue;
int flags = Memory::Read<int>(localPlayer + Offsets::m_fFlags);
// Проверяем разные возможные значения флага "на земле"
bool onGround = (flags == 257 || flags == 263 || flags == 65665 || flags == 65667);
if (onGround)
{
Memory::Write<uint32_t>(Memory::GetClient() + Offsets::dwForceJump, 65537); // Прыжок
std::this_thread::sleep_for(std::chrono::milliseconds(5));
Memory::Write<uint32_t>(Memory::GetClient() + Offsets::dwForceJump, 256); // Отпускаем
}
}
// Небольшая пауза чтобы не грузить процессор
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
DWORD WINAPI BHopMain(LPVOID lpParam)
{
BHopThread();
return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
{
if (reason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
// Создаем поток правильно
HANDLE hThread = CreateThread(nullptr, 0, BHopMain, nullptr, 0, nullptr);
if (hThread) {
CloseHandle(hThread);
}
}
return TRUE;
}