Это вообще так не работает и не должно, иначе любой мог бы просто в паблике sv_cheats юзать.
Либо патчи, либо конвар напрямую меняй. Бери VEngineCvar007 из tier0.dll, это класс ICvar.
#include "IAppSystem.h"
class ConCommandBase {
public:
virtual void DESTROY1() = 0;
virtual void DESTROY2() = 0;
virtual bool IsCommand(void) = 0;
virtual bool IsBoundedVar(void) = 0;
virtual bool IsFlagSet(long long) = 0;
virtual void AddFlags(long long) = 0;
virtual void RemoveFlags(long long) = 0;
virtual long long GetFlags(void) = 0;
virtual const char* GetName(void) = 0;
virtual const char* GetHelpText(void) = 0;
virtual bool IsRegistered(void) = 0;
virtual void* GetDLLIdentifier(void) = 0;
virtual void Create(char const*, char const*, long long) = 0;
virtual void Init(void) = 0;
virtual const char* GetBaseName(void) = 0;
virtual int GetSplitScreenPlayerSlot(void) = 0;
virtual void SetValue(char const*) = 0;
virtual void SetValue(float) = 0;
virtual void SetValue(int) = 0;
virtual void SetValue(ColorRGBA) = 0;
virtual float GetFloat(void) = 0;
virtual int GetInt(void) = 0;
virtual bool GetBool(void) = 0;
virtual void InternalSetValue(char const*) = 0;
virtual void InternalSetFloatValue(float) = 0;
virtual void InternalSetIntValue(int) = 0;
virtual void InternalSetColorValue(ColorRGBA) = 0;
virtual void ClampValue(float&) = 0;
virtual void ChangeStringValue(char const*, float) = 0;
virtual void Create() = 0;
};
class ICvar : public IAppSystem {
public:
virtual int AllocateDLLIdentifier(void) = 0;
virtual void RegisterConCommand(ConCommandBase*) = 0;
virtual void UnregisterConCommand(ConCommandBase*) = 0;
virtual void UnregisterConCommands(int) = 0;
virtual const char* GetCommandLineValue(char const*) = 0;
virtual ConCommandBase* FindCommandBase(char const*) = 0;
virtual const ConCommandBase* FindCommandBase2(char const*) = 0;
virtual ConVar* FindVar(char const*) = 0;
virtual const ConVar* FindVar2(char const*) = 0;
virtual void* FindCommand(char const*) = 0;
virtual const void* FindCommand2(char const*) = 0;
virtual void InstallGlobalChangeCallback() = 0;
virtual void RemoveGlobalChangeCallback() = 0;
virtual void CallGlobalChangeCallbacks(ConVar*, char const*, float) = 0;
virtual void RevertFlaggedConVars(long long) = 0;
virtual void InstallCVarQuery(void* ICvarQuery) = 0;
virtual void SetMaxSplitScreenSlots(int) = 0;
virtual int GetMaxSplitScreenSlots(void) = 0;
virtual void AddSplitScreenConVars(void) = 0;
virtual void RemoveSplitScreenConVars(int) = 0;
virtual void FactoryInternalIterator(void) = 0;
virtual void InstallConVarListener(void* IConVarListener) = 0;
virtual void RemoveConVarListener(void* IConVarListener) = 0;
virtual void GetConVarDetails() = 0;
virtual void ResetConVarsToDefaultValues(char const*) = 0;
virtual void TakeConVarSnapshot(void) = 0;
virtual void ResetConVarsToSnapshot(void* ConVarSnapshot_t__) = 0;
virtual void DestroyConVarSnapshot(void* ConVarSnapshot_t__) = 0;
virtual bool IsValid(void) = 0;
virtual void* GetSomething(void) = 0;
};
После инжекта находи нужные конвары, потом когда в катку заходишь -- меняй значения.
Таким же образом камеру-хуямеру, партикли, че хочешь, короче.
ConCommandBase* sv_cheats = vmt.cvar->FindCommandBase("sv_cheats"); // Находим
sv_cheats->SetValue(1); // Меняем
Хотя партикли, конечно, прикольней через хук SetRenderingEnabled рисовать.
typedef void(*SetRenderingEnabledFn)(CParticleCollection*, bool);
SetRenderingEnabledFn oSetRenderingEnabled;
void hkSetRenderingEnabled(CParticleCollection* thisptr, bool state) {
oSetRenderingEnabled(thisptr, true);
}