aboutsummaryrefslogtreecommitdiff
path: root/NorthstarDedicatedTest/playlist.cpp
diff options
context:
space:
mode:
authorp0358 <p0358@users.noreply.github.com>2021-12-30 03:43:12 +0100
committerp0358 <p0358@users.noreply.github.com>2021-12-30 03:43:12 +0100
commit893a78932c201978c329e2806869524c1d5f8456 (patch)
tree0e3d5276bfe61132550155d2f2dc1bcf7b0970dd /NorthstarDedicatedTest/playlist.cpp
parent572f4eab6c9fd1098d1945668bfa783bd90aa8d9 (diff)
parent2770beb6af1a3bcf4d303f9a10ebaaefd15f01ce (diff)
downloadNorthstarLauncher-893a78932c201978c329e2806869524c1d5f8456.tar.gz
NorthstarLauncher-893a78932c201978c329e2806869524c1d5f8456.zip
Merge upstream
Diffstat (limited to 'NorthstarDedicatedTest/playlist.cpp')
-rw-r--r--NorthstarDedicatedTest/playlist.cpp35
1 files changed, 33 insertions, 2 deletions
diff --git a/NorthstarDedicatedTest/playlist.cpp b/NorthstarDedicatedTest/playlist.cpp
index ef399347..01a2de6a 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;
@@ -27,7 +32,8 @@ void SetPlaylistVarOverrideCommand(const CCommand& args)
if (args.ArgC() < 3)
return;
- SetPlaylistVarOverride(args.Arg(1), args.Arg(2));
+ for (int i = 1; i < args.ArgC(); i += 2)
+ SetPlaylistVarOverride(args.Arg(i), args.Arg(i + 1));
}
char Onclc_SetPlaylistVarOverrideHook(void* a1, void* a2)
@@ -48,10 +54,33 @@ void SetPlaylistVarOverrideHook(const char* varName, const char* value)
SetPlaylistVarOverrideOriginal(varName, value);
}
+char* GetCurrentPlaylistVarHook(const char* varName, bool useOverrides)
+{
+ if (!useOverrides && CommandLine()->CheckParm("-maxplayersplaylist") && !strcmp(varName, "max_players"))
+ useOverrides = true;
+
+ return GetCurrentPlaylistVarOriginal(varName, useOverrides);
+}
+
+int GetCurrentGamemodeMaxPlayersHook()
+{
+ if (!CommandLine()->CheckParm("-maxplayersplaylist"))
+ return GetCurrentGamemodeMaxPlayers();
+
+ 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);
- RegisterConCommand("setplaylistvaroverride", SetPlaylistVarOverrideCommand, "sets a playlist var override", FCVAR_NONE);
+ RegisterConCommand("setplaylistvaroverrides", SetPlaylistVarOverrideCommand, "sets a playlist var override", FCVAR_NONE);
// note: clc_SetPlaylistVarOverride is pretty insecure, since it allows for entirely arbitrary playlist var overrides to be sent to the server
// this is somewhat restricted on custom servers to prevent it being done outside of private matches, but ideally it should be disabled altogether, since the custom menus won't use it anyway
// this should only really be accepted if you want vanilla client compatibility
@@ -60,6 +89,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