в целом код рабочий, но спустя какое то время например при спавне после раунда крашит игра, а так же при смене разрешения - зависает картинка, хотя по звукам сама игра работает
C++:
while (true)
{
if (kiero::init(kiero::RenderType::D3D11) == kiero::Status::Success)
{
kiero::bind(13, (void**)&oResizeBuffers, hkResizeBuffers);
kiero::bind(8, (void**)&oPresent, Present);
break;
}
}
HRESULT __stdcall Hooks::Present(IDXGISwapChain* pSwapChain, UINT uSyncInterval, UINT uFlags)
{
if (!pSwapChain) return oPresent(pSwapChain, uSyncInterval, uFlags);
GUI::OnPresent(pSwapChain, uSyncInterval, uFlags);
//AimBot::OnUpdate();
TriggerBot::OnUpdate();
//Glow::OnUpdate();
return oPresent(pSwapChain, uSyncInterval, uFlags);
}
HRESULT CS_FASTCALL Hooks::hkResizeBuffers(IDXGISwapChain* pSwapChain, std::uint32_t nBufferCount, std::uint32_t nWidth, std::uint32_t nHeight, DXGI_FORMAT newFormat, std::uint32_t nFlags) {
if (GUI::mainRenderTargetView)
{
GUI::mainRenderTargetView->Release();
GUI::mainRenderTargetView = nullptr;
}
ImGui_ImplDX11_InvalidateDeviceObjects();
// вызываем оригинальный ResizeBuffers
HRESULT hr = oResizeBuffers(pSwapChain, nBufferCount, nWidth, nHeight, newFormat, nFlags);
if (FAILED(hr))
return hr;
ID3D11Texture2D* pBackBuffer = nullptr;
if (SUCCEEDED(pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pBackBuffer)))
{
if (GUI::pDevice)
GUI::pDevice->CreateRenderTargetView(pBackBuffer, NULL, &GUI::mainRenderTargetView);
pBackBuffer->Release();
}
// обновляем viewport
D3D11_VIEWPORT vp = {};
vp.Width = static_cast<FLOAT>(nWidth);
vp.Height = static_cast<FLOAT>(nHeight);
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
if (GUI::pContext)
GUI::pContext->RSSetViewports(1, &vp);
if (GUI::mainRenderTargetView)
ImGui_ImplDX11_CreateDeviceObjects();
return hr;
}
void GUI::OnPresent(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags)
{
if (!GUI::inited)
{
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)OnWndProc);
GUI::Init();
GUI::inited = true;
blur::setup(pDevice, pContext);
}
else
return;
}
if (!mainRenderTargetView)
{
ID3D11Texture2D* pBackBuffer = nullptr;
if (SUCCEEDED(pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pBackBuffer)))
{
pDevice->CreateRenderTargetView(pBackBuffer, NULL, &mainRenderTargetView);
pBackBuffer->Release();
}
}
if (!pDevice || !pContext || !mainRenderTargetView)
return;
ImGui_ImplDX11_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
GUI::DrawWatermark(pSwapChain);
ESP::Draw();
//GUI::DrawFPS();
GUI::DrawSpectatorList();
GUI::DrawMenu();
ImGui::Render();
pContext->OMSetRenderTargets(1, &mainRenderTargetView, NULL);
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
}