aboutsummaryrefslogtreecommitdiff
path: root/NorthstarDedicatedTest/playlist.cpp
diff options
context:
space:
mode:
authorBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2022-05-09 18:28:27 +0100
committerBobTheBob <32057864+BobTheBob9@users.noreply.github.com>2022-05-09 18:28:27 +0100
commit7a2f17c9d13371e1beb62014f2ec0169124c9862 (patch)
tree3f12d8c25392fb461f0a3b03dc9cd510631c7400 /NorthstarDedicatedTest/playlist.cpp
parent5a58dd1c05e943d6b440bea5b4a6ae80ce16841e (diff)
downloadNorthstarLauncher-7a2f17c9d13371e1beb62014f2ec0169124c9862.tar.gz
NorthstarLauncher-7a2f17c9d13371e1beb62014f2ec0169124c9862.zip
move tier0 and playlist funcs to namespaces
Diffstat (limited to 'NorthstarDedicatedTest/playlist.cpp')
-rw-r--r--NorthstarDedicatedTest/playlist.cpp62
1 files changed, 37 insertions, 25 deletions
diff --git a/NorthstarDedicatedTest/playlist.cpp b/NorthstarDedicatedTest/playlist.cpp
index 59798510..477b3b0a 100644
--- a/NorthstarDedicatedTest/playlist.cpp
+++ b/NorthstarDedicatedTest/playlist.cpp
@@ -8,24 +8,21 @@
#include "hookutils.h"
#include "squirrel.h"
-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;
+// use the R2 namespace for game funcs
+namespace R2
+{
+ GetCurrentPlaylistNameType GetCurrentPlaylistName;
+ SetCurrentPlaylistType SetCurrentPlaylist;
+ SetPlaylistVarOverrideType SetPlaylistVarOverride;
+ GetCurrentPlaylistVarType GetCurrentPlaylistVar;
+} // namespace R2
void SetPlaylistCommand(const CCommand& args)
{
if (args.ArgC() < 2)
return;
- SetCurrentPlaylist(args.Arg(1));
+ R2::SetCurrentPlaylist(args.Arg(1));
}
void SetPlaylistVarOverrideCommand(const CCommand& args)
@@ -34,14 +31,18 @@ void SetPlaylistVarOverrideCommand(const CCommand& args)
return;
for (int i = 1; i < args.ArgC(); i += 2)
- SetPlaylistVarOverride(args.Arg(i), args.Arg(i + 1));
+ R2::SetPlaylistVarOverride(args.Arg(i), args.Arg(i + 1));
}
+ConVar* Cvar_ns_use_clc_SetPlaylistVarOverride;
+
+typedef char (*Onclc_SetPlaylistVarOverrideType)(void* a1, void* a2);
+Onclc_SetPlaylistVarOverrideType Onclc_SetPlaylistVarOverride;
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
// todo: check mp_lobby here too
- if (!Cvar_ns_use_clc_SetPlaylistVarOverride->GetBool() || strcmp(GetCurrentPlaylistName(), "private_match"))
+ if (!Cvar_ns_use_clc_SetPlaylistVarOverride->GetBool() || strcmp(R2::GetCurrentPlaylistName(), "private_match"))
return 1;
return Onclc_SetPlaylistVarOverride(a1, a2);
@@ -52,20 +53,22 @@ void SetPlaylistVarOverrideHook(const char* varName, const char* value)
if (strlen(value) >= 64)
return;
- SetPlaylistVarOverrideOriginal(varName, value);
+ R2::SetPlaylistVarOverride(varName, value);
}
-char* GetCurrentPlaylistVarHook(const char* varName, bool useOverrides)
+const char* GetCurrentPlaylistVarHook(const char* varName, bool useOverrides)
{
if (!useOverrides && !strcmp(varName, "max_players"))
useOverrides = true;
- return GetCurrentPlaylistVarOriginal(varName, useOverrides);
+ return R2::GetCurrentPlaylistVar(varName, useOverrides);
}
+typedef int (*GetCurrentGamemodeMaxPlayersType)();
+GetCurrentGamemodeMaxPlayersType GetCurrentGamemodeMaxPlayers;
int GetCurrentGamemodeMaxPlayersHook()
{
- char* maxPlayersStr = GetCurrentPlaylistVar("max_players", 0);
+ char* maxPlayersStr = R2::GetCurrentPlaylistVar("max_players", 0);
if (!maxPlayersStr)
return GetCurrentGamemodeMaxPlayers();
@@ -75,32 +78,41 @@ int GetCurrentGamemodeMaxPlayersHook()
ON_DLL_LOAD_RELIESON("engine.dll", PlaylistHooks, ConCommand, (HMODULE baseAddress)
{
+ // playlist is the name of the command on respawn servers, but we already use setplaylist so can't get rid of it
+ RegisterConCommand("playlist", SetPlaylistCommand, "Sets the current playlist", FCVAR_NONE);
RegisterConCommand("setplaylist", SetPlaylistCommand, "Sets the current playlist", 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
+ // 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
Cvar_ns_use_clc_SetPlaylistVarOverride = new ConVar(
"ns_use_clc_SetPlaylistVarOverride", "0", FCVAR_GAMEDLL, "Whether the server should accept clc_SetPlaylistVarOverride messages");
+ R2::GetCurrentPlaylistName = (R2::GetCurrentPlaylistNameType)((char*)baseAddress + 0x18C640);
+ R2::SetCurrentPlaylist = (R2::SetCurrentPlaylistType)((char*)baseAddress + 0x18EB20);
+ R2::SetPlaylistVarOverride = (R2::SetPlaylistVarOverrideType)((char*)baseAddress + 0x18ED00);
+ R2::GetCurrentPlaylistVar = (R2::GetCurrentPlaylistVarType)((char*)baseAddress + 0x18C680);
+
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));
+ hook, (char*)baseAddress + 0x18ED00, &SetPlaylistVarOverrideHook, reinterpret_cast<LPVOID*>(&R2::SetPlaylistVarOverride));
ENABLER_CREATEHOOK(
- hook, (char*)baseAddress + 0x18C680, &GetCurrentPlaylistVarHook, reinterpret_cast<LPVOID*>(&GetCurrentPlaylistVarOriginal));
+ hook, (char*)baseAddress + 0x18C680, &GetCurrentPlaylistVarHook, reinterpret_cast<LPVOID*>(&R2::GetCurrentPlaylistVar));
ENABLER_CREATEHOOK(
- hook, (char*)baseAddress + 0x18C430, &GetCurrentGamemodeMaxPlayersHook, reinterpret_cast<LPVOID*>(&GetCurrentGamemodeMaxPlayers));
+ hook,
+ (char*)baseAddress + 0x18C430,
+ &GetCurrentGamemodeMaxPlayersHook,
+ reinterpret_cast<LPVOID*>(&GetCurrentGamemodeMaxPlayers));
uintptr_t ba = (uintptr_t)baseAddress;
// 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
- {
- NSMem::BytePatch(ba + 0x18ED8D, "C3");
- }
+ NSMem::BytePatch(ba + 0x18ED8D, "C3");
// patch to allow setplaylistvaroverride to be called before map init on dedicated and private match launched through the game
NSMem::NOP(ba + 0x18ED17, 6);