diff --git a/src/game/client/neo/ui/neo_hud_friendly_marker.cpp b/src/game/client/neo/ui/neo_hud_friendly_marker.cpp index 9debc6117a..94791f4ded 100644 --- a/src/game/client/neo/ui/neo_hud_friendly_marker.cpp +++ b/src/game/client/neo/ui/neo_hud_friendly_marker.cpp @@ -49,13 +49,14 @@ void iffMarkerChangeCallback( IConVar *pConVar, char const* pOldString, float fl } } -ConVar cl_neo_squad_marker("cl_neo_squad_marker", NEO_SQUAD_MARKER_DEFAULT, FCVAR_ARCHIVE | FCVAR_DONTRECORD, "IFF Marker settings for squad-mates", iffMarkerChangeCallback); -ConVar cl_neo_friendly_marker("cl_neo_friendly_marker", NEO_FRIENDLY_MARKER_DEFAULT, FCVAR_ARCHIVE | FCVAR_DONTRECORD, "IFF Marker settings for team-mates", iffMarkerChangeCallback); -ConVar cl_neo_spectator_marker("cl_neo_spectator_marker", NEO_SPECTATOR_MARKER_DEFAULT, FCVAR_ARCHIVE | FCVAR_DONTRECORD, "IFF Marker settings for spectated players", iffMarkerChangeCallback); +constexpr auto markerFlags = FCVAR_ARCHIVE | FCVAR_PRINTABLEONLY | FCVAR_DONTRECORD; +ConVar cl_neo_squad_marker("cl_neo_squad_marker", NEO_SQUAD_MARKER_DEFAULT, markerFlags, "IFF Marker settings for squad-mates", iffMarkerChangeCallback); +ConVar cl_neo_friendly_marker("cl_neo_friendly_marker", NEO_FRIENDLY_MARKER_DEFAULT, markerFlags, "IFF Marker settings for team-mates", iffMarkerChangeCallback); +ConVar cl_neo_spectator_marker("cl_neo_spectator_marker", NEO_SPECTATOR_MARKER_DEFAULT, markerFlags, "IFF Marker settings for spectated players", iffMarkerChangeCallback); #ifdef GLOWS_ENABLE -ConVar cl_neo_squad_xray_marker("cl_neo_squad_xray_marker", NEO_SQUAD_XRAY_MARKER_DEFAULT, FCVAR_ARCHIVE | FCVAR_DONTRECORD, "IFF Marker settings for squad-mates with xray enabled", iffMarkerChangeCallback); -ConVar cl_neo_friendly_xray_marker("cl_neo_friendly_xray_marker", NEO_FRIENDLY_XRAY_MARKER_DEFAULT, FCVAR_ARCHIVE | FCVAR_DONTRECORD, "IFF Marker settings for team-mates with xray enabled", iffMarkerChangeCallback); -ConVar cl_neo_spectator_xray_marker("cl_neo_spectator_xray_marker", NEO_SPECTATOR_XRAY_MARKER_DEFAULT, FCVAR_ARCHIVE | FCVAR_DONTRECORD, "IFF Marker settings for spectated players with xray enabled", iffMarkerChangeCallback); +ConVar cl_neo_squad_xray_marker("cl_neo_squad_xray_marker", NEO_SQUAD_XRAY_MARKER_DEFAULT, markerFlags, "IFF Marker settings for squad-mates with xray enabled", iffMarkerChangeCallback); +ConVar cl_neo_friendly_xray_marker("cl_neo_friendly_xray_marker", NEO_FRIENDLY_XRAY_MARKER_DEFAULT, markerFlags, "IFF Marker settings for team-mates with xray enabled", iffMarkerChangeCallback); +ConVar cl_neo_spectator_xray_marker("cl_neo_spectator_xray_marker", NEO_SPECTATOR_XRAY_MARKER_DEFAULT, markerFlags, "IFF Marker settings for spectated players with xray enabled", iffMarkerChangeCallback); #endif // GLOWS_ENABLE void CNEOHud_FriendlyMarker::UpdateStateForNeoHudElementDraw() @@ -407,7 +408,29 @@ bool ImportMarker(FriendlyMarkerInfo *crh, const char *pszSequence) for (int i = 0; i < iPszSequenceLength && iSegmentIdx < NEOIFFMARKER_SEGMENT__TOTAL; ++i) { const char ch = szMutSequence[i]; - if (ch == ';') + + // NEO NOTE (Rain): I am changing the delimiter away from ';' because the Source cmd tokenizer + // does not have a sensible character escape syntax, and ';' is already used as command end token, + // which causes issues when trying to chain commands with an inner semicolon. + // NEO TODO (Rain): we should probably also update the xhair syntax and any other such serializations + // to ideally use the same, non-semicolon token, and declare that in a global header somewhere. + constexpr char deprecated_delimiter = ';'; + static_assert(deprecated_delimiter != NEO_MARKER_DELIMITER); + if (ch == deprecated_delimiter) + { + char point_to[NEO_IFFMARKER_SEQMAX]; + V_memset(point_to, ' ', i); + point_to[i] = '^'; + point_to[i+1] = '\0'; + Warning("Please replace the \"%c\" characters with \"%c\" in your marker syntax.\n" + "Failed for input at pos %d:\n\t%s\n\t%s\n", + deprecated_delimiter, NEO_MARKER_DELIMITER, + i, pszSequence, + point_to); + return false; + } + + if (ch == NEO_MARKER_DELIMITER) { szMutSequence[i] = '\0'; const char *pszCurSegment = szMutSequence + iPrevSegment; @@ -454,15 +477,15 @@ bool ImportMarker(FriendlyMarkerInfo *crh, const char *pszSequence) void ExportMarker(const FriendlyMarkerInfo *crh, char (&szSequence)[NEO_IFFMARKER_SEQMAX]) { V_sprintf_safe(szSequence, - "%d;%d;%d;%d;%.2f;%d;%d;%d;%d;%d;", - crh->iInitialOffset, - static_cast(crh->bShowDistance), - static_cast(crh->bVerboseDistance), - static_cast(crh->bShowSquadMarker), - crh->flSquadMarkerScale, - static_cast(crh->bShowHealthBar), - static_cast(crh->bShowHealth), - static_cast(crh->bShowName), - static_cast(crh->bPrependClantagToName), - crh->iMaxNameLength); + "%d%c%d%c%d%c%d%c%.2f%c%d%c%d%c%d%c%d%c%d%c", + crh->iInitialOffset, NEO_MARKER_DELIMITER, + static_cast(crh->bShowDistance), NEO_MARKER_DELIMITER, + static_cast(crh->bVerboseDistance), NEO_MARKER_DELIMITER, + static_cast(crh->bShowSquadMarker), NEO_MARKER_DELIMITER, + crh->flSquadMarkerScale, NEO_MARKER_DELIMITER, + static_cast(crh->bShowHealthBar), NEO_MARKER_DELIMITER, + static_cast(crh->bShowHealth), NEO_MARKER_DELIMITER, + static_cast(crh->bShowName), NEO_MARKER_DELIMITER, + static_cast(crh->bPrependClantagToName), NEO_MARKER_DELIMITER, + crh->iMaxNameLength, NEO_MARKER_DELIMITER); } diff --git a/src/game/client/neo/ui/neo_hud_friendly_marker.h b/src/game/client/neo/ui/neo_hud_friendly_marker.h index 9f83af606a..485a7631ed 100644 --- a/src/game/client/neo/ui/neo_hud_friendly_marker.h +++ b/src/game/client/neo/ui/neo_hud_friendly_marker.h @@ -22,13 +22,15 @@ enum NeoIFFMarkerSegment NEOIFFMARKER_SEGMENT__TOTAL, }; -#define NEO_SQUAD_MARKER_DEFAULT "0;1;0;0;0.50;1;0;1;1;32;" -#define NEO_FRIENDLY_MARKER_DEFAULT "0;1;0;1;0.50;1;0;0;0;32;" -#define NEO_SPECTATOR_MARKER_DEFAULT "0;0;0;1;0.50;1;1;1;1;32;" +constexpr const char NEO_MARKER_DELIMITER = ','; + +#define NEO_SQUAD_MARKER_DEFAULT "0,1,0,0,0.50,1,0,1,1,32," +#define NEO_FRIENDLY_MARKER_DEFAULT "0,1,0,1,0.50,1,0,0,0,32," +#define NEO_SPECTATOR_MARKER_DEFAULT "0,0,0,1,0.50,1,1,1,1,32," #ifdef GLOWS_ENABLE -#define NEO_SQUAD_XRAY_MARKER_DEFAULT "4;0;0;0;0.50;1;0;1;0;32;" -#define NEO_FRIENDLY_XRAY_MARKER_DEFAULT "4;0;0;0;0.50;1;0;0;0;32;" -#define NEO_SPECTATOR_XRAY_MARKER_DEFAULT "4;0;0;0;0.50;1;0;1;1;32;" +#define NEO_SQUAD_XRAY_MARKER_DEFAULT "4,0,0,0,0.50,1,0,1,0,32," +#define NEO_FRIENDLY_XRAY_MARKER_DEFAULT "4,0,0,0,0.50,1,0,0,0,32," +#define NEO_SPECTATOR_XRAY_MARKER_DEFAULT "4,0,0,0,0.50,1,0,1,1,32," #endif // GLOWS_ENABLE constexpr int NEO_IFFMARKER_SEQMAX = 32; constexpr int MAX_MARKER_STRSIZE = 48 + NEO_MAX_CLANTAG_LENGTH + 1;