diff options
author | BobTheBob <32057864+BobTheBob9@users.noreply.github.com> | 2021-12-27 04:13:35 +0000 |
---|---|---|
committer | BobTheBob <32057864+BobTheBob9@users.noreply.github.com> | 2021-12-27 04:13:35 +0000 |
commit | c27bf9979b7524672e5315fe04d05cc93f6ee6af (patch) | |
tree | 8bc4b3235cc230686b88b535bd6ae1f9469da8cc /NorthstarDedicatedTest/playlist.cpp | |
parent | 85c614c30d5f0608264aa42ffd9f11ede49dda6c (diff) | |
download | NorthstarLauncher-c27bf9979b7524672e5315fe04d05cc93f6ee6af.tar.gz NorthstarLauncher-c27bf9979b7524672e5315fe04d05cc93f6ee6af.zip |
control server max players in playlist
Diffstat (limited to 'NorthstarDedicatedTest/playlist.cpp')
-rw-r--r-- | NorthstarDedicatedTest/playlist.cpp | 27 |
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 |