2025-07-17 13:52:06 +03:00

175 lines
5.2 KiB
C++

#include "debug/debug.h"
#include "includes.h"
#include "templeware/templeware.h"
#include "templeware/renderer/icons.h"
#include "../external/kiero/minhook/include/MinHook.h"
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
TempleWare templeWare;
Present oPresent;
HWND window = NULL;
WNDPROC oWndProc;
ID3D11Device* pDevice = NULL;
ID3D11DeviceContext* pContext = NULL;
ID3D11RenderTargetView* mainRenderTargetView;
LRESULT __stdcall WndProc(const HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (ImGui_ImplWin32_WndProcHandler(hWnd, uMsg, wParam, lParam)) {
return true;
}
return CallWindowProc(oWndProc, hWnd, uMsg, wParam, lParam);
}
bool init = false;
HRESULT __stdcall hkPresent(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags)
{
if (!init)
{
if (SUCCEEDED(pSwapChain->GetDevice(__uuidof(ID3D11Device), (void**)&pDevice)))
{
pDevice->GetImmediateContext(&pContext);
DXGI_SWAP_CHAIN_DESC sd;
pSwapChain->GetDesc(&sd);
window = sd.OutputWindow;
ID3D11Texture2D* pBackBuffer;
pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
pDevice->CreateRenderTargetView(pBackBuffer, NULL, &mainRenderTargetView);
pBackBuffer->Release();
oWndProc = (WNDPROC)SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)WndProc);
#ifdef TEMPLEDEBUG
initDebug();
#endif
templeWare.init(window, pDevice, pContext, mainRenderTargetView);
init = true;
}
else
return oPresent(pSwapChain, SyncInterval, Flags);
}
ImFontConfig imIconsConfig;
imIconsConfig.RasterizerMultiply = 1.2f;
constexpr ImWchar wIconRanges[] =
{
0xE000, 0xF8FF, // Private Use Area
0
};
ImGui_ImplDX11_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
if (GetAsyncKeyState(VK_END) & 1) {
templeWare.renderer.menu.toggleMenu();
}
templeWare.renderer.menu.render();
templeWare.renderer.hud.render();
// Always call esp() to allow individual components to be rendered
templeWare.renderer.visuals.esp();
ImGui::Render();
pContext->OMSetRenderTargets(1, &mainRenderTargetView, NULL);
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
return oPresent(pSwapChain, SyncInterval, Flags);
}
void init_console() {
if (::AllocConsole()) {
FILE* f;
freopen_s(&f, "CONOUT$", "w", stdout); // Redirect stdout to console
freopen_s(&f, "CONOUT$", "w", stderr); // Redirect stderr to console
::SetConsoleTitleW(L"TempleWare");
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
printf(R"(___________ .__ __ __
\__ ___/___ _____ ______ | | ____/ \ / \_____ _______ ____
| |_/ __ \ / \\____ \| | _/ __ \ \/\/ /\__ \\_ __ \_/ __ \
| |\ ___/| Y Y \ |_> > |_\ ___/\ / / __ \| | \/\ ___/
|____| \___ >__|_| / __/|____/\___ >\__/\ / (____ /__| \___ >
\/ \/|__| \/ \/ \/ \/
)");
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
printf("[");
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
printf("+");
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
printf("] Console allocated successfully!\n");
}
}
DWORD WINAPI MainThread(LPVOID lpReserved)
{
bool init_hook = false;
do
{
init_console();
// hook hkPresent and init cheat
if (!init_hook) {
if (kiero::init(kiero::RenderType::D3D11) == kiero::Status::Success)
{
kiero::bind(8, (void**)&oPresent, hkPresent);
init_hook = true;
}
}
} while (!GetAsyncKeyState(VK_F4));
if (oWndProc != nullptr)
{
// restore wnd proc
SetWindowLongPtrW(window, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(oWndProc));
// invalidate old wnd proc
oWndProc = nullptr;
}
kiero::shutdown();
// destroy minhook
MH_DisableHook(MH_ALL_HOOKS);
MH_RemoveHook(MH_ALL_HOOKS);
MH_Uninitialize();
// free allocated memory for console
::FreeConsole();
// close console window
if (const HWND hConsoleWindow = ::GetConsoleWindow(); hConsoleWindow != nullptr)
::PostMessageW(hConsoleWindow, WM_CLOSE, 0U, 0L);
fclose(stdout);
fclose(stderr);
// close thread
FreeLibraryAndExitThread(reinterpret_cast<HMODULE>(lpReserved), EXIT_SUCCESS);
return TRUE;
}
BOOL WINAPI DllMain(HMODULE hMod, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hMod);
CreateThread(nullptr, 0, MainThread, hMod, 0, nullptr);
break;
case DLL_PROCESS_DETACH:
kiero::shutdown();
break;
}
return TRUE;
}