Update setting ConVar int values from string to more closely match game logic.

( https://github.com/alliedmodders/sourcemod/issues/648 )

They use a double as a go-between to gain precision, rather than casting the float value to an int,
This commit is contained in:
Nicholas Hastings 2017-08-06 10:21:33 -04:00
parent 884ba15d3c
commit 0b94b21a91
3 changed files with 15 additions and 5 deletions

View File

@ -127,6 +127,7 @@ int V_atoi (const char *str);
int64 V_atoi64(const char *str); int64 V_atoi64(const char *str);
uint64 V_atoui64(const char *str); uint64 V_atoui64(const char *str);
float V_atof (const char *str); float V_atof (const char *str);
double V_atod(const char *str);
char* V_stristr( char* pStr, const char* pSearch ); char* V_stristr( char* pStr, const char* pSearch );
const char* V_stristr( const char* pStr, const char* pSearch ); const char* V_stristr( const char* pStr, const char* pSearch );
const char* V_strnistr( const char* pStr, const char* pSearch, int n ); const char* V_strnistr( const char* pStr, const char* pSearch, int n );

View File

@ -784,6 +784,7 @@ int ConVar::GetSplitScreenPlayerSlot( void ) const
void ConVar::InternalSetValue( const char *value ) void ConVar::InternalSetValue( const char *value )
{ {
float fNewValue; float fNewValue;
double dblNewValue;
char tempVal[ 32 ]; char tempVal[ 32 ];
char *val; char *val;
@ -792,17 +793,19 @@ void ConVar::InternalSetValue( const char *value )
float flOldValue = m_Value.m_fValue; float flOldValue = m_Value.m_fValue;
val = (char *)value; val = (char *)value;
fNewValue = ( float )atof( value ); dblNewValue = V_atod(value);
fNewValue = ( float )dblNewValue;
if ( ClampValue( fNewValue ) ) if ( ClampValue( fNewValue ) )
{ {
dblNewValue = fNewValue;
Q_snprintf( tempVal,sizeof(tempVal), "%f", fNewValue ); Q_snprintf( tempVal,sizeof(tempVal), "%f", fNewValue );
val = tempVal; val = tempVal;
} }
// Redetermine value // Redetermine value
m_Value.m_fValue = fNewValue; m_Value.m_fValue = fNewValue;
m_Value.m_nValue = ( int )( fNewValue ); m_Value.m_nValue = ( int )( dblNewValue );
if ( !( m_nFlags & FCVAR_NEVER_AS_STRING ) ) if ( !( m_nFlags & FCVAR_NEVER_AS_STRING ) )
{ {
@ -970,7 +973,8 @@ void ConVar::Create( const char *pName, const char *pDefaultValue, int flags /*=
if (callback) if (callback)
m_fnChangeCallbacks.AddToTail(callback); m_fnChangeCallbacks.AddToTail(callback);
m_Value.m_fValue = ( float )atof( m_Value.m_pszString ); double dblValue = V_atod( m_Value.m_pszString );
m_Value.m_fValue = ( float )dblValue;
// Bounds Check, should never happen, if it does, no big deal // Bounds Check, should never happen, if it does, no big deal
if ( m_bHasMin && ( m_Value.m_fValue < m_fMinVal ) ) if ( m_bHasMin && ( m_Value.m_fValue < m_fMinVal ) )
@ -983,7 +987,7 @@ void ConVar::Create( const char *pName, const char *pDefaultValue, int flags /*=
Assert( 0 ); Assert( 0 );
} }
m_Value.m_nValue = ( int )m_Value.m_fValue; m_Value.m_nValue = ( int )dblValue;
BaseClass::Create( pName, pHelpString, flags ); BaseClass::Create( pName, pHelpString, flags );
} }

View File

@ -379,8 +379,13 @@ int V_atoi (const char *str)
return 0; return 0;
} }
float V_atof (const char *str) float V_atof (const char *str)
{
return (float)V_atod(str);
}
double V_atod (const char *str)
{ {
_AssertValidStringPtr( str ); _AssertValidStringPtr( str );
double val; double val;