initial commit of the files
This commit is contained in:
430
ImGuiExternal/Source.cpp
Normal file
430
ImGuiExternal/Source.cpp
Normal file
@@ -0,0 +1,430 @@
|
||||
#include "xorstr.hpp"
|
||||
#include "Functions.h"
|
||||
#include "Memory.h"
|
||||
#include "Overlay.h"
|
||||
|
||||
LPCSTR TargetProcess = "hl2.exe";
|
||||
bool ShowMenu = false;
|
||||
bool Unhook = false;
|
||||
bool ally_esp = false;
|
||||
bool ennemy_esp = true;
|
||||
bool ally_box = false;
|
||||
bool ennemy_box = true;
|
||||
bool ally_skeleton = false;
|
||||
bool ennemy_skeleton = true;
|
||||
bool ally_esp_health_bar = false;
|
||||
bool ennemy_esp_health_bar = true;
|
||||
bool ally_name = false;
|
||||
bool ennemy_name = true;
|
||||
bool crosshair = true;
|
||||
bool ImGui_Initialised = false;
|
||||
bool CreateConsole = false;
|
||||
|
||||
namespace OverlayWindow {
|
||||
WNDCLASSEX WindowClass;
|
||||
HWND Hwnd;
|
||||
LPCSTR Name;
|
||||
}
|
||||
|
||||
namespace DirectX9Interface {
|
||||
IDirect3D9Ex* Direct3D9 = NULL;
|
||||
IDirect3DDevice9Ex* pDevice = NULL;
|
||||
D3DPRESENT_PARAMETERS pParams = { NULL };
|
||||
MARGINS Margin = { -1 };
|
||||
MSG Message = { NULL };
|
||||
}
|
||||
|
||||
void Draw() {
|
||||
RGBA Cyan = { 0, 231, 255, 255 };
|
||||
if (crosshair) DrawCircleFilled(Process::WindowWidth/2, Process::WindowHeight/2, 3, &Cyan);
|
||||
|
||||
if (!ally_esp && !ennemy_esp) {
|
||||
return;
|
||||
}
|
||||
|
||||
RGBA White = { 255, 255, 255, 255 };
|
||||
if (!Game::client || !Game::engine) {
|
||||
init_modules();
|
||||
}
|
||||
|
||||
uintptr_t entity_list = Game::client + ENTITY_LIST;
|
||||
uintptr_t localplayer = RPM<uintptr_t>(Game::client + LOCALPLAYER);
|
||||
int localplayer_team = RPM<uintptr_t>(localplayer + TEAM);
|
||||
int ent_idx = 0;
|
||||
|
||||
for (int i = 0; i < 32; i++) {
|
||||
uintptr_t ent = GetEntity(entity_list, i);
|
||||
if (ent == NULL || ent == localplayer) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Vector3 absOrigin = RPM<Vector3>(ent + XYZ);
|
||||
Vector3 w2s_absOrigin;
|
||||
|
||||
if (!WorldToScreen(absOrigin, w2s_absOrigin)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int ent_team = RPM<int>(ent + TEAM);
|
||||
if (ent_team == localplayer_team && !ally_esp) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (RPM<BYTE>(ent + LIFESTATE) != 0 || RPM<int>(ent + DORMANT)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int health = RPM<int>(ent + HEALTH);
|
||||
if (health == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
//getting name
|
||||
DWORD list = RPM<DWORD>(Game::client + NAME_LIST) + 0x38;
|
||||
char name[256];
|
||||
for (int j = 0; j < 256; j++) {
|
||||
char c = RPM<char>(list + 0x140 * i + j*sizeof(char));
|
||||
if (c == '\0') {
|
||||
name[j] = '\0';
|
||||
break;
|
||||
}
|
||||
name[j] = c;
|
||||
}
|
||||
|
||||
//esp
|
||||
DWORD bonematrix_addr = RPM<DWORD>(ent + BONEMATRIX);
|
||||
if (!bonematrix_addr) continue;
|
||||
|
||||
Vector3 headpos = GetBonePos(bonematrix_addr, BoneID::PELVIS);
|
||||
headpos.z += headpos.z - absOrigin.z;
|
||||
|
||||
Vector3 w2s_headpos;
|
||||
|
||||
if (!WorldToScreen(headpos, w2s_headpos)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
char ent_text[256];
|
||||
sprintf(ent_text, xorstr_("%s --> %d %f %f %f"), name, health, headpos.x, headpos.y, headpos.z);
|
||||
DrawStrokeText(30, 100 + 16*ent_idx, &White, ent_text);
|
||||
ent_idx++;
|
||||
#endif // _DEBUG
|
||||
|
||||
|
||||
RGBA color = { 255, 255, 255, 255 };
|
||||
if ((ent_team == localplayer_team && ally_box) || (ent_team != localplayer_team && ennemy_box)) {
|
||||
DrawEspBox2D(w2s_absOrigin, w2s_headpos, &color, 1);
|
||||
}
|
||||
|
||||
if ((ent_team == localplayer_team && ally_name) || (ent_team != localplayer_team && ennemy_name)) {
|
||||
DrawNameTag(w2s_absOrigin, w2s_headpos, name);
|
||||
}
|
||||
|
||||
if ((ent_team == localplayer_team && ally_esp_health_bar) || (ent_team != localplayer_team && ennemy_esp_health_bar)) {
|
||||
DrawHealthBar(w2s_absOrigin, w2s_headpos, health);
|
||||
}
|
||||
|
||||
if ((ent_team == localplayer_team && ally_skeleton) || (ent_team != localplayer_team && ennemy_skeleton)) {
|
||||
DrawBones(bonematrix_addr, &color, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DrawMenu() {
|
||||
ImGui::SetNextWindowSize(ImVec2(500.f, 400.f));
|
||||
ImGui::Begin("CSS hax", NULL, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse);
|
||||
|
||||
ImGui::Checkbox("Crosshair", &crosshair);
|
||||
ImGui::Separator();
|
||||
|
||||
ImGui::Checkbox("Ally ESP", &ally_esp);
|
||||
ImGui::Checkbox("Box##ally", &ally_box);
|
||||
ImGui::Checkbox("Skeleton##ally", &ally_skeleton);
|
||||
ImGui::Checkbox("Healthbar##ally", &ally_esp_health_bar);
|
||||
ImGui::Checkbox("Name##ally", &ally_name);
|
||||
|
||||
ImGui::Separator();
|
||||
ImGui::Checkbox("Ennemy ESP", &ennemy_esp);
|
||||
ImGui::Checkbox("Box##ennemy", &ennemy_box);
|
||||
ImGui::Checkbox("Skeleton##ennemy", &ennemy_skeleton);
|
||||
ImGui::Checkbox("Healthbar##ennemy", &ennemy_esp_health_bar);
|
||||
ImGui::Checkbox("Name##ennemy", &ennemy_name);
|
||||
|
||||
ImGui::Separator();
|
||||
if (ImGui::Button("Unhook")) {
|
||||
Unhook = true;
|
||||
}
|
||||
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
void Render() {
|
||||
if (GetAsyncKeyState(VK_DELETE) & 1) Unhook = true;
|
||||
if (GetAsyncKeyState(VK_INSERT) & 1) ShowMenu = !ShowMenu;
|
||||
|
||||
ImGui_ImplDX9_NewFrame();
|
||||
ImGui_ImplWin32_NewFrame();
|
||||
ImGui::NewFrame();
|
||||
Draw();
|
||||
|
||||
if (ShowMenu)
|
||||
DrawMenu();
|
||||
|
||||
ImGui::EndFrame();
|
||||
|
||||
DirectX9Interface::pDevice->SetRenderState(D3DRS_ZENABLE, false);
|
||||
DirectX9Interface::pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
|
||||
DirectX9Interface::pDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, false);
|
||||
|
||||
DirectX9Interface::pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
|
||||
if (DirectX9Interface::pDevice->BeginScene() >= 0) {
|
||||
ImGui::Render();
|
||||
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
|
||||
DirectX9Interface::pDevice->EndScene();
|
||||
}
|
||||
|
||||
HRESULT result = DirectX9Interface::pDevice->Present(NULL, NULL, NULL, NULL);
|
||||
if (result == D3DERR_DEVICELOST && DirectX9Interface::pDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET) {
|
||||
ImGui_ImplDX9_InvalidateDeviceObjects();
|
||||
DirectX9Interface::pDevice->Reset(&DirectX9Interface::pParams);
|
||||
ImGui_ImplDX9_CreateDeviceObjects();
|
||||
}
|
||||
}
|
||||
|
||||
void MainLoop() {
|
||||
static RECT OldRect;
|
||||
ZeroMemory(&DirectX9Interface::Message, sizeof(MSG));
|
||||
|
||||
while (DirectX9Interface::Message.message != WM_QUIT) {
|
||||
if (Unhook) {
|
||||
ImGui_ImplDX9_Shutdown();
|
||||
ImGui_ImplWin32_Shutdown();
|
||||
ImGui::DestroyContext();
|
||||
DestroyWindow(OverlayWindow::Hwnd);
|
||||
UnregisterClass(OverlayWindow::WindowClass.lpszClassName, OverlayWindow::WindowClass.hInstance);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (PeekMessage(&DirectX9Interface::Message, OverlayWindow::Hwnd, 0, 0, PM_REMOVE)) {
|
||||
TranslateMessage(&DirectX9Interface::Message);
|
||||
DispatchMessage(&DirectX9Interface::Message);
|
||||
}
|
||||
HWND ForegroundWindow = GetForegroundWindow();
|
||||
if (ForegroundWindow == Process::Hwnd) {
|
||||
HWND TempProcessHwnd = GetWindow(ForegroundWindow, GW_HWNDPREV);
|
||||
SetWindowPos(OverlayWindow::Hwnd, TempProcessHwnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
||||
}
|
||||
|
||||
RECT TempRect;
|
||||
POINT TempPoint;
|
||||
ZeroMemory(&TempRect, sizeof(RECT));
|
||||
ZeroMemory(&TempPoint, sizeof(POINT));
|
||||
|
||||
GetClientRect(Process::Hwnd, &TempRect);
|
||||
ClientToScreen(Process::Hwnd, &TempPoint);
|
||||
|
||||
TempRect.left = TempPoint.x;
|
||||
TempRect.top = TempPoint.y;
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
io.ImeWindowHandle = Process::Hwnd;
|
||||
|
||||
POINT TempPoint2;
|
||||
GetCursorPos(&TempPoint2);
|
||||
io.MousePos.x = TempPoint2.x - TempPoint.x;
|
||||
io.MousePos.y = TempPoint2.y - TempPoint.y;
|
||||
|
||||
if (GetAsyncKeyState(0x1)) {
|
||||
io.MouseDown[0] = true;
|
||||
io.MouseClicked[0] = true;
|
||||
io.MouseClickedPos[0].x = io.MousePos.x;
|
||||
io.MouseClickedPos[0].x = io.MousePos.y;
|
||||
}
|
||||
else {
|
||||
io.MouseDown[0] = false;
|
||||
}
|
||||
|
||||
if (TempRect.left != OldRect.left || TempRect.right != OldRect.right || TempRect.top != OldRect.top || TempRect.bottom != OldRect.bottom) {
|
||||
OldRect = TempRect;
|
||||
Process::WindowWidth = TempRect.right;
|
||||
Process::WindowHeight = TempRect.bottom;
|
||||
DirectX9Interface::pParams.BackBufferWidth = Process::WindowWidth;
|
||||
DirectX9Interface::pParams.BackBufferHeight = Process::WindowHeight;
|
||||
SetWindowPos(OverlayWindow::Hwnd, (HWND)0, TempPoint.x, TempPoint.y, Process::WindowWidth, Process::WindowHeight, SWP_NOREDRAW);
|
||||
DirectX9Interface::pDevice->Reset(&DirectX9Interface::pParams);
|
||||
}
|
||||
Render();
|
||||
}
|
||||
ImGui_ImplDX9_Shutdown();
|
||||
ImGui_ImplWin32_Shutdown();
|
||||
ImGui::DestroyContext();
|
||||
if (DirectX9Interface::pDevice != NULL) {
|
||||
DirectX9Interface::pDevice->EndScene();
|
||||
DirectX9Interface::pDevice->Release();
|
||||
}
|
||||
if (DirectX9Interface::Direct3D9 != NULL) {
|
||||
DirectX9Interface::Direct3D9->Release();
|
||||
}
|
||||
DestroyWindow(OverlayWindow::Hwnd);
|
||||
UnregisterClass(OverlayWindow::WindowClass.lpszClassName, OverlayWindow::WindowClass.hInstance);
|
||||
}
|
||||
|
||||
bool DirectXInit() {
|
||||
if (FAILED(Direct3DCreate9Ex(D3D_SDK_VERSION, &DirectX9Interface::Direct3D9))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
D3DPRESENT_PARAMETERS Params = { 0 };
|
||||
Params.Windowed = TRUE;
|
||||
Params.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
||||
Params.hDeviceWindow = OverlayWindow::Hwnd;
|
||||
Params.MultiSampleQuality = D3DMULTISAMPLE_NONE;
|
||||
Params.BackBufferFormat = D3DFMT_A8R8G8B8;
|
||||
Params.BackBufferWidth = Process::WindowWidth;
|
||||
Params.BackBufferHeight = Process::WindowHeight;
|
||||
Params.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
|
||||
Params.EnableAutoDepthStencil = TRUE;
|
||||
Params.AutoDepthStencilFormat = D3DFMT_D16;
|
||||
Params.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
|
||||
Params.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
|
||||
|
||||
if (FAILED(DirectX9Interface::Direct3D9->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, OverlayWindow::Hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &Params, 0, &DirectX9Interface::pDevice))) {
|
||||
DirectX9Interface::Direct3D9->Release();
|
||||
return false;
|
||||
}
|
||||
|
||||
ImGui::CreateContext();
|
||||
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
||||
ImGui::GetIO().WantCaptureMouse || ImGui::GetIO().WantTextInput || ImGui::GetIO().WantCaptureKeyboard;
|
||||
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
|
||||
io.Fonts->AddFontDefault();
|
||||
|
||||
ImGui_ImplWin32_Init(OverlayWindow::Hwnd);
|
||||
ImGui_ImplDX9_Init(DirectX9Interface::pDevice);
|
||||
DirectX9Interface::Direct3D9->Release();
|
||||
return true;
|
||||
}
|
||||
|
||||
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
LRESULT CALLBACK WinProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {
|
||||
if (ImGui_ImplWin32_WndProcHandler(hWnd, Message, wParam, lParam))
|
||||
return true;
|
||||
|
||||
switch (Message) {
|
||||
case WM_DESTROY:
|
||||
if (DirectX9Interface::pDevice != NULL) {
|
||||
DirectX9Interface::pDevice->EndScene();
|
||||
DirectX9Interface::pDevice->Release();
|
||||
}
|
||||
if (DirectX9Interface::Direct3D9 != NULL) {
|
||||
DirectX9Interface::Direct3D9->Release();
|
||||
}
|
||||
PostQuitMessage(0);
|
||||
exit(4);
|
||||
break;
|
||||
case WM_SIZE:
|
||||
if (DirectX9Interface::pDevice != NULL && wParam != SIZE_MINIMIZED) {
|
||||
ImGui_ImplDX9_InvalidateDeviceObjects();
|
||||
DirectX9Interface::pParams.BackBufferWidth = LOWORD(lParam);
|
||||
DirectX9Interface::pParams.BackBufferHeight = HIWORD(lParam);
|
||||
//HRESULT hr = DirectX9Interface::pDevice->Reset(&DirectX9Interface::pParams);
|
||||
//if (hr == D3DERR_INVALIDCALL)
|
||||
//IM_ASSERT(0);
|
||||
ImGui_ImplDX9_CreateDeviceObjects();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return DefWindowProc(hWnd, Message, wParam, lParam);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetupWindow() {
|
||||
OverlayWindow::WindowClass = {
|
||||
sizeof(WNDCLASSEX), 0, WinProc, 0, 0, nullptr, LoadIcon(nullptr, IDI_APPLICATION), LoadCursor(nullptr, IDC_ARROW), nullptr, nullptr, OverlayWindow::Name, LoadIcon(nullptr, IDI_APPLICATION)
|
||||
};
|
||||
|
||||
RegisterClassEx(&OverlayWindow::WindowClass);
|
||||
if (Process::Hwnd){
|
||||
static RECT TempRect = { NULL };
|
||||
static POINT TempPoint;
|
||||
GetClientRect(Process::Hwnd, &TempRect);
|
||||
ClientToScreen(Process::Hwnd, &TempPoint);
|
||||
TempRect.left = TempPoint.x;
|
||||
TempRect.top = TempPoint.y;
|
||||
Process::WindowWidth = TempRect.right;
|
||||
Process::WindowHeight = TempRect.bottom;
|
||||
}
|
||||
|
||||
OverlayWindow::Hwnd = CreateWindowEx(NULL, OverlayWindow::Name, OverlayWindow::Name, WS_POPUP | WS_VISIBLE, Process::WindowLeft, Process::WindowTop, Process::WindowWidth, Process::WindowHeight, NULL, NULL, 0, NULL);
|
||||
DwmExtendFrameIntoClientArea(OverlayWindow::Hwnd, &DirectX9Interface::Margin);
|
||||
SetWindowLong(OverlayWindow::Hwnd, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TRANSPARENT);
|
||||
ShowWindow(OverlayWindow::Hwnd, SW_SHOW);
|
||||
UpdateWindow(OverlayWindow::Hwnd);
|
||||
}
|
||||
|
||||
DWORD WINAPI ProcessCheck(LPVOID lpParameter) {
|
||||
while (true) {
|
||||
if (Process::Hwnd != NULL) {
|
||||
if (Game::PID == 0) {
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
if (CreateConsole == false) {
|
||||
ShowWindow(GetConsoleWindow(), SW_HIDE);
|
||||
FreeConsole();
|
||||
}
|
||||
|
||||
bool WindowFocus = false;
|
||||
Game::PID = GetProcessId(TargetProcess);
|
||||
while (WindowFocus == false) {
|
||||
DWORD ForegroundWindowProcessID;
|
||||
GetWindowThreadProcessId(GetForegroundWindow(), &ForegroundWindowProcessID);
|
||||
if (Game::PID == ForegroundWindowProcessID) {
|
||||
Process::ID = GetCurrentProcessId();
|
||||
Process::Handle = GetCurrentProcess();
|
||||
Process::Hwnd = GetForegroundWindow();
|
||||
|
||||
RECT TempRect;
|
||||
GetWindowRect(Process::Hwnd, &TempRect);
|
||||
Process::WindowWidth = TempRect.right - TempRect.left;
|
||||
Process::WindowHeight = TempRect.bottom - TempRect.top;
|
||||
Process::WindowLeft = TempRect.left;
|
||||
Process::WindowRight = TempRect.right;
|
||||
Process::WindowTop = TempRect.top;
|
||||
Process::WindowBottom = TempRect.bottom;
|
||||
|
||||
char TempTitle[MAX_PATH];
|
||||
GetWindowText(Process::Hwnd, TempTitle, sizeof(TempTitle));
|
||||
Process::Title = TempTitle;
|
||||
|
||||
char TempClassName[MAX_PATH];
|
||||
GetClassName(Process::Hwnd, TempClassName, sizeof(TempClassName));
|
||||
Process::ClassName = TempClassName;
|
||||
|
||||
char TempPath[MAX_PATH];
|
||||
GetModuleFileNameEx(Process::Handle, NULL, TempPath, sizeof(TempPath));
|
||||
Process::Path = TempPath;
|
||||
|
||||
WindowFocus = true;
|
||||
}
|
||||
}
|
||||
|
||||
Game::handle = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, false, Game::PID);
|
||||
|
||||
std::string s = RandomString(10);
|
||||
OverlayWindow::Name = s.c_str();
|
||||
SetupWindow();
|
||||
DirectXInit();
|
||||
//CreateThread(0, 0, ProcessCheck, 0, 0, 0); TOFIX
|
||||
while (TRUE) {
|
||||
MainLoop();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user