95 lines
3.5 KiB
C++
95 lines
3.5 KiB
C++
#include "hud.h"
|
|
#include "../../../external/imgui/imgui.h"
|
|
#include "../config/config.h"
|
|
#include "../hooks/hooks.h"
|
|
#include <ctime>
|
|
#include <string>
|
|
#include <sstream>
|
|
#include <DirectXMath.h>
|
|
#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<int>(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";
|
|
//}
|
|
} |