diff --git a/mp/src/game/client/hud_crosshair.cpp b/mp/src/game/client/hud_crosshair.cpp index a9e62c525..8fbf261b3 100644 --- a/mp/src/game/client/hud_crosshair.cpp +++ b/mp/src/game/client/hud_crosshair.cpp @@ -47,9 +47,32 @@ int ScreenTransform( const Vector& point, Vector& screen ); DECLARE_HUDELEMENT_DEPTH(CHudCrosshair, 9999); #endif +#ifdef NEO +static inline bool g_bInstalledCVarCallback = false; + +void CVGlobal_NeoClCrosshair(IConVar *var, [[maybe_unused]] const char *pOldString, [[maybe_unused]] float flOldValue) +{ + CHudCrosshair *crosshair = GET_HUDELEMENT(CHudCrosshair); + if (crosshair && V_strstr(var->GetName(), "neo_cl_crosshair")) + { + // NEO NOTE (nullsystem): Only mark for refresh, not immediate as they will likely be multiple of convars sent + // over + crosshair->m_bRefreshCrosshair = true; + } +} +#endif + CHudCrosshair::CHudCrosshair( const char *pElementName ) : CHudElement( pElementName ), BaseClass( NULL, "HudCrosshair" ) { +#ifdef NEO + if (!g_bInstalledCVarCallback) + { + cvar->InstallGlobalChangeCallback(CVGlobal_NeoClCrosshair); + g_bInstalledCVarCallback = true; + } +#endif + vgui::Panel *pParent = g_pClientMode->GetViewport(); SetParent( pParent ); @@ -279,7 +302,7 @@ void CHudCrosshair::Paint( void ) if ( pWeapon ) { // NEO HACK (Rain): this should get implemented in virtual pNeoWep->GetWeaponCrosshairScale - pNeoWep = dynamic_cast(pWeapon); + pNeoWep = static_cast(pWeapon); if (pNeoWep && pNeoWep->GetNeoWepBits() & NEO_WEP_SCOPEDWEAPON) { int screenWidth, screenHeight; @@ -350,20 +373,24 @@ void CHudCrosshair::Paint( void ) } else { - PaintCrosshair(CrosshairInfo{ - .color = Color( - neo_cl_crosshair_color_r.GetInt(), neo_cl_crosshair_color_g.GetInt(), - neo_cl_crosshair_color_b.GetInt(), neo_cl_crosshair_color_a.GetInt()), - .iSize = neo_cl_crosshair_size.GetInt(), - .iThick = neo_cl_crosshair_thickness.GetInt(), - .iGap = neo_cl_crosshair_gap.GetInt(), - .iOutline = neo_cl_crosshair_outline.GetInt(), - .iCenterDot = neo_cl_crosshair_center_dot.GetInt(), - .bTopLine = neo_cl_crosshair_top_line.GetBool(), - .iCircleRad = neo_cl_crosshair_circle_radius.GetInt(), - .iCircleSegments = neo_cl_crosshair_circle_segments.GetInt(), - }, - iX, iY); + if (m_bRefreshCrosshair) + { + m_crosshairInfo = CrosshairInfo{ + .color = Color( + neo_cl_crosshair_color_r.GetInt(), neo_cl_crosshair_color_g.GetInt(), + neo_cl_crosshair_color_b.GetInt(), neo_cl_crosshair_color_a.GetInt()), + .iSize = neo_cl_crosshair_size.GetInt(), + .iThick = neo_cl_crosshair_thickness.GetInt(), + .iGap = neo_cl_crosshair_gap.GetInt(), + .iOutline = neo_cl_crosshair_outline.GetInt(), + .iCenterDot = neo_cl_crosshair_center_dot.GetInt(), + .bTopLine = neo_cl_crosshair_top_line.GetBool(), + .iCircleRad = neo_cl_crosshair_circle_radius.GetInt(), + .iCircleSegments = neo_cl_crosshair_circle_segments.GetInt(), + }; + m_bRefreshCrosshair = false; + } + PaintCrosshair(m_crosshairInfo, iX, iY); } if (bIsScoped) diff --git a/mp/src/game/client/hud_crosshair.h b/mp/src/game/client/hud_crosshair.h index 7952db29a..cae166c28 100644 --- a/mp/src/game/client/hud_crosshair.h +++ b/mp/src/game/client/hud_crosshair.h @@ -14,6 +14,10 @@ #include "hudelement.h" #include +#ifdef NEO +#include "ui/neo_hud_crosshair.h" +#endif + namespace vgui { class IScheme; @@ -29,6 +33,11 @@ class CHudCrosshair : public CHudElement, public vgui::Panel CHudCrosshair( const char *pElementName ); virtual ~CHudCrosshair(); +#ifdef NEO + bool m_bRefreshCrosshair = true; + CrosshairInfo m_crosshairInfo; +#endif + virtual void SetCrosshairAngle( const QAngle& angle ); virtual void SetCrosshair( CHudTexture *texture, const Color& clr ); virtual void ResetCrosshair();