Add skin config persistence, auto-load config on inject and safe config parsing

Save/load weapon skin and music selections in .mh, try/catch around int/float parsing, optional auto-load of one chosen config on inject
This commit is contained in:
2026-08-05 19:07:32 +02:00
parent 89e9553f70
commit 0f3282112a
3 changed files with 84 additions and 2 deletions
@@ -73,6 +73,19 @@ auto CAndromedaClient::OnClientOutput() -> void
auto CAndromedaClient::OnCreateMove( CCSGOInput* pInput , CUserCmd* pUserCmd ) -> void auto CAndromedaClient::OnCreateMove( CCSGOInput* pInput , CUserCmd* pUserCmd ) -> void
{ {
static bool bConfigLoaded = false;
if ( !bConfigLoaded )
{
bConfigLoaded = true;
if ( Settings::Config::AutoLoadOnInject )
{
Settings::Config::FileName = Settings::Config::AutoLoadFile;
Settings::LoadConfig();
}
}
if ( !Settings::SafeMode::Active ) if ( !Settings::SafeMode::Active )
GetVisual()->OnCreateMove(); GetVisual()->OnCreateMove();
@@ -846,6 +846,40 @@ auto CAndromedaMenu::RenderConfigPanel() -> void
Settings::LoadConfig(); Settings::LoadConfig();
} }
ImGui::Separator();
Checkbox( "Beim Inject automatisch laden" , Settings::Config::AutoLoadOnInject );
if ( Settings::Config::AutoLoadOnInject )
{
const auto vAutoFiles = Settings::Config::ListFiles();
std::vector<const char*> vAutoItems;
for ( const auto& file : vAutoFiles )
vAutoItems.push_back( file.c_str() );
if ( vAutoItems.empty() )
vAutoItems.push_back( "(keine .mh gefunden)" );
static int iAutoLoadIdx = -1;
for ( int i = 0; i < static_cast<int>( vAutoFiles.size() ); i++ )
{
if ( vAutoFiles[ i ] == Settings::Config::AutoLoadFile )
{
iAutoLoadIdx = i;
break;
}
}
if ( Combo( "Auto-Load Datei" , iAutoLoadIdx , vAutoItems.data() , static_cast<int>( vAutoItems.size() ) ) )
{
if ( iAutoLoadIdx >= 0 && iAutoLoadIdx < static_cast<int>( vAutoFiles.size() ) )
Settings::Config::AutoLoadFile = vAutoFiles[ iAutoLoadIdx ];
}
}
ImGui::SeparatorText( "Menu" ); ImGui::SeparatorText( "Menu" );
SliderInt( "Menu Alpha" , Settings::Menu::MenuAlpha , 100 , 255 ); SliderInt( "Menu Alpha" , Settings::Menu::MenuAlpha , 100 , 255 );
@@ -11,6 +11,8 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include <AndromedaClient/Features/CInventoryChanger/CInventoryItemsManager.hpp>
namespace Settings namespace Settings
{ {
namespace Visual namespace Visual
@@ -238,6 +240,8 @@ namespace Settings
namespace Config namespace Config
{ {
inline std::string FileName = "default.mh"; inline std::string FileName = "default.mh";
inline auto AutoLoadOnInject = false;
inline std::string AutoLoadFile = "default.mh";
inline auto GetDirectory() -> std::string inline auto GetDirectory() -> std::string
{ {
@@ -292,12 +296,12 @@ namespace Settings
inline auto ParseInt( const std::string& szValue ) -> int inline auto ParseInt( const std::string& szValue ) -> int
{ {
return std::stoi( szValue ); try { return std::stoi( szValue ); } catch ( ... ) { return 0; }
} }
inline auto ParseFloat( const std::string& szValue ) -> float inline auto ParseFloat( const std::string& szValue ) -> float
{ {
return std::stof( szValue ); try { return std::stof( szValue ); } catch ( ... ) { return 0.f; }
} }
inline auto ParseColor( const std::string& szValue ) -> ImVec4 inline auto ParseColor( const std::string& szValue ) -> ImVec4
@@ -389,6 +393,13 @@ namespace Settings
MH_SEC( SafeMode ) MH_SEC( SafeMode )
MH_WB( SafeMode , Active ) MH_WB( SafeMode , DrawIndicator ) MH_WB( SafeMode , Active ) MH_WB( SafeMode , DrawIndicator )
MH_SEC( Skins )
for ( const auto& [ defIdx , paintKit ] : GetInventoryItemsManager()->GetWeaponSkinSelections() )
File << "weapon_" << static_cast<int>( defIdx ) << "=" << paintKit << "\n";
File << "music=" << GetInventoryItemsManager()->GetMusicSelection() << "\n";
MH_SEC( Colors::Visual ) MH_SEC( Colors::Visual )
MH_WC( Colors::Visual , PlayerBoxTT ) MH_WC( Colors::Visual , PlayerBoxTT_Visible ) MH_WC( Colors::Visual , PlayerBoxTT ) MH_WC( Colors::Visual , PlayerBoxTT_Visible )
MH_WC( Colors::Visual , PlayerBoxCT ) MH_WC( Colors::Visual , PlayerBoxCT_Visible ) MH_WC( Colors::Visual , PlayerBoxCT ) MH_WC( Colors::Visual , PlayerBoxCT_Visible )
@@ -510,6 +521,30 @@ namespace Settings
MH_LC( Colors::Visual , GlowTT ) MH_LC( Colors::Visual , GlowTT_Visible ) MH_LC( Colors::Visual , GlowTT ) MH_LC( Colors::Visual , GlowTT_Visible )
MH_LC( Colors::Visual , GlowCT ) MH_LC( Colors::Visual , GlowCT_Visible ) MH_LC( Colors::Visual , GlowCT ) MH_LC( Colors::Visual , GlowCT_Visible )
{
auto* pMgr = GetInventoryItemsManager();
auto& Selections = pMgr->GetWeaponSkinSelections();
Selections.clear();
const std::string szPrefix = "Skins.weapon_";
for ( const auto& [ key , value ] : mValues )
{
if ( key.rfind( szPrefix , 0 ) == 0 )
{
const int defIdx = ConfigIO::ParseInt( key.substr( szPrefix.size() ) );
if ( defIdx >= 0 && defIdx <= 0xFFFF )
Selections[ static_cast<uint16_t>( defIdx ) ] = ConfigIO::ParseInt( value );
}
else if ( key == "Skins.music" )
{
pMgr->GetMusicSelection() = ConfigIO::ParseInt( value );
}
}
}
#undef MH_LB #undef MH_LB
#undef MH_LI #undef MH_LI
#undef MH_LF #undef MH_LF