aboutsummaryrefslogtreecommitdiff
path: root/NorthstarDedicatedTest/playlist.cpp
diff options
context:
space:
mode:
authorBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-12-27 04:13:35 +0000
committerBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2021-12-27 04:13:35 +0000
commitc27bf9979b7524672e5315fe04d05cc93f6ee6af (patch)
tree8bc4b3235cc230686b88b535bd6ae1f9469da8cc /NorthstarDedicatedTest/playlist.cpp
parent85c614c30d5f0608264aa42ffd9f11ede49dda6c (diff)
downloadNorthstarLauncher-c27bf9979b7524672e5315fe04d05cc93f6ee6af.tar.gz
NorthstarLauncher-c27bf9979b7524672e5315fe04d05cc93f6ee6af.zip
control server max players in playlist
Diffstat (limited to 'NorthstarDedicatedTest/playlist.cpp')
-rw-r--r--NorthstarDedicatedTest/playlist.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/NorthstarDedicatedTest/playlist.cpp b/NorthstarDedicatedTest/playlist.cpp
index fa7139d2..47fb109c 100644
--- a/NorthstarDedicatedTest/playlist.cpp
+++ b/NorthstarDedicatedTest/playlist.cpp
@@ -9,8 +9,13 @@
typedef char(*Onclc_SetPlaylistVarOverrideType)(void* a1, void* a2);
Onclc_SetPlaylistVarOverrideType Onclc_SetPlaylistVarOverride;
+
+typedef int(*GetCurrentGamemodeMaxPlayersType)();
+GetCurrentGamemodeMaxPlayersType GetCurrentGamemodeMaxPlayers;
+
// function type defined in gameutils.h
SetPlaylistVarOverrideType SetPlaylistVarOverrideOriginal;
+GetCurrentPlaylistVarType GetCurrentPlaylistVarOriginal;
ConVar* Cvar_ns_use_clc_SetPlaylistVarOverride;
@@ -49,6 +54,26 @@ void SetPlaylistVarOverrideHook(const char* varName, const char* value)
SetPlaylistVarOverrideOriginal(varName, value);
}
+char* GetCurrentPlaylistVarHook(const char* varName, bool useOverrides)
+{
+ if (!useOverrides && !strcmp(varName, "max_players"))
+ useOverrides = true;
+
+ return GetCurrentPlaylistVarOriginal(varName, useOverrides);
+}
+
+int GetCurrentGamemodeMaxPlayersHook()
+{
+ char* maxPlayersStr = GetCurrentPlaylistVar("max_players", 0);
+ if (!maxPlayersStr)
+ return GetCurrentGamemodeMaxPlayers();
+
+ int maxPlayers = atoi(maxPlayersStr);
+ spdlog::info("Overwrote max_players to {}", maxPlayers);
+
+ return maxPlayers;
+}
+
void InitialisePlaylistHooks(HMODULE baseAddress)
{
RegisterConCommand("setplaylist", SetPlaylistCommand, "Sets the current playlist", FCVAR_NONE);
@@ -61,6 +86,8 @@ void InitialisePlaylistHooks(HMODULE baseAddress)
HookEnabler hook;
ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0x222180, &Onclc_SetPlaylistVarOverrideHook, reinterpret_cast<LPVOID*>(&Onclc_SetPlaylistVarOverride));
ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0x18ED00, &SetPlaylistVarOverrideHook, reinterpret_cast<LPVOID*>(&SetPlaylistVarOverrideOriginal));
+ ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0x18C680, &GetCurrentPlaylistVarHook, reinterpret_cast<LPVOID*>(&GetCurrentPlaylistVarOriginal));
+ ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0x18C430, &GetCurrentGamemodeMaxPlayersHook, reinterpret_cast<LPVOID*>(&GetCurrentGamemodeMaxPlayers));
// patch to prevent clc_SetPlaylistVarOverride from being able to crash servers if we reach max overrides due to a call to Error (why is this possible respawn, wtf)
// todo: add a warning for this