Skip to content

Commit

Permalink
Custom Crosshair - Dont need to fetch from convar all the time
Browse files Browse the repository at this point in the history
  • Loading branch information
nullsystem committed Sep 27, 2024
1 parent 1bd5027 commit a461307
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 15 deletions.
57 changes: 42 additions & 15 deletions mp/src/game/client/hud_crosshair.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 );

Expand Down Expand Up @@ -279,7 +302,7 @@ void CHudCrosshair::Paint( void )
if ( pWeapon )
{
// NEO HACK (Rain): this should get implemented in virtual pNeoWep->GetWeaponCrosshairScale
pNeoWep = dynamic_cast<CNEOBaseCombatWeapon*>(pWeapon);
pNeoWep = static_cast<CNEOBaseCombatWeapon *>(pWeapon);
if (pNeoWep && pNeoWep->GetNeoWepBits() & NEO_WEP_SCOPEDWEAPON)
{
int screenWidth, screenHeight;
Expand Down Expand Up @@ -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)
Expand Down
9 changes: 9 additions & 0 deletions mp/src/game/client/hud_crosshair.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
#include "hudelement.h"
#include <vgui_controls/Panel.h>

#ifdef NEO
#include "ui/neo_hud_crosshair.h"
#endif

namespace vgui
{
class IScheme;
Expand All @@ -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();
Expand Down

0 comments on commit a461307

Please sign in to comment.