Using new asm wrapper made by laupetin

This commit is contained in:
FutureRave 2021-10-04 21:03:56 +01:00
parent 133d1b43d8
commit d948024895
No known key found for this signature in database
GPG Key ID: E883E2BC9657D955
4 changed files with 40 additions and 32 deletions

View File

@ -190,6 +190,25 @@ namespace Components
Dvar::RegistrationSignal.connect(callback); Dvar::RegistrationSignal.connect(callback);
} }
void Dvar::DvarReset(Game::dvar_t* var, Game::DvarSetSource source)
{
assert(var != nullptr);
Game::Dvar_SetVariant(var, var->reset, source);
}
void Dvar::ResetDvarsValue()
{
auto it = Dvar::ChangedDvars.begin();
while (it != Dvar::ChangedDvars.end())
{
auto var = Dvar::Var(*it).get<Game::dvar_t*>();
assert(var != nullptr);
Dvar::DvarReset(var, Game::DVAR_SOURCE_INTERNAL);
it = Dvar::ChangedDvars.erase(it);
}
}
Game::dvar_t* Dvar::RegisterName(const char* name, const char* /*default*/, Game::dvar_flag flag, const char* description) Game::dvar_t* Dvar::RegisterName(const char* name, const char* /*default*/, Game::dvar_flag flag, const char* description)
{ {
// Run callbacks // Run callbacks
@ -259,26 +278,13 @@ namespace Components
Game::dvar_t* Dvar::SetFromStringByNameExternal(const char* dvar, const char* value) 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); return Game::Dvar_SetFromStringByNameFromSource(dvar, value, Game::DvarSetSource::DVAR_SOURCE_EXTERNAL);
} }
void Dvar::Dvar_Reset(Game::dvar_t* var, Game::DvarSetSource source) void Dvar::DvarSetFromStringByNameStub(const char* var, const char* value)
{ {
assert(var != nullptr); Dvar::ChangedDvars.push_back(var);
OutputDebugStringA(Utils::String::VA("Dvar pointer: %p\n")); Utils::Hook::Call<void(const char*, const char*)>(0x4F52E0)(var, value);
Game::Dvar_SetVariant(var, var->reset, source);
}
void Dvar::ResetDvarsValue()
{
auto it = Dvar::ChangedDvars.begin();
while (it != Dvar::ChangedDvars.end())
{
auto var = Dvar::Var(*it).get<Game::dvar_t*>();
Dvar::Dvar_Reset(var, Game::DVAR_SOURCE_INTERNAL);
it = Dvar::ChangedDvars.erase(it);
}
} }
Dvar::Dvar() Dvar::Dvar()
@ -348,6 +354,9 @@ namespace Components
// Entirely block setting cheat dvars internally without sv_cheats // Entirely block setting cheat dvars internally without sv_cheats
//Utils::Hook(0x4F52EC, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); //Utils::Hook(0x4F52EC, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick();
// Hook Dvar_SetFromStringByName inside CG_SetClientDvarFromServer so we can reset dvars when the player leaves the server
Utils::Hook(0x59386A, Dvar::DvarSetFromStringByNameStub, HOOK_CALL).install()->quick();
} }
Dvar::~Dvar() Dvar::~Dvar()

View File

@ -50,17 +50,18 @@ 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, 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); template<typename T> static Var Register(const char* name, T value, T min, T max, Flag flag, const char* description);
static void Dvar_Reset(Game::dvar_t* var, Game::DvarSetSource source); static void DvarReset(Game::dvar_t* var, Game::DvarSetSource source);
static void ResetDvarsValue(); static void ResetDvarsValue();
private: private:
static Utils::Signal<Scheduler::Callback> RegistrationSignal; static Utils::Signal<Scheduler::Callback> RegistrationSignal;
static std::vector<std::string> ChangedDvars;
static Game::dvar_t* RegisterName(const char* name, const char* defaultVal, Game::dvar_flag flag, const char* description); static Game::dvar_t* RegisterName(const char* name, const char* defaultVal, Game::dvar_flag flag, const char* description);
static Game::dvar_t* SetFromStringByNameExternal(const char* dvar, const char* value); static Game::dvar_t* SetFromStringByNameExternal(const char* dvar, const char* value);
static Game::dvar_t* SetFromStringByNameSafeExternal(const char* dvar, const char* value); static Game::dvar_t* SetFromStringByNameSafeExternal(const char* dvar, const char* value);
static std::vector<std::string> ChangedDvars; static void DvarSetFromStringByNameStub(const char* var, const char* value);
}; };
} }

View File

@ -1055,22 +1055,20 @@ namespace Game
{ {
__asm __asm
{ {
push eax
pushad pushad
mov edi, [esp + 2Ch] // name mov eax, [esp + 0x4 + 0x20] // dvar
push edi push[esp + 0x18 + 0x20] // source
push[esp + 0x18 + 0x20] // value
push[esp + 0x18 + 0x20] // value
push[esp + 0x18 + 0x20] // value
push[esp + 0x18 + 0x20] // value
mov edi, [esp + 2Ch] // type mov ebx, 0x647400
call ebx
add esp, 0x14
mov eax, 5BB1B0h
call eax
add esp, 4h
mov [esp + 20h], eax
popad popad
pop eax
retn retn
} }
@ -1493,7 +1491,7 @@ namespace Game
} }
} }
__declspec(naked) void Dvar_SetVariant(dvar_t*, DvarValue, int) __declspec(naked) void Dvar_SetVariant(dvar_t*, DvarValue, DvarSetSource)
{ {
__asm __asm
{ {

View File

@ -1078,5 +1078,5 @@ namespace Game
void AimAssist_UpdateTweakables(int localClientNum); void AimAssist_UpdateTweakables(int localClientNum);
void AimAssist_UpdateAdsLerp(const AimInput* input); void AimAssist_UpdateAdsLerp(const AimInput* input);
void Dvar_SetVariant(dvar_t* var, DvarValue value, int source); void Dvar_SetVariant(dvar_t* var, DvarValue value, DvarSetSource source);
} }