From 4bf3def2ac5719fdba37bd0f0d3383f67abe6516 Mon Sep 17 00:00:00 2001 From: BobTheBob <32057864+BobTheBob9@users.noreply.github.com> Date: Sun, 26 Dec 2021 02:29:27 +0000 Subject: add setplaylistvaroverride command for setting overrides on dedi from commandline --- NorthstarDedicatedTest/playlist.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'NorthstarDedicatedTest/playlist.cpp') diff --git a/NorthstarDedicatedTest/playlist.cpp b/NorthstarDedicatedTest/playlist.cpp index b853a40a..ef399347 100644 --- a/NorthstarDedicatedTest/playlist.cpp +++ b/NorthstarDedicatedTest/playlist.cpp @@ -5,6 +5,7 @@ #include "gameutils.h" #include "hookutils.h" #include "dedicated.h" +#include "squirrel.h" typedef char(*Onclc_SetPlaylistVarOverrideType)(void* a1, void* a2); Onclc_SetPlaylistVarOverrideType Onclc_SetPlaylistVarOverride; @@ -21,6 +22,14 @@ void SetPlaylistCommand(const CCommand& args) SetCurrentPlaylist(args.Arg(1)); } +void SetPlaylistVarOverrideCommand(const CCommand& args) +{ + if (args.ArgC() < 3) + return; + + SetPlaylistVarOverride(args.Arg(1), args.Arg(2)); +} + char Onclc_SetPlaylistVarOverrideHook(void* a1, void* a2) { // the private_match playlist is the only situation where there should be any legitimate sending of this netmessage @@ -42,6 +51,7 @@ void SetPlaylistVarOverrideHook(const char* varName, const char* value) void InitialisePlaylistHooks(HMODULE baseAddress) { RegisterConCommand("setplaylist", SetPlaylistCommand, "Sets the current playlist", FCVAR_NONE); + RegisterConCommand("setplaylistvaroverride", 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 @@ -58,4 +68,17 @@ void InitialisePlaylistHooks(HMODULE baseAddress) TempReadWrite rw(ptr); *((char*)ptr) = 0xC3; // jmp => ret } + + if (IsDedicated()) + { + // patch to allow setplaylistvaroverride to be called before map init on dedicated + void* ptr = (char*)baseAddress + 0x18ED17; + TempReadWrite rw(ptr); + *((char*)ptr) = (char)0x90; + *((char*)ptr + 1) = (char)0x90; + *((char*)ptr + 2) = (char)0x90; + *((char*)ptr + 3) = (char)0x90; + *((char*)ptr + 4) = (char)0x90; + *((char*)ptr + 5) = (char)0x90; + } } \ No newline at end of file -- cgit v1.2.3 From 85c614c30d5f0608264aa42ffd9f11ede49dda6c Mon Sep 17 00:00:00 2001 From: BobTheBob <32057864+BobTheBob9@users.noreply.github.com> Date: Mon, 27 Dec 2021 02:24:06 +0000 Subject: make setplaylistvaroverride support multiple overrides since commandline is weird --- NorthstarDedicatedTest/playlist.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'NorthstarDedicatedTest/playlist.cpp') diff --git a/NorthstarDedicatedTest/playlist.cpp b/NorthstarDedicatedTest/playlist.cpp index ef399347..fa7139d2 100644 --- a/NorthstarDedicatedTest/playlist.cpp +++ b/NorthstarDedicatedTest/playlist.cpp @@ -27,7 +27,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) @@ -51,7 +52,7 @@ void SetPlaylistVarOverrideHook(const char* varName, const char* value) 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 -- cgit v1.2.3 From c27bf9979b7524672e5315fe04d05cc93f6ee6af Mon Sep 17 00:00:00 2001 From: BobTheBob <32057864+BobTheBob9@users.noreply.github.com> Date: Mon, 27 Dec 2021 04:13:35 +0000 Subject: control server max players in playlist --- NorthstarDedicatedTest/playlist.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'NorthstarDedicatedTest/playlist.cpp') 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(&Onclc_SetPlaylistVarOverride)); ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0x18ED00, &SetPlaylistVarOverrideHook, reinterpret_cast(&SetPlaylistVarOverrideOriginal)); + ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0x18C680, &GetCurrentPlaylistVarHook, reinterpret_cast(&GetCurrentPlaylistVarOriginal)); + ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0x18C430, &GetCurrentGamemodeMaxPlayersHook, reinterpret_cast(&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 -- cgit v1.2.3