set variant wrapper

This commit is contained in:
Diavolo 2021-10-03 22:23:26 +02:00 committed by FutureRave
parent 3cbe6e820c
commit 7e92887ad9
No known key found for this signature in database
GPG Key ID: E883E2BC9657D955
5 changed files with 61 additions and 0 deletions

View File

@ -3,6 +3,7 @@
namespace Components
{
Utils::Signal<Scheduler::Callback> Dvar::RegistrationSignal;
std::vector<std::string> Dvar::ChangedDvars;
Dvar::Var::Var(const std::string& dvarName) : Var()
{
@ -258,9 +259,21 @@ namespace Components
Game::dvar_t* Dvar::SetFromStringByNameExternal(const char* dvar, const char* value)
{
Dvar::ChangedDvars.push_back(dvar);
return Game::Dvar_SetFromStringByNameFromSource(dvar, value, Game::DvarSetSource::DVAR_SOURCE_EXTERNAL);
}
void Dvar::ResetDvarsValue()
{
for (auto it = Dvar::ChangedDvars.begin(); it != Dvar::ChangedDvars.end(); ++it)
{
auto var = Dvar::Var(*it).get<Game::dvar_t*>();
Game::Dvar_SetVariant(var, var->reset, Game::DVAR_SOURCE_INTERNAL);
it = Dvar::ChangedDvars.erase(it);
--it; // Go back one step because of erase
}
}
Dvar::Dvar()
{
// set flags of cg_drawFPS to archive
@ -333,5 +346,6 @@ namespace Components
Dvar::~Dvar()
{
Dvar::RegistrationSignal.clear();
Dvar::ChangedDvars.clear();
}
}

View File

@ -50,6 +50,8 @@ namespace Components
template<typename T> static Var Register(const char* name, T value, Flag flag, const char* description);
template<typename T> static Var Register(const char* name, T value, T min, T max, Flag flag, const char* description);
static void ResetDvarsValue();
private:
static Utils::Signal<Scheduler::Callback> RegistrationSignal;
@ -57,5 +59,7 @@ namespace Components
static Game::dvar_t* SetFromStringByNameExternal(const char* dvar, const char* value);
static Game::dvar_t* SetFromStringByNameSafeExternal(const char* dvar, const char* value);
static std::vector<std::string> ChangedDvars;
};
}

View File

@ -458,7 +458,10 @@ namespace Components
__asm
{
pushad
call Friends::ClearServer
call Dvar::ResetDvarsValue
popad
push 467CC0h

View File

@ -122,6 +122,7 @@ namespace Game
Field_Clear_t Field_Clear = Field_Clear_t(0x437EB0);
FreeMemory_t FreeMemory = FreeMemory_t(0x4D6640);
Free_String_t Free_String = Free_String_t(0x470E80);
FS_FileExists_t FS_FileExists = FS_FileExists_t(0x4DEFA0);
FS_FreeFile_t FS_FreeFile = FS_FreeFile_t(0x4416B0);
@ -1492,5 +1493,39 @@ namespace Game
}
}
__declspec(naked) void Dvar_SetVariant(dvar_t*, DvarValue, DvarSetSource)
{
__asm
{
pushad
mov ecx, [esp + 20h + 20h]
mov edx, [esp + 24h + 20h] // source
push edx
mov edx, [esp + 8h + 20h] // dvar pointer
sub esp, 10h // What does this mean for the offsets ? Copy paste
mov eax, esp
mov [eax], ecx // DvarValue ?? Legit have no clue
mov ecx, [esp + 0Ch+ 20h]
mov [eax + 4], edx // First arg is dvar pointer
mov edx, [esp + 10h + 20h]
mov [eax + 8], ecx
mov [eax + 0Ch], edx
mov eax, [esp + 8h + 20h] // var pointer
mov ebx, 0x647400
call ebx
add esp, 14h
popad
retn
}
}
#pragma optimize("", on)
}

View File

@ -298,6 +298,9 @@ namespace Game
typedef void(__cdecl * FreeMemory_t)(void* buffer);
extern FreeMemory_t FreeMemory;
typedef void (__cdecl * Free_String_t)(const char* string);
extern Free_String_t Free_String;
typedef void(__cdecl * FS_FreeFile_t)(void* buffer);
extern FS_FreeFile_t FS_FreeFile;
@ -1074,4 +1077,6 @@ namespace Game
void AimAssist_UpdateTweakables(int localClientNum);
void AimAssist_UpdateAdsLerp(const AimInput* input);
void Dvar_SetVariant(dvar_t* var, DvarValue value, DvarSetSource source);
}