#include "hud.h" #include "../../../external/imgui/imgui.h" #include "../config/config.h" #include "../hooks/hooks.h" #include #include #include #include #include "../features/spectators/spectators.h" std::string g_DebugString; Hud::Hud() { } float CalculateFovRadius(float fovDegrees, float screenWidth, float screenHeight, float gameVerticalFOV) { float aspectRatio = screenWidth / screenHeight; float fovRadians = fovDegrees * (DirectX::XM_PI / 180.0f); float screenRadius = std::tan(fovRadians / 2.0f) * (screenHeight / 2.0f) / std::tan(gameVerticalFOV * (DirectX::XM_PI / 180.0f) / 2.0f); static float flScalingMultiplier = 2.5f; return screenRadius * flScalingMultiplier; } void RenderFovCircle(ImDrawList* drawList, float fov, ImVec2 screenCenter, float screenWidth, float screenHeight, float thickness) { float radius = CalculateFovRadius(fov, screenWidth, screenHeight, H::g_flActiveFov); uint32_t color = ImGui::ColorConvertFloat4ToU32(Config::fovCircleColor); drawList->AddCircle(screenCenter, radius, color, 100, thickness); } void Hud::render() { // Time std::time_t now = std::time(nullptr); std::tm localTime; localtime_s(&localTime, &now); char timeBuffer[9]; std::strftime(timeBuffer, sizeof(timeBuffer), "%H:%M:%S", &localTime); // FPS float fps = ImGui::GetIO().Framerate; std::ostringstream fpsStream; fpsStream << static_cast(fps) << " FPS"; // WaterMark std::string watermarkText = "TempleWare | " + fpsStream.str() + " | " + timeBuffer; ImVec2 textSize = ImGui::CalcTextSize(watermarkText.c_str()); float padding = 5.0f; ImVec2 pos = ImVec2(10, 10); ImVec2 rectSize = ImVec2(textSize.x + padding * 2, textSize.y + padding * 2); ImU32 bgColor = IM_COL32(50, 50, 50, 200); ImU32 borderColor = IM_COL32(153, 76, 204, 255); ImU32 textColor = IM_COL32(255, 255, 255, 255); ImDrawList* drawList = ImGui::GetBackgroundDrawList(); drawList->AddRectFilled(pos, ImVec2(pos.x + rectSize.x, pos.y + rectSize.y), bgColor); float lineThickness = 2.0f; drawList->AddLine(pos, ImVec2(pos.x, pos.y + rectSize.y), borderColor, lineThickness); drawList->AddLine(ImVec2(pos.x + rectSize.x, pos.y), ImVec2(pos.x + rectSize.x, pos.y + rectSize.y), borderColor, lineThickness); ImVec2 textPos = ImVec2(pos.x + padding, pos.y + padding); drawList->AddText(textPos, textColor, watermarkText.c_str()); if (Config::fov_circle) { ImVec2 Center = ImVec2(ImGui::GetIO().DisplaySize.x / 2.f, ImGui::GetIO().DisplaySize.y / 2.f); RenderFovCircle(drawList, Config::aimbot_fov, Center, ImGui::GetIO().DisplaySize.x, ImGui::GetIO().DisplaySize.y, 1.f); } // Debug overlay if (!g_DebugString.empty()) { ImVec2 debugPos = ImVec2(10, 40); // чуть ниже watermark ImU32 debugColor = IM_COL32(255, 255, 0, 255); // жёлтый ImGui::GetBackgroundDrawList()->AddText(debugPos, debugColor, g_DebugString.c_str()); } // Отображение списка наблюдателей //Spectators::RenderSpectatorList(); //Spectators::RenderPlayersDebugList(); // Тестовая информация для отладки //static int testCounter = 0; //testCounter++; //if (testCounter % 60 == 0) { // Каждую секунду (при 60 FPS) // g_DebugString = "Spectator test: " + std::to_string(Spectators::GetSpectators().size()) + " players found"; //} }