Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 13 additions & 22 deletions src/game/client/hud_crosshair.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,7 @@ void CVGlobal_NeoClCrosshair(IConVar *var, [[maybe_unused]] const char *pOldStri
CHudCrosshair *crosshair = GET_HUDELEMENT(CHudCrosshair);
if (crosshair && V_strstr(var->GetName(), "cl_neo_crosshair"))
{
// NEO NOTE (nullsystem): Only mark for refresh, not immediate as they will likely be multiple of convars sent
// over
// NEO NOTE (nullsystem): Mark for refresh
crosshair->m_bRefreshCrosshair = true;
}
}
Expand Down Expand Up @@ -392,7 +391,18 @@ void CHudCrosshair::Paint( void )
// NEO TODO (nullsystem): Probably be better if the entire class refreshed to our own
// thing and can do away with that CHudTexture nonsense entirely
const bool bIsScoped = pNeoWep && pNeoWep->GetNeoWepBits() & NEO_WEP_SCOPEDWEAPON;
const int iXHairStyle = cl_neo_crosshair_style.GetInt();

if (m_bRefreshCrosshair)
{
const bool bImported = ImportCrosshair(&m_crosshairInfo, cl_neo_crosshair.GetString());
if (!bImported)
{
cl_neo_crosshair.Revert();
ImportCrosshair(&m_crosshairInfo, CL_NEO_CROSSHAIR_DEFAULT);
}
m_bRefreshCrosshair = false;
}
const int iXHairStyle = m_crosshairInfo.iStyle;

trace_t iffTrace;
if (NEORules()->GetGameType() != NEO_GAME_TYPE_DM)
Expand Down Expand Up @@ -439,25 +449,6 @@ void CHudCrosshair::Paint( void )
}
else
{
if (m_bRefreshCrosshair)
{
m_crosshairInfo = CrosshairInfo{
.color = Color(
cl_neo_crosshair_color_r.GetInt(), cl_neo_crosshair_color_g.GetInt(),
cl_neo_crosshair_color_b.GetInt(), cl_neo_crosshair_color_a.GetInt()),
.iESizeType = cl_neo_crosshair_size_type.GetInt(),
.iSize = cl_neo_crosshair_size.GetInt(),
.flScrSize = cl_neo_crosshair_size_screen.GetFloat(),
.iThick = cl_neo_crosshair_thickness.GetInt(),
.iGap = cl_neo_crosshair_gap.GetInt(),
.iOutline = cl_neo_crosshair_outline.GetInt(),
.iCenterDot = cl_neo_crosshair_center_dot.GetInt(),
.bTopLine = cl_neo_crosshair_top_line.GetBool(),
.iCircleRad = cl_neo_crosshair_circle_radius.GetInt(),
.iCircleSegments = cl_neo_crosshair_circle_segments.GetInt(),
};
m_bRefreshCrosshair = false;
}
PaintCrosshair(m_crosshairInfo, iX, iY);
}

Expand Down
2 changes: 1 addition & 1 deletion src/game/client/hud_crosshair.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class CHudCrosshair : public CHudElement, public vgui::Panel

#ifdef NEO
int m_iTexXHId[CROSSHAIR_STYLE__TOTAL] = {};
int m_iTexIFFId = NULL;
int m_iTexIFFId = 0;
#endif

CPanelAnimationVar( bool, m_bHideCrosshair, "never_draw", "false" );
Expand Down
167 changes: 97 additions & 70 deletions src/game/client/neo/ui/neo_hud_crosshair.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,7 @@
#include "vgui_controls/Controls.h"
#include "ui/neo_root.h"

