From 1e40ff034b59ae0bb4db81897dfc63cb9286a70c Mon Sep 17 00:00:00 2001 From: AvarianKnight Date: Sat, 24 Jun 2023 13:45:12 -0500 Subject: [PATCH] fix(convar): add ConVar_Internal and mark `sv_icon` and `version` as internal --- .../citicore/console/Console.Variables.h | 24 +++++++++++++++++-- .../src/InfoHttpHandler.cpp | 4 ++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/code/client/citicore/console/Console.Variables.h b/code/client/citicore/console/Console.Variables.h index c293f42086..05ce1eb556 100644 --- a/code/client/citicore/console/Console.Variables.h +++ b/code/client/citicore/console/Console.Variables.h @@ -70,6 +70,9 @@ enum ConsoleVariableFlags // can't be 'setr'd from server->client ConVar_UserPref = 0x20, + + // blocks any modifications to the convar via set(s|a|r) commands + ConVar_Internal = 0x40, }; inline std::string ConsoleFlagsToString(ConsoleVariableFlags flags) @@ -87,6 +90,8 @@ inline std::string ConsoleFlagsToString(ConsoleVariableFlags flags) value += "Replicated "; if (flags & ConVar_ReadOnly) value += "ReadOnly "; + if (flags & ConVar_Internal) + value += "Internal "; return value; } @@ -212,7 +217,14 @@ class ConsoleVariableEntry : public ConsoleVariableEntryBase m_setCommand = std::make_unique(manager->GetParentContext(), name, [=] (const T& newValue) { - if (m_manager->GetEntryFlags(m_name) & ConVar_ReadOnly) + auto convarFlags = m_manager->GetEntryFlags(m_name); + if (convarFlags & ConVar_Internal) + { + console::PrintWarning("cmd", "'%s' is an internal ConVar and cannot be changed.\n", m_name); + return; + } + + if (convarFlags & ConVar_ReadOnly) { if (!m_manager->ShouldSuppressReadOnlyWarning() || !(typename ConsoleArgumentTraits::Equal()(GetRawValue(), m_curValue))) { @@ -265,7 +277,15 @@ class ConsoleVariableEntry : public ConsoleVariableEntryBase virtual bool SetValue(const std::string& value) override { - if (m_manager->GetEntryFlags(m_name) & ConVar_ReadOnly) + auto convarFlags = m_manager->GetEntryFlags(m_name); + if (convarFlags & ConVar_Internal) + { + console::PrintWarning("cmd", "'%s' is an internal ConVar and cannot be changed.\n", m_name); + + return false; + } + + if (convarFlags & ConVar_ReadOnly) { if (!m_manager->ShouldSuppressReadOnlyWarning()) { diff --git a/code/components/citizen-server-impl/src/InfoHttpHandler.cpp b/code/components/citizen-server-impl/src/InfoHttpHandler.cpp index 2461f8ea1a..d6e4e41f77 100644 --- a/code/components/citizen-server-impl/src/InfoHttpHandler.cpp +++ b/code/components/citizen-server-impl/src/InfoHttpHandler.cpp @@ -158,8 +158,8 @@ void InfoHttpHandlerComponentLocals::AttachToObject(fx::ServerInstanceBase* inst m_instance = instance; ivVar = instance->AddVariable("sv_infoVersion", ConVar_ServerInfo, 0); maxClientsVar = instance->AddVariable("sv_maxClients", ConVar_ServerInfo, 30); - iconVar = instance->AddVariable("sv_icon", ConVar_None, ""); - versionVar = instance->AddVariable("version", ConVar_None, "FXServer-" GIT_DESCRIPTION); + iconVar = instance->AddVariable("sv_icon", ConVar_Internal, ""); + versionVar = instance->AddVariable("version", ConVar_Internal, "FXServer-" GIT_DESCRIPTION); crashCmd = instance->AddCommand("_crash", []() { *(volatile int*)0 = 0;