From 9f1dcb5eeed730071e2b30ee04afb9b884afb6c5 Mon Sep 17 00:00:00 2001 From: GAMMACASE <31375974+GAMMACASE@users.noreply.github.com> Date: Sat, 27 Jun 2026 15:05:41 +0300 Subject: [PATCH] Add VectorWS as a ConVar type --- public/tier1/convar.h | 16 +++++++++++++++- public/tier1/strtools.h | 6 ++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/public/tier1/convar.h b/public/tier1/convar.h index 639d67ef..01000e94 100644 --- a/public/tier1/convar.h +++ b/public/tier1/convar.h @@ -24,6 +24,7 @@ #include "bufferstring.h" #include "tier1/characterset.h" #include "Color.h" +#include "vectorws.h" #include "playerslot.h" #include @@ -82,6 +83,7 @@ enum EConVarType : int16_t EConVarType_Vector3, EConVarType_Vector4, EConVarType_Qangle, + EConVarType_VectorWS, EConVarType_MAX }; @@ -103,6 +105,7 @@ template<> constexpr EConVarType TranslateConVarType( void ) { return template<> constexpr EConVarType TranslateConVarType( void ) { return EConVarType_Vector3; } template<> constexpr EConVarType TranslateConVarType( void ) { return EConVarType_Vector4; } template<> constexpr EConVarType TranslateConVarType( void ) { return EConVarType_Qangle; } +template<> constexpr EConVarType TranslateConVarType( void ) { return EConVarType_VectorWS; } template<> constexpr EConVarType TranslateConVarType( void ) { return EConVarType_Invalid; } union CVValue_t @@ -129,6 +132,7 @@ union CVValue_t CVValue_t( const Vector &value ) : m_vec3Value( value ) {} CVValue_t( const Vector4D &value ) : m_vec4Value( value ) {} CVValue_t( const QAngle &value ) : m_angValue( value ) {} + CVValue_t( const VectorWS &value ) : m_vecwsValue( value ) {} ~CVValue_t() {} operator bool() const { return m_bValue; } @@ -147,6 +151,7 @@ union CVValue_t operator const Vector&() const { return m_vec3Value; } operator const Vector4D&() const { return m_vec4Value; } operator const QAngle&() const { return m_angValue; } + operator const VectorWS&() const { return m_vecwsValue; } bool m_bValue; int16 m_i16Value; @@ -163,6 +168,7 @@ union CVValue_t Vector m_vec3Value; Vector4D m_vec4Value; QAngle m_angValue; + VectorWS m_vecwsValue; }; struct CVarCreationBase_t @@ -761,6 +767,7 @@ template<> void CvarTypeTrait_ValueToStringFn( const CVValue_t *obj, C template<> void CvarTypeTrait_ValueToStringFn( const CVValue_t *obj, CBufferString &buf ) { buf.Format( "%f %f %f", obj->m_vec3Value[0], obj->m_vec3Value[1], obj->m_vec3Value[2] ); } template<> void CvarTypeTrait_ValueToStringFn( const CVValue_t *obj, CBufferString &buf ) { buf.Format( "%f %f %f %f", obj->m_vec4Value[0], obj->m_vec4Value[1], obj->m_vec4Value[2], obj->m_vec4Value[3] ); } template<> void CvarTypeTrait_ValueToStringFn( const CVValue_t *obj, CBufferString &buf ) { buf.Format( "%f %f %f", obj->m_angValue[0], obj->m_angValue[1], obj->m_angValue[2] ); } +template<> void CvarTypeTrait_ValueToStringFn( const CVValue_t *obj, CBufferString &buf ) { buf.Format( "%f %f %f", obj->m_vecwsValue[0], obj->m_vecwsValue[1], obj->m_vecwsValue[2] ); } template<> void CvarTypeTrait_ValueToStringFn( const CVValue_t *obj, CBufferString &buf ) { if( obj->m_clrValue.a() == 255 ) @@ -795,6 +802,11 @@ template<> void CvarTypeTrait_ClampFn( CVValue_t *obj, const CVValue_t * if(min) for(int i = 0; i < 3; i++) obj->m_angValue[i] = Max( obj->m_angValue[i], min->m_angValue[i] ); if(max) for(int i = 0; i < 3; i++) obj->m_angValue[i] = Min( obj->m_angValue[i], max->m_angValue[i] ); } +template<> void CvarTypeTrait_ClampFn( CVValue_t *obj, const CVValue_t *min, const CVValue_t *max ) +{ + if(min) for(int i = 0; i < 3; i++) obj->m_vecwsValue[i] = Max( obj->m_vecwsValue[i], min->m_vecwsValue[i] ); + if(max) for(int i = 0; i < 3; i++) obj->m_vecwsValue[i] = Min( obj->m_vecwsValue[i], max->m_vecwsValue[i] ); +} class ConVarData; static ConVarData *GetInvalidConVarData( EConVarType type ); @@ -857,7 +869,8 @@ static CVarTypeTraits *GetCvarTypeTraits( EConVarType type ) *CVarTypeTraits().InitAs( "vector2", "0 0" ), *CVarTypeTraits().InitAs( "vector3", "0 0 0" ), *CVarTypeTraits().InitAs( "vector4", "0 0 0 0" ), - *CVarTypeTraits().InitAs( "qangle", "0 0 0" ) + *CVarTypeTraits().InitAs( "qangle", "0 0 0" ), + *CVarTypeTraits().InitAs( "vectorws", "0 0 0" ) }; return &s_TypeTraits[type]; @@ -1050,6 +1063,7 @@ static ConVarData *GetInvalidConVarData( EConVarType type ) ConVarData( TranslateConVarType() ), ConVarData( TranslateConVarType() ), ConVarData( TranslateConVarType() ), + ConVarData( TranslateConVarType() ), ConVarData( TranslateConVarType() ) // EConVarType_MAX }; diff --git a/public/tier1/strtools.h b/public/tier1/strtools.h index b8f650ad..804d52e8 100644 --- a/public/tier1/strtools.h +++ b/public/tier1/strtools.h @@ -27,6 +27,7 @@ class CBufferString; class Vector; class Vector2D; class Vector4D; +class VectorWS; class Quaternion; class Color; class QAngle; @@ -356,6 +357,9 @@ PLATFORM_INTERFACE void V_StringToQAngle(const char *buf, QAngle &out_ang, bool // Parses string into a Quaternion structure PLATFORM_INTERFACE void V_StringToQuaternion(const char *buf, Quaternion &out_quat, bool *successful = NULL, char **remainder = NULL, uint flags = PARSING_FLAG_NONE, IParsingErrorListener *err_listener = NULL); +// Parses string into a VectorWS structure +PLATFORM_INTERFACE void V_StringToVectorWS(const char *buf, VectorWS &out_vecws, bool *successful = NULL, char **remainder = NULL, uint flags = PARSING_FLAG_NONE, IParsingErrorListener *err_listener = NULL); + // Parses string as a uint64 value, where if the value exceeds min/max limits (inclusive), the parsing fails and default_value is returned PLATFORM_INTERFACE uint64 V_StringToUint64Limit(const char *buf, uint64 min, uint64 max, uint64 default_value, bool *successful = NULL, char **remainder = NULL, uint flags = PARSING_FLAG_NONE, IParsingErrorListener *err_listener = NULL); @@ -440,6 +444,8 @@ template <> inline bool V_StringToValue( const char *string, QAngle &val { bool success = false; V_StringToQAngle( string, value, &success, nullptr, flags ); return success; } template <> inline bool V_StringToValue( const char *string, Quaternion &value, uint flags ) { bool success = false; V_StringToQuaternion( string, value, &success, nullptr, flags ); return success; } +template <> inline bool V_StringToValue( const char *string, VectorWS &value, uint flags ) +{ bool success = false; V_StringToVectorWS( string, value, &success, nullptr, flags ); return success; } // returns string immediately following prefix, (ie str+strlen(prefix)) or NULL if prefix not found PLATFORM_INTERFACE const char *_V_StringAfterPrefix( const char *str, const char *prefix );