ConVar cl_neo_crosshair_style("cl_neo_crosshair_style", "0", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the crosshair style. 0 = default, 0 to 1 = textured, 2 = custom", true, 0.0f, true, CROSSHAIR_STYLE__TOTAL);
ConVar cl_neo_crosshair_color_r("cl_neo_crosshair_color_r", "255", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the red value of the crosshair color", true, 0.0f, true, UCHAR_MAX);
ConVar cl_neo_crosshair_color_g("cl_neo_crosshair_color_g", "255", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the green value of the crosshair color", true, 0.0f, true, UCHAR_MAX);
ConVar cl_neo_crosshair_color_b("cl_neo_crosshair_color_b", "255", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the blue value of the crosshair color", true, 0.0f, true, UCHAR_MAX);
ConVar cl_neo_crosshair_color_a("cl_neo_crosshair_color_a", "255", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the alpha value of the crosshair color", true, 0.0f, true, UCHAR_MAX);
ConVar cl_neo_crosshair_size("cl_neo_crosshair_size", "15", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the size of the crosshair (custom only)", true, 0.0f, true, CROSSHAIR_MAX_SIZE);
ConVar cl_neo_crosshair_size_screen("cl_neo_crosshair_size_screen", "0", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the size of the crosshair by half-screen scale (custom only)", true, 0.0f, true, 1.0f);
ConVar cl_neo_crosshair_size_type("cl_neo_crosshair_size_type", "0", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the size unit used for the crosshair. 0 = cl_neo_crosshair_size, 1 = cl_neo_crosshair_size_screen (custom only)", true, 0.0f, true, (CROSSHAIR_SIZETYPE__TOTAL - 1));
ConVar cl_neo_crosshair_thickness("cl_neo_crosshair_thickness", "1", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the thickness of the crosshair (custom only)", true, 0.0f, true, CROSSHAIR_MAX_THICKNESS);
ConVar cl_neo_crosshair_gap("cl_neo_crosshair_gap", "5", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the gap of the crosshair (custom only)", true, 0.0f, true, CROSSHAIR_MAX_GAP);
ConVar cl_neo_crosshair_outline("cl_neo_crosshair_outline", "0", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the crosshair outline (custom only)", true, 0.0f, true, CROSSHAIR_MAX_OUTLINE);
ConVar cl_neo_crosshair_center_dot("cl_neo_crosshair_center_dot", "0", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the size of the center dot (custom only)", true, 0.0f, true, CROSSHAIR_MAX_CENTER_DOT);
ConVar cl_neo_crosshair_top_line("cl_neo_crosshair_top_line", "1", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set if the top line will be shown (custom only)", true, 0.0f, true, 1.0f);
ConVar cl_neo_crosshair_circle_radius("cl_neo_crosshair_circle_radius", "0", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the circle radius of the crosshair (custom only)", true, 0.0f, true, CROSSHAIR_MAX_CIRCLE_RAD);
ConVar cl_neo_crosshair_circle_segments("cl_neo_crosshair_circle_segments", "30", FCVAR_ARCHIVE | FCVAR_USERINFO, "Set the segments of the circle (custom only)", true, 0.0f, true, CROSSHAIR_MAX_CIRCLE_SEGMENTS);
ConVar cl_neo_crosshair("cl_neo_crosshair", CL_NEO_CROSSHAIR_DEFAULT, FCVAR_ARCHIVE | FCVAR_USERINFO, "Serialized crosshair setting");

static const char *INTERNAL_CROSSHAIR_FILES[CROSSHAIR_STYLE__TOTAL] = { "vgui/hud/crosshair", "vgui/hud/crosshair_b", "" };
const char **CROSSHAIR_FILES = INTERNAL_CROSSHAIR_FILES;
Expand Down Expand Up @@ -115,79 +101,120 @@ void PaintCrosshair(const CrosshairInfo &crh, const int x, const int y)
enum NeoXHairSerial
{
NEOXHAIR_SERIAL_PREALPHA_V8_2 = 1,
NEOXHAIR_SERIAL_ALPHA_V17,

NEOXHAIR_SERIAL__LATESTPLUSONE,
NEOXHAIR_SERIAL_CURRENT = NEOXHAIR_SERIAL__LATESTPLUSONE - 1,
};
static constexpr unsigned int MAGIC_NUMBER = 0x15AF104B;

void ImportCrosshair(CrosshairInfo *crh, const char *szFullpath)
union NeoXHairVariant
{
if (!szFullpath)
{
return;
}
int iVal;
float flVal;
bool bVal;
};

enum NeoXHairVariantType
{
NEOXHAIRVARTYPE_INT = 0,
NEOXHAIRVARTYPE_FLOAT,
NEOXHAIRVARTYPE_BOOL,
};

static constexpr const NeoXHairVariantType NEOXHAIR_SEGMENT_VARTYPES[NEOXHAIR_SEGMENT__TOTAL] = {
NEOXHAIRVARTYPE_INT, // NEOXHAIR_SEGMENT_I_VERSION
NEOXHAIRVARTYPE_INT, // NEOXHAIR_SEGMENT_I_STYLE
NEOXHAIRVARTYPE_INT, // NEOXHAIR_SEGMENT_I_COLOR
NEOXHAIRVARTYPE_INT, // NEOXHAIR_SEGMENT_I_SIZETYPE
NEOXHAIRVARTYPE_INT, // NEOXHAIR_SEGMENT_I_SIZE
NEOXHAIRVARTYPE_FLOAT, // NEOXHAIR_SEGMENT_FL_SCRSIZE
NEOXHAIRVARTYPE_INT, // NEOXHAIR_SEGMENT_I_THICK
NEOXHAIRVARTYPE_INT, // NEOXHAIR_SEGMENT_I_GAP
NEOXHAIRVARTYPE_INT, // NEOXHAIR_SEGMENT_I_OUTLINE
NEOXHAIRVARTYPE_INT, // NEOXHAIR_SEGMENT_I_CENTERDOT
NEOXHAIRVARTYPE_BOOL, // NEOXHAIR_SEGMENT_B_TOPLINE
NEOXHAIRVARTYPE_INT, // NEOXHAIR_SEGMENT_I_CIRCLERAD
NEOXHAIRVARTYPE_INT, // NEOXHAIR_SEGMENT_I_CIRCLESEGMENTS
};

CUtlBuffer buf(0, 0, CUtlBuffer::READ_ONLY);
bool ImportCrosshair(CrosshairInfo *crh, const char *pszSequence)
{
int iPrevSegment = 0;
int iSegmentIdx = 0;
NeoXHairVariant vars[NEOXHAIR_SEGMENT__TOTAL] = {};

if (!filesystem->ReadFile(szFullpath, nullptr, buf))
const int iPszSequenceSize = V_strlen(pszSequence);
if (iPszSequenceSize <= 0 || iPszSequenceSize > NEO_XHAIR_SEQMAX)
{
Msg("[CROSSHAIR]: Failed to read file: %s", szFullpath);
return;
return false;
}

if (buf.GetUnsignedInt() != MAGIC_NUMBER)
char szMutSequence[NEO_XHAIR_SEQMAX];
V_memcpy(szMutSequence, pszSequence, sizeof(char) * iPszSequenceSize);
for (int i = 0; i < iPszSequenceSize && iSegmentIdx < NEOXHAIR_SEGMENT__TOTAL; ++i)
{
return;
const char ch = szMutSequence[i];
if (ch == ';')
{
szMutSequence[i] = '\0';
const char *pszCurSegment = szMutSequence + iPrevSegment;
const int iPszCurSegmentSize = i - iPrevSegment;
if (iPszCurSegmentSize > 0)
{
switch (NEOXHAIR_SEGMENT_VARTYPES[iSegmentIdx])
{
case NEOXHAIRVARTYPE_INT:
vars[iSegmentIdx].iVal = atoi(pszCurSegment);
break;
case NEOXHAIRVARTYPE_BOOL:
vars[iSegmentIdx].bVal = (atoi(pszCurSegment) != 0);
break;
case NEOXHAIRVARTYPE_FLOAT:
vars[iSegmentIdx].flVal = static_cast<float>(atof(pszCurSegment));
break;
}
}
iPrevSegment = i + 1;
++iSegmentIdx;
}
}

const int version = buf.GetInt();
if (version < 1 || version > NEOXHAIR_SERIAL_CURRENT)
if (iSegmentIdx < NEOXHAIR_SEGMENT__TOTAL)
{
Msg("[CROSSHAIR]: File corrupted, invalid version %d", version);
return;
return false;
}

crh->color.SetRawColor(buf.GetInt());
crh->iESizeType = buf.GetInt();
crh->iSize = buf.GetInt();
crh->flScrSize = buf.GetFloat();
crh->iThick = buf.GetInt();
crh->iGap = buf.GetInt();
crh->iOutline = buf.GetInt();
crh->iCenterDot = buf.GetInt();
crh->bTopLine = buf.GetChar();
crh->iCircleRad = buf.GetInt();
crh->iCircleSegments = buf.GetInt();

g_pNeoRoot->m_ns.bModified = true;
crh->iStyle = vars[NEOXHAIR_SEGMENT_I_STYLE].iVal;
crh->color.SetRawColor(vars[NEOXHAIR_SEGMENT_I_COLOR].iVal);
crh->iESizeType = vars[NEOXHAIR_SEGMENT_I_SIZETYPE].iVal;
crh->iSize = vars[NEOXHAIR_SEGMENT_I_SIZE].iVal;
crh->flScrSize = vars[NEOXHAIR_SEGMENT_FL_SCRSIZE].flVal;
crh->iThick = vars[NEOXHAIR_SEGMENT_I_THICK].iVal;
crh->iGap = vars[NEOXHAIR_SEGMENT_I_GAP].iVal;
crh->iOutline = vars[NEOXHAIR_SEGMENT_I_OUTLINE].iVal;
crh->iCenterDot = vars[NEOXHAIR_SEGMENT_I_CENTERDOT].iVal;
crh->bTopLine = vars[NEOXHAIR_SEGMENT_B_TOPLINE].bVal;
crh->iCircleRad = vars[NEOXHAIR_SEGMENT_I_CIRCLERAD].iVal;
crh->iCircleSegments = vars[NEOXHAIR_SEGMENT_I_CIRCLESEGMENTS].iVal;

return true;
}

void ExportCrosshair(CrosshairInfo *crh, const char *szFullpath)
void ExportCrosshair(const CrosshairInfo *crh, char (&szSequence)[NEO_XHAIR_SEQMAX])
{
if (!szFullpath)
{
return;
}

CUtlBuffer buf;
buf.PutUnsignedInt(MAGIC_NUMBER);
buf.PutInt(NEOXHAIR_SERIAL_CURRENT);

buf.PutInt(crh->color.GetRawColor());
buf.PutInt(crh->iESizeType);
buf.PutInt(crh->iSize);
buf.PutFloat(crh->flScrSize);
buf.PutInt(crh->iThick);
buf.PutInt(crh->iGap);
buf.PutInt(crh->iOutline);
buf.PutInt(crh->iCenterDot);
buf.PutChar(crh->bTopLine);
buf.PutInt(crh->iCircleRad);
buf.PutInt(crh->iCircleSegments);

if (!filesystem->WriteFile(szFullpath, nullptr, buf))
{
Msg("[CROSSHAIR]: Failed to write file: %s", szFullpath);
}
V_sprintf_safe(szSequence,
"%d;%d;%d;%d;%d;%.3f;%d;%d;%d;%d;%d;%d;%d;",
NEOXHAIR_SERIAL_CURRENT,
crh->iStyle,
crh->color.GetRawColor(),
crh->iESizeType,
crh->iSize,
crh->flScrSize,
crh->iThick,
crh->iGap,
crh->iOutline,
crh->iCenterDot,
static_cast<int>(crh->bTopLine),
crh->iCircleRad,
crh->iCircleSegments);
}
46 changes: 28 additions & 18 deletions src/game/client/neo/ui/neo_hud_crosshair.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,30 +25,38 @@ enum NeoHudCrosshairSizeType
CROSSHAIR_SIZETYPE__TOTAL,
};

extern ConVar cl_neo_crosshair_style;
extern ConVar cl_neo_crosshair_color_r;
extern ConVar cl_neo_crosshair_color_g;
extern ConVar cl_neo_crosshair_color_b;
extern ConVar cl_neo_crosshair_color_a;
extern ConVar cl_neo_crosshair_size;
extern ConVar cl_neo_crosshair_size_screen;
extern ConVar cl_neo_crosshair_size_type;
extern ConVar cl_neo_crosshair_thickness;
extern ConVar cl_neo_crosshair_gap;
extern ConVar cl_neo_crosshair_outline;
extern ConVar cl_neo_crosshair_center_dot;
extern ConVar cl_neo_crosshair_top_line;
extern ConVar cl_neo_crosshair_circle_radius;
extern ConVar cl_neo_crosshair_circle_segments;
extern ConVar cl_neo_crosshair;

extern const char **CROSSHAIR_FILES;
extern const wchar_t **CROSSHAIR_LABELS;
extern const wchar_t **CROSSHAIR_SIZETYPE_LABELS;

#define NEO_XHAIR_EXT "neoxhr"
#define CL_NEO_CROSSHAIR_DEFAULT "2;0;-1;0;2;0.000;1;2;0;0;1;0;0;"
static constexpr const int NEO_XHAIR_SEQMAX = 256;

enum NeoXHairSegment
{
NEOXHAIR_SEGMENT_I_VERSION = 0,
NEOXHAIR_SEGMENT_I_STYLE,
NEOXHAIR_SEGMENT_I_COLOR,
NEOXHAIR_SEGMENT_I_SIZETYPE,
NEOXHAIR_SEGMENT_I_SIZE,
NEOXHAIR_SEGMENT_FL_SCRSIZE,
NEOXHAIR_SEGMENT_I_THICK,
NEOXHAIR_SEGMENT_I_GAP,
NEOXHAIR_SEGMENT_I_OUTLINE,
NEOXHAIR_SEGMENT_I_CENTERDOT,
NEOXHAIR_SEGMENT_B_TOPLINE,
NEOXHAIR_SEGMENT_I_CIRCLERAD,
NEOXHAIR_SEGMENT_I_CIRCLESEGMENTS,

NEOXHAIR_SEGMENT__TOTAL,
NEOXHAIR_SEGMENT__TOTAL_SERIAL_ALPHA_V17 = NEOXHAIR_SEGMENT_I_CIRCLESEGMENTS + 1,
};

struct CrosshairInfo
{
int iStyle;
Color color;
int iESizeType; // int NeoHudCrosshairSizeType
int iSize;
Expand All @@ -62,5 +70,7 @@ struct CrosshairInfo
int iCircleSegments;
};
void PaintCrosshair(const CrosshairInfo &crh, const int x, const int y);
void ImportCrosshair(CrosshairInfo *crh, const char *szFullpath);
void ExportCrosshair(CrosshairInfo *crh, const char *szFullpath);

// NEO NOTE (nullsystem): (*&)[NUM] enforces array size
bool ImportCrosshair(CrosshairInfo *crh, const char *pszSequence);
void ExportCrosshair(const CrosshairInfo *crh, char (&szSequence)[NEO_XHAIR_SEQMAX]);
7 changes: 0 additions & 7 deletions src/game/client/neo/ui/neo_root.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2035,12 +2035,6 @@ void CNeoRoot::ReadNewsFile(CUtlBuffer &buf)
}
}

void CNeoRoot::OnFileSelectedMode_Crosshair(const char *szFullpath)
{
((m_ns.crosshair.eFileIOMode == vgui::FOD_OPEN) ?
&ImportCrosshair : &ExportCrosshair)(&m_ns.crosshair.info, szFullpath);
}

void CNeoRoot::OnFileSelectedMode_Spray(const char *szFullpath)
{
// Ensure the directories are there to write to
Expand Down Expand Up @@ -2229,7 +2223,6 @@ LightmappedGeneric
void CNeoRoot::OnFileSelected(const char *szFullpath)
{
static void (CNeoRoot::*FILESELMODEFNS[FILEIODLGMODE__TOTAL])(const char *) = {
&CNeoRoot::OnFileSelectedMode_Crosshair, // FILEIODLGMODE_CROSSHAIR
&CNeoRoot::OnFileSelectedMode_Spray, // FILEIODLGMODE_SPRAY
};
(this->*FILESELMODEFNS[m_eFileIOMode])(szFullpath);
Expand Down
4 changes: 1 addition & 3 deletions src/game/client/neo/ui/neo_root.h
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,7 @@ class CNeoRoot : public vgui::EditablePanel, public CGameEventListener

enum FileIODialogMode
{
FILEIODLGMODE_CROSSHAIR = 0,
FILEIODLGMODE_SPRAY,
FILEIODLGMODE_SPRAY = 0,

FILEIODLGMODE__TOTAL,
};
Expand All @@ -234,7 +233,6 @@ class CNeoRoot : public vgui::EditablePanel, public CGameEventListener
SprayInfo m_sprayToDelete = {};

private:
void OnFileSelectedMode_Crosshair(const char *szFullpath);
void OnFileSelectedMode_Spray(const char *szFullpath);
};

Expand Down
Loading