diff --git a/docs/cvars.md b/docs/cvars.md
index 46f98ba8..476cdea0 100644
--- a/docs/cvars.md
+++ b/docs/cvars.md
@@ -246,6 +246,7 @@
|sar_give_fly|cmd|sar_give_fly [n] - gives the player in slot n (0 by default) preserved crouchfly.|
|sar_groundframes_reset|cmd|sar_groundframes_reset - reset recorded groundframe statistics.|
|sar_groundframes_total|cmd|sar_groundframes_total [slot] - output a summary of groundframe counts for the given player slot.|
+|sar_hud_align|0|Alignment of HUD. (0 = left, 1 = center, 2 = right).|
|sar_hud_angles|0|Draws absolute view angles of the client.
0 = Default,
1 = XY,
2 = XYZ,
3 = X,
4 = Y.|
|sar_hud_avg|0|Draws calculated average of timer.|
|sar_hud_bg|0|Enable the SAR HUD background.|
diff --git a/src/Features/Hud/Hud.cpp b/src/Features/Hud/Hud.cpp
index 442e71f8..68fa3706 100644
--- a/src/Features/Hud/Hud.cpp
+++ b/src/Features/Hud/Hud.cpp
@@ -26,6 +26,7 @@ Variable sar_hud_x("sar_hud_x", "2", 0, "X padding of HUD.\n", FCVAR_DONTRECORD)
Variable sar_hud_y("sar_hud_y", "2", 0, "Y padding of HUD.\n", FCVAR_DONTRECORD);
Variable sar_hud_font_index("sar_hud_font_index", "0", 0, "Font index of HUD.\n", FCVAR_DONTRECORD);
Variable sar_hud_font_color("sar_hud_font_color", "255 255 255 255", "RGBA font color of HUD.\n", FCVAR_DONTRECORD);
+Variable sar_hud_align("sar_hud_align", "0", 0, "Alignment of HUD. (0 = left, 1 = center, 2 = right).\n", FCVAR_DONTRECORD);
Variable sar_hud_precision("sar_hud_precision", "2", 0, "Precision of HUD numbers.\n");
Variable sar_hud_velocity_precision("sar_hud_velocity_precision", "2", 0, "Precision of velocity HUD numbers.\n");
@@ -204,26 +205,15 @@ void HudContext::DrawElement(const char *fmt, ...) {
if (colon) strcpy(data, colon + 2);
}
- surface->DrawTxt(font, this->xPadding, this->yPadding + this->elements * (this->fontSize + this->spacing), this->textColor, data);
-
- ++this->elements;
-
+ int align = sar_hud_align.GetInt();
int width = surface->GetFontLength(this->font, "%s", data);
- if (width > this->maxWidth) this->maxWidth = width;
-}
-void HudContext::DrawElementOnScreen(const int groupID, const float xPos, const float yPos, const char *fmt, ...) {
- va_list argptr;
- va_start(argptr, fmt);
- char data[128];
- vsnprintf(data, sizeof(data), fmt, argptr);
- va_end(argptr);
+ int offset = !align ? 0 : align == 1 ? width / 2 : width;
- int pixLength = surface->GetFontLength(this->font, "%s", data);
-
- surface->DrawTxt(font, xPos - pixLength / 2, yPos + this->group[groupID] * (this->fontSize + this->spacing), this->textColor, data);
+ surface->DrawTxt(font, this->xPadding - offset, this->yPadding + this->elements * (this->fontSize + this->spacing), this->textColor, data);
+ ++this->elements;
- ++this->group[groupID];
+ if (width > this->maxWidth) this->maxWidth = width;
}
void HudContext::Reset(int slot) {
@@ -414,11 +404,15 @@ HUD_ELEMENT2_NO_DISABLE(text, HudType_InGame | HudType_Paused | HudType_Menu | H
for (auto &t : sar_hud_text_vals) {
int x = ctx->xPadding;
int y = ctx->yPadding + ctx->elements * (ctx->fontSize + ctx->spacing);
+ int totalPixLen = 0;
+ for (auto &c : t.second.components) totalPixLen += surface->GetFontLength(ctx->font, "%s", c.text.c_str());
+ int align = sar_hud_align.GetInt();
+ int offset = !align ? 0 : align == 1 ? totalPixLen / 2 : totalPixLen;
if (t.second.draw) {
for (auto &c : t.second.components) {
Color color = c.color ? *c.color : t.second.defaultColor ? *t.second.defaultColor : ctx->textColor;
int pixLen = surface->GetFontLength(ctx->font, "%s", c.text.c_str());
- surface->DrawTxt(ctx->font, x, y, color, "%s", c.text.c_str());
+ surface->DrawTxt(ctx->font, x - offset, y, color, "%s", c.text.c_str());
x += pixLen;
}
diff --git a/src/Features/Hud/Hud.hpp b/src/Features/Hud/Hud.hpp
index a88f0bc0..0163f00c 100644
--- a/src/Features/Hud/Hud.hpp
+++ b/src/Features/Hud/Hud.hpp
@@ -57,7 +57,6 @@ class HudContext {
public:
void DrawElement(const char *fmt, ...);
- void DrawElementOnScreen(const int nbElement, const float xPos, const float yPos, const char *fmt, ...);
void Reset(int slot);
};
@@ -170,6 +169,7 @@ extern Variable sar_hud_font_index;
extern Variable sar_hud_font_color;
extern Variable sar_hud_precision;
extern Variable sar_hud_shorthand;
+extern Variable sar_hud_align;
extern QAngle g_bluePortalAngles[2];
extern QAngle g_orangePortalAngles[2];
extern bool g_hudPrecisionWarn;
diff --git a/src/Modules/MaterialSystem.cpp b/src/Modules/MaterialSystem.cpp
index c68e7089..daf7275c 100644
--- a/src/Modules/MaterialSystem.cpp
+++ b/src/Modules/MaterialSystem.cpp
@@ -119,6 +119,7 @@ void MaterialSystem::Shutdown() {
RenderContextShutdown();
RenderContextInit();
}
+ SAFE_DELETE(g_renderContextPatch);
}
IMaterial *MaterialSystem::FindMaterial(const char *materialName, const char *textureGroupName) {
auto func = (IMaterial *(__rescall *)(void *, const char *, const char *, bool, const char *))this->materials->Current(Offsets::FindMaterial);
diff --git a/src/Modules/VGui.cpp b/src/Modules/VGui.cpp
index 0f36cb0f..da07f1cd 100644
--- a/src/Modules/VGui.cpp
+++ b/src/Modules/VGui.cpp
@@ -49,7 +49,10 @@ static void DrawHudBackground(int slot, HudContext &ctx) {
if (width != 0) width += 4;
- int x = ctx.xPadding - 2;
+ int align = sar_hud_align.GetInt();
+ int offset = !align ? 2 : align == 1 ? width / 2 : width - 3;
+
+ int x = ctx.xPadding - offset;
int y = ctx.yPadding - 2;
surface->DrawRect(Color{0, 0, 0, 192}, x, y, x + width, y + height);