#pragma once #include #include #include #include #include "D3D8_VMT.hpp" #include "Hook.hpp" #include "Scrapland.hpp" #include "Structures.hpp" #include "Util.hpp" uintmax_t frame = 0; bool hooked=false; bool overlay = false; LPD3DXFONT m_pFont; HFONT hFont; HBRUSH hBrush; D3DCOLOR color = D3DCOLOR_ARGB(255, 255, 0, 0); RECT Rect = {0, 0, 0, 0}; D3DRECT panel; size_t size_ht(HashTable *ht); size_t size_ht(HashTable *ht); LPDIRECT3DDEVICE8 Render(LPDIRECT3DDEVICE8 dev) { if (!overlay) { return dev; } char text[4096]; int32_t money = 0; size_t num_ents = 0; size_t num_ent_lst = 0; if (ptr(P_WORLD, 0) != nullptr) { money = ptr(P_WORLD, O_MONEY)[0]; num_ents = size_ht(ptr>(P_WORLD, O_ENTS)); num_ent_lst = size_ht(ptr>(P_WORLD, O_ENTLISTS)); } snprintf(text, 4096, R"(ScrapHack v0.1 Frame: [%lld] Money: [%d] Entities: [%ld] Entity Lists: [%ld])", ++frame, money, num_ents, num_ent_lst); if (m_pFont == nullptr) { D3DXCreateFont(dev, hFont, &m_pFont); hFont = nullptr; } m_pFont->Begin(); m_pFont->DrawTextA(text, -1, &Rect, DT_CALCRECT, 0); m_pFont->DrawTextA(text, -1, &Rect, DT_LEFT, color); m_pFont->End(); return dev; } HRESULT WINAPI H_EndScene(LPDIRECT3DDEVICE8 dev) { typedef decltype(&H_EndScene) t_func; shared_ptr hook = Hook::get(H_EndScene); return hook->func(Render(dev)); } HRESULT WINAPI H_SetLight(LPDIRECT3DDEVICE8 dev, DWORD index, D3DLIGHT8 *light) { typedef decltype(&H_SetLight) t_func; shared_ptr hook = Hook::get(H_SetLight); light->Diffuse.r = ((float)rand() / (float)RAND_MAX); light->Diffuse.g = ((float)rand() / (float)RAND_MAX); light->Diffuse.b = ((float)rand() / (float)RAND_MAX); light->Diffuse.a = 1.0; light->Specular.r = ((float)rand() / (float)RAND_MAX); light->Specular.g = ((float)rand() / (float)RAND_MAX); light->Specular.b = ((float)rand() / (float)RAND_MAX); light->Specular.r = 1.0; light->Ambient.r = ((float)rand() / (float)RAND_MAX); light->Ambient.g = ((float)rand() / (float)RAND_MAX); light->Ambient.b = ((float)rand() / (float)RAND_MAX); light->Ambient.a = 1.0; return hook->func(dev, index, light); } HRESULT WINAPI H_DrawIndexedPrimitive(LPDIRECT3DDEVICE8 dev, D3DPRIMITIVETYPE Type, UINT minIndex, UINT NumVertices, UINT startIndex, UINT primCount) { typedef decltype(&H_DrawIndexedPrimitive) t_func; DWORD AMBIENT; shared_ptr hook = Hook::get(H_DrawIndexedPrimitive); dev->GetRenderState(D3DRS_AMBIENT, &AMBIENT); dev->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(255, 255, 255)); dev->SetRenderState(D3DRS_FILLMODE, D3DFILLMODE::D3DFILL_SOLID); dev->SetRenderState(D3DRS_ZENABLE, 0); auto ret = hook->func(dev, Type, minIndex, NumVertices, startIndex, primCount); dev->SetRenderState(D3DRS_AMBIENT, AMBIENT); dev->SetRenderState(D3DRS_ZENABLE, 1); return ret; } void unhook_d3d8() { if (!hooked) { return; } if (m_pFont != nullptr) { m_pFont->Release(); m_pFont = nullptr; } Hook::drop(H_EndScene); Hook::drop(H_DrawIndexedPrimitive); Hook::drop(H_SetLight); hooked=false; } void hook_d3d8() { if (hooked) { return; } hFont = CreateFontA(15, 0, 0, 0, FW_EXTRABOLD, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, "Lucida Console"); hBrush = CreateSolidBrush(D3DCOLOR_ARGB(25, 0, 0, 0)); void *dev = nullptr; while (true) { dev = ptr(P_D3DDEV); if (dev) { break; } Sleep(100); }; Hook::addr(GetVTable(dev)[VMT_IDirect3DDevice8::m_EndScene], H_EndScene); Hook::addr(GetVTable(dev)[VMT_IDirect3DDevice8::m_DrawIndexedPrimitive], H_DrawIndexedPrimitive); Hook::addr(GetVTable(dev)[VMT_IDirect3DDevice8::m_SetLight], H_SetLight); hooked=true; return; }