Загрузка данных
#include "overlay.h"
#include "menu.h"
#include "config.h"
#include "esp.h"
#include <dwmapi.h>
#include <iostream>
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
#pragma comment(lib, "dwmapi.lib")
static Overlay* g_pOverlay = nullptr;
static bool g_bExclusiveMode = false;
Overlay::Overlay()
: m_hGameWnd(nullptr), m_hOverlayWnd(nullptr), m_hInstance(nullptr),
m_pDevice(nullptr), m_pContext(nullptr), m_pSwapChain(nullptr),
m_pRenderTargetView(nullptr), m_bInitialized(false), m_bMenuOpen(true),
m_width(1920), m_height(1080) {
g_pOverlay = this;
}
Overlay::~Overlay() {
Destroy();
}
bool Overlay::Create(HWND hGameWnd) {
if (m_bInitialized) return true;
m_hGameWnd = hGameWnd;
m_hInstance = GetModuleHandle(nullptr);
// Получаем размеры окна игры
RECT rect;
GetWindowRect(m_hGameWnd, &rect);
m_width = rect.right - rect.left;
m_height = rect.bottom - rect.top;
std::cout << "[+] Game window size: " << m_width << "x" << m_height << std::endl;
std::cout << "[+] Game window HWND: 0x" << std::hex << (uintptr_t)m_hGameWnd << std::endl;
// ============================================
// РЕГИСТРИРУЕМ КЛАСС ДЛЯ ОВЕРЛЕЙНОГО ОКНА
// ============================================
WNDCLASSEXA wc = {};
wc.cbSize = sizeof(WNDCLASSEXA);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = Overlay::WndProc;
wc.hInstance = m_hInstance;
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszClassName = "CS2OverlayClass";
if (!RegisterClassExA(&wc)) {
DWORD err = GetLastError();
if (err != ERROR_CLASS_ALREADY_EXISTS) {
std::cout << "[-] RegisterClassEx failed: " << err << std::endl;
return false;
}
std::cout << "[+] Window class already exists!" << std::endl;
} else {
std::cout << "[+] Window class registered!" << std::endl;
}
// ============================================
// СОЗДАЕМ ОВЕРЛЕЙНОЕ ОКНО
// ============================================
m_hOverlayWnd = CreateWindowExA(
WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT,
"CS2OverlayClass",
"CS2 External Overlay",
WS_POPUP,
rect.left, rect.top,
m_width, m_height,
nullptr, nullptr, m_hInstance, nullptr
);
if (!m_hOverlayWnd) {
std::cout << "[-] CreateWindowEx failed: " << GetLastError() << std::endl;
return false;
}
std::cout << "[+] Overlay window created!" << std::endl;
// Настраиваем прозрачность
SetLayeredWindowAttributes(m_hOverlayWnd, RGB(0, 0, 0), 0, LWA_COLORKEY);
ShowWindow(m_hOverlayWnd, SW_SHOW);
UpdateWindow(m_hOverlayWnd);
// ============================================
// СОЗДАЕМ DIRECTX ДЛЯ ОВЕРЛЕЙНОГО ОКНА
// ============================================
if (!CreateDevice()) {
std::cout << "[-] Failed to create DirectX device!" << std::endl;
return false;
}
// ============================================
// ИНИЦИАЛИЗИРУЕМ IMGUI
// ============================================
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
io.IniFilename = nullptr;
ImGuiStyle& style = ImGui::GetStyle();
style.WindowRounding = 8.0f;
style.FrameRounding = 4.0f;
style.GrabRounding = 4.0f;
ImVec4* colors = style.Colors;
colors[ImGuiCol_WindowBg] = ImVec4(0.08f, 0.08f, 0.12f, 0.95f);
colors[ImGuiCol_ChildBg] = ImVec4(0.06f, 0.06f, 0.09f, 0.80f);
colors[ImGuiCol_Header] = ImVec4(0.12f, 0.12f, 0.20f, 0.80f);
colors[ImGuiCol_HeaderHovered] = ImVec4(0.00f, 0.40f, 0.80f, 0.80f);
colors[ImGuiCol_HeaderActive] = ImVec4(0.00f, 0.50f, 1.00f, 1.00f);
colors[ImGuiCol_Button] = ImVec4(0.15f, 0.15f, 0.25f, 0.80f);
colors[ImGuiCol_ButtonHovered] = ImVec4(0.00f, 0.40f, 0.80f, 0.80f);
colors[ImGuiCol_ButtonActive] = ImVec4(0.00f, 0.50f, 1.00f, 1.00f);
colors[ImGuiCol_CheckMark] = ImVec4(0.00f, 0.50f, 1.00f, 1.00f);
colors[ImGuiCol_SliderGrab] = ImVec4(0.00f, 0.50f, 1.00f, 1.00f);
colors[ImGuiCol_SliderGrabActive] = ImVec4(0.00f, 0.70f, 1.00f, 1.00f);
colors[ImGuiCol_Tab] = ImVec4(0.10f, 0.10f, 0.16f, 0.80f);
colors[ImGuiCol_TabHovered] = ImVec4(0.00f, 0.40f, 0.80f, 0.80f);
colors[ImGuiCol_TabActive] = ImVec4(0.00f, 0.50f, 1.00f, 1.00f);
colors[ImGuiCol_Text] = ImVec4(0.90f, 0.90f, 0.95f, 1.00f);
colors[ImGuiCol_FrameBg] = ImVec4(0.12f, 0.12f, 0.20f, 0.80f);
colors[ImGuiCol_FrameBgHovered] = ImVec4(0.00f, 0.40f, 0.80f, 0.80f);
colors[ImGuiCol_FrameBgActive] = ImVec4(0.00f, 0.50f, 1.00f, 1.00f);
if (!ImGui_ImplWin32_Init(m_hOverlayWnd)) {
std::cout << "[-] Failed to init ImGui Win32!" << std::endl;
return false;
}
if (!ImGui_ImplDX11_Init(m_pDevice, m_pContext)) {
std::cout << "[-] Failed to init ImGui DX11!" << std::endl;
return false;
}
Config::Load();
m_bInitialized = true;
std::cout << "[+] Overlay initialized!" << std::endl;
std::cout << "[+] Press PGDN (Page Down) to open menu" << std::endl;
std::cout << "[+] Press F1 to toggle ESP" << std::endl;
std::cout << "[+] Press END to exit" << std::endl;
return true;
}
bool Overlay::CreateDevice() {
DXGI_SWAP_CHAIN_DESC scd = {};
scd.BufferCount = 1;
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
scd.BufferDesc.Width = m_width;
scd.BufferDesc.Height = m_height;
scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
scd.OutputWindow = m_hOverlayWnd;
scd.SampleDesc.Count = 1;
scd.Windowed = TRUE;
D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0 };
HRESULT hr = D3D11CreateDeviceAndSwapChain(
nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0,
featureLevels, 1, D3D11_SDK_VERSION,
&scd, &m_pSwapChain, &m_pDevice, nullptr, &m_pContext
);
if (FAILED(hr)) {
std::cout << "[-] D3D11CreateDeviceAndSwapChain failed: 0x" << std::hex << hr << std::endl;
return false;
}
ID3D11Texture2D* pBackBuffer;
m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pBackBuffer);
m_pDevice->CreateRenderTargetView(pBackBuffer, nullptr, &m_pRenderTargetView);
pBackBuffer->Release();
return true;
}
void Overlay::ToggleMenu() {
m_bMenuOpen = !m_bMenuOpen;
std::cout << "[+] Menu: " << (m_bMenuOpen ? "OPEN" : "CLOSED") << std::endl;
}
void Overlay::Render(const std::vector<PlayerData>& players) {
if (!m_bInitialized) return;
ImGui_ImplDX11_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
// ============================================
// ТЕСТОВЫЙ ТЕКСТ (всегда виден)
// ============================================
ImGui::GetForegroundDrawList()->AddText(
ImVec2(10, 10),
IM_COL32(0, 255, 0, 255),
"[IMGUI] WORKING! Press PGDN for menu | F1=ESP"
);
// ============================================
if (m_bMenuOpen) {
Menu::Draw();
}
if (Menu::g_bESP) {
DrawESP(players);
}
if (Config::g_bCrosshair) {
DrawCrosshair();
}
ImGui::EndFrame();
ImGui::Render();
float clearColor[] = { 0.0f, 0.0f, 0.0f, 0.0f };
m_pContext->ClearRenderTargetView(m_pRenderTargetView, clearColor);
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
m_pSwapChain->Present(1, 0);
}
void Overlay::Destroy() {
if (m_pRenderTargetView) {
m_pRenderTargetView->Release();
m_pRenderTargetView = nullptr;
}
if (m_pSwapChain) {
m_pSwapChain->Release();
m_pSwapChain = nullptr;
}
if (m_pContext) {
m_pContext->Release();
m_pContext = nullptr;
}
if (m_pDevice) {
m_pDevice->Release();
m_pDevice = nullptr;
}
ImGui_ImplDX11_Shutdown();
ImGui_ImplWin32_Shutdown();
ImGui::DestroyContext();
if (m_hOverlayWnd) {
DestroyWindow(m_hOverlayWnd);
m_hOverlayWnd = nullptr;
}
m_bInitialized = false;
}
LRESULT CALLBACK Overlay::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
if (g_pOverlay) {
return g_pOverlay->HandleMessage(msg, wParam, lParam);
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
LRESULT Overlay::HandleMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
if (m_bInitialized) {
if (ImGui_ImplWin32_WndProcHandler(m_hOverlayWnd, msg, wParam, lParam)) {
return true;
}
}
switch (msg) {
case WM_KEYDOWN:
if (wParam == VK_NEXT) { // PGDN
ToggleMenu();
return 0;
}
if (wParam == VK_END) {
Destroy();
PostQuitMessage(0);
return 0;
}
if (wParam == VK_F1) {
Menu::g_bESP = !Menu::g_bESP;
std::cout << "[+] ESP: " << (Menu::g_bESP ? "ON" : "OFF") << std::endl;
return 0;
}
if (wParam == VK_F2) {
Menu::g_bAimbot = !Menu::g_bAimbot;
std::cout << "[+] Aimbot: " << (Menu::g_bAimbot ? "ON" : "OFF") << std::endl;
return 0;
}
if (wParam == VK_F3) {
Menu::g_bTriggerbot = !Menu::g_bTriggerbot;
std::cout << "[+] Triggerbot: " << (Menu::g_bTriggerbot ? "ON" : "OFF") << std::endl;
return 0;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(m_hOverlayWnd, msg, wParam, lParam);
}