From d082bdc9b3ea7007345bdef1121e986bdb4879ef Mon Sep 17 00:00:00 2001
From: BobTheBob <32057864+BobTheBob9@users.noreply.github.com>
Date: Sun, 20 Nov 2022 23:59:56 +0000
Subject: Add support for querying player userinfo cvars in script (#293)
* add support for querying player userinfo cvars in script
* bring up to date with main
* add more native methods for getting userinfo kvs of different types
* update to main and use new sqfunc macros
* Revert "update to main and use new sqfunc macros"
This reverts commit 2eacc00fcb99683731d1df3fc18e0359c5623ca1.
* use new macros for adding sq func
* improve formatting
---
NorthstarDLL/NorthstarDLL.vcxproj | 1 +
NorthstarDLL/NorthstarDLL.vcxproj.filters | 3 +
NorthstarDLL/scriptuserinfo.cpp | 105 ++++++++++++++++++++++++++++++
3 files changed, 109 insertions(+)
create mode 100644 NorthstarDLL/scriptuserinfo.cpp
diff --git a/NorthstarDLL/NorthstarDLL.vcxproj b/NorthstarDLL/NorthstarDLL.vcxproj
index 98e3e182..57ffb9ad 100644
--- a/NorthstarDLL/NorthstarDLL.vcxproj
+++ b/NorthstarDLL/NorthstarDLL.vcxproj
@@ -630,6 +630,7 @@
+
diff --git a/NorthstarDLL/NorthstarDLL.vcxproj.filters b/NorthstarDLL/NorthstarDLL.vcxproj.filters
index 7e13234e..164d80b8 100644
--- a/NorthstarDLL/NorthstarDLL.vcxproj.filters
+++ b/NorthstarDLL/NorthstarDLL.vcxproj.filters
@@ -1721,6 +1721,9 @@
Source Files
+
+ Source Files\Server\Scripted
+
Source Files\Math
diff --git a/NorthstarDLL/scriptuserinfo.cpp b/NorthstarDLL/scriptuserinfo.cpp
new file mode 100644
index 00000000..415ae3ea
--- /dev/null
+++ b/NorthstarDLL/scriptuserinfo.cpp
@@ -0,0 +1,105 @@
+#include "pch.h"
+#include "squirrel.h"
+#include "r2engine.h"
+#include "r2server.h"
+
+// clang-format off
+ADD_SQFUNC("string", GetUserInfoKVString_Internal, "entity player, string key, string defaultValue = \"\"",
+ "Gets the string value of a given player's userinfo convar by name", ScriptContext::SERVER)
+// clang-format on
+{
+ const R2::CBasePlayer* pPlayer = g_pSquirrel->getentity(sqvm, 1);
+ if (!pPlayer)
+ {
+ g_pSquirrel->raiseerror(sqvm, "player is null");
+ return SQRESULT_ERROR;
+ }
+
+ const char* pKey = g_pSquirrel->getstring(sqvm, 2);
+ const char* pDefaultValue = g_pSquirrel->getstring(sqvm, 3);
+
+ const char* pResult = R2::g_pClientArray[pPlayer->m_nPlayerIndex - 1].m_ConVars->GetString(pKey, pDefaultValue);
+ g_pSquirrel->pushstring(sqvm, pResult);
+ return SQRESULT_NOTNULL;
+}
+
+// clang-format off
+ADD_SQFUNC("asset", GetUserInfoKVAsset_Internal, "entity player, string key, asset defaultValue = $\"\"",
+ "Gets the asset value of a given player's userinfo convar by name", ScriptContext::SERVER)
+// clang-format on
+{
+ const R2::CBasePlayer* pPlayer = g_pSquirrel->getentity(sqvm, 1);
+ if (!pPlayer)
+ {
+ g_pSquirrel->raiseerror(sqvm, "player is null");
+ return SQRESULT_ERROR;
+ }
+
+ const char* pKey = g_pSquirrel->getstring(sqvm, 2);
+ const char* pDefaultValue;
+ g_pSquirrel->getasset(sqvm, 3, &pDefaultValue);
+
+ const char* pResult = R2::g_pClientArray[pPlayer->m_nPlayerIndex - 1].m_ConVars->GetString(pKey, pDefaultValue);
+ g_pSquirrel->pushasset(sqvm, pResult);
+ return SQRESULT_NOTNULL;
+}
+
+// clang-format off
+ADD_SQFUNC("int", GetUserInfoKVInt_Internal, "entity player, string key, int defaultValue = 0",
+ "Gets the int value of a given player's userinfo convar by name", ScriptContext::SERVER)
+// clang-format on
+{
+ const R2::CBasePlayer* pPlayer = g_pSquirrel->getentity(sqvm, 1);
+ if (!pPlayer)
+ {
+ g_pSquirrel->raiseerror(sqvm, "player is null");
+ return SQRESULT_ERROR;
+ }
+
+ const char* pKey = g_pSquirrel->getstring(sqvm, 2);
+ const int iDefaultValue = g_pSquirrel->getinteger(sqvm, 3);
+
+ const int iResult = R2::g_pClientArray[pPlayer->m_nPlayerIndex - 1].m_ConVars->GetInt(pKey, iDefaultValue);
+ g_pSquirrel->pushinteger(sqvm, iResult);
+ return SQRESULT_NOTNULL;
+}
+
+// clang-format off
+ADD_SQFUNC("float", GetUserInfoKVFloat_Internal, "entity player, string key, float defaultValue = 0",
+ "Gets the float value of a given player's userinfo convar by name", ScriptContext::SERVER)
+// clang-format on
+{
+ const R2::CBasePlayer* pPlayer = g_pSquirrel->getentity(sqvm, 1);
+ if (!pPlayer)
+ {
+ g_pSquirrel->raiseerror(sqvm, "player is null");
+ return SQRESULT_ERROR;
+ }
+
+ const char* pKey = g_pSquirrel->getstring(sqvm, 2);
+ const float flDefaultValue = g_pSquirrel->getfloat(sqvm, 3);
+
+ const float flResult = R2::g_pClientArray[pPlayer->m_nPlayerIndex - 1].m_ConVars->GetFloat(pKey, flDefaultValue);
+ g_pSquirrel->pushfloat(sqvm, flResult);
+ return SQRESULT_NOTNULL;
+}
+
+// clang-format off
+ADD_SQFUNC("bool", GetUserInfoKVBool_Internal, "entity player, string key, bool defaultValue = false",
+ "Gets the bool value of a given player's userinfo convar by name", ScriptContext::SERVER)
+// clang-format on
+{
+ const R2::CBasePlayer* pPlayer = g_pSquirrel->getentity(sqvm, 1);
+ if (!pPlayer)
+ {
+ g_pSquirrel->raiseerror(sqvm, "player is null");
+ return SQRESULT_ERROR;
+ }
+
+ const char* pKey = g_pSquirrel->getstring(sqvm, 2);
+ const bool bDefaultValue = g_pSquirrel->getbool(sqvm, 3);
+
+ const bool bResult = R2::g_pClientArray[pPlayer->m_nPlayerIndex - 1].m_ConVars->GetInt(pKey, bDefaultValue);
+ g_pSquirrel->pushbool(sqvm, bResult);
+ return SQRESULT_NOTNULL;
+}
--
cgit v1.2.3