1#include <CS2Kit/Sdk/ConVarService.hpp>
2#include <CS2Kit/Sdk/GameInterfaces.hpp>
3#include <CS2Kit/Utils/Log.hpp>
5#include <tier1/convar.h>
10void GlobalConVarChangeCallback(ConVarRefAbstract* ref, CSplitScreenSlot ,
const char* newValue,
11 const char* oldValue,
void* )
16 const char* name = ref->GetName();
17 CS2Kit::Sdk::ConVarService::Instance().DispatchChange(name, oldValue, newValue);
26bool ConVarService::Initialize()
28 if (!GameInterfaces::Instance().CVar)
30 Log::Error(
"ConVarService: ICvar not available.");
34 Log::Info(
"ConVar service initialized.");
38std::optional<int> ConVarService::GetInt(
const char* name)
const
40 ConVarRefAbstract ref(name);
41 if (!ref.IsValidRef() || !ref.IsConVarDataAvailable())
47std::optional<float> ConVarService::GetFloat(
const char* name)
const
49 ConVarRefAbstract ref(name);
50 if (!ref.IsValidRef() || !ref.IsConVarDataAvailable())
53 return ref.GetFloat();
56std::optional<std::string> ConVarService::GetString(
const char* name)
const
58 ConVarRefAbstract ref(name);
59 if (!ref.IsValidRef() || !ref.IsConVarDataAvailable())
62 CUtlString str = ref.GetString();
63 return std::string(str.Get());
66std::optional<bool> ConVarService::GetBool(
const char* name)
const
68 ConVarRefAbstract ref(name);
69 if (!ref.IsValidRef() || !ref.IsConVarDataAvailable())
75bool ConVarService::Exists(
const char* name)
const
77 ConVarRefAbstract ref(name);
78 return ref.IsValidRef() && ref.IsConVarDataAvailable();
81bool ConVarService::SetInt(
const char* name,
int value)
83 ConVarRefAbstract ref(name);
84 if (!ref.IsValidRef() || !ref.IsConVarDataAvailable())
91bool ConVarService::SetFloat(
const char* name,
float value)
93 ConVarRefAbstract ref(name);
94 if (!ref.IsValidRef() || !ref.IsConVarDataAvailable())
101bool ConVarService::SetString(
const char* name,
const char* value)
103 ConVarRefAbstract ref(name);
104 if (!ref.IsValidRef() || !ref.IsConVarDataAvailable())
107 ref.SetString(CUtlString(value));
111void ConVarService::ExecuteServerCommand(
const char* command)
113 auto* engine = GameInterfaces::Instance().Engine;
116 Log::Warn(
"ConVarService::ExecuteServerCommand: IVEngineServer2 not available.");
120 engine->ServerCommand(command);
123uint64_t ConVarService::OnChange(ChangeCallback callback)
125 if (!_globalCallbackInstalled)
127 auto* cvar = GameInterfaces::Instance().CVar;
130 cvar->InstallGlobalChangeCallback(&GlobalConVarChangeCallback);
131 _globalCallbackInstalled =
true;
135 uint64_t
id = _nextCallbackId++;
136 _changeCallbacks[id] = std::move(callback);
140void ConVarService::RemoveChangeListener(uint64_t
id)
142 _changeCallbacks.erase(
id);
145void ConVarService::DispatchChange(
const char* name,
const char* oldValue,
const char* newValue)
147 for (
auto& [
id, callback] : _changeCallbacks)
149 callback(name, oldValue, newValue);