aboutsummaryrefslogtreecommitdiff
path: root/NorthstarDedicatedTest/playlist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'NorthstarDedicatedTest/playlist.cpp')
-rw-r--r--NorthstarDedicatedTest/playlist.cpp94
1 files changed, 45 insertions, 49 deletions
diff --git a/NorthstarDedicatedTest/playlist.cpp b/NorthstarDedicatedTest/playlist.cpp
index 0e0ed3c2..67e3a821 100644
--- a/NorthstarDedicatedTest/playlist.cpp
+++ b/NorthstarDedicatedTest/playlist.cpp
@@ -10,53 +10,62 @@ AUTOHOOK_INIT()
// use the R2 namespace for game funcs
namespace R2
{
- GetCurrentPlaylistNameType GetCurrentPlaylistName;
- SetCurrentPlaylistType SetCurrentPlaylist;
- SetPlaylistVarOverrideType SetPlaylistVarOverride;
- GetCurrentPlaylistVarType GetCurrentPlaylistVar;
+ const char* (*GetCurrentPlaylistName)();
+ void (*SetCurrentPlaylist)(const char* pPlaylistName);
+ void (*SetPlaylistVarOverride)(const char* pVarName, const char* pValue);
+ const char* (*GetCurrentPlaylistVar)(const char* pVarName, bool bUseOverrides);
} // namespace R2
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)
+AUTOHOOK(clc_SetPlaylistVarOverride__Process, engine.dll + 0x222180,
+char,, (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
+ // todo: check map == mp_lobby here too
if (!Cvar_ns_use_clc_SetPlaylistVarOverride->GetBool() || strcmp(R2::GetCurrentPlaylistName(), "private_match"))
return 1;
- return Onclc_SetPlaylistVarOverride(a1, a2);
-}
+ return clc_SetPlaylistVarOverride__Process(a1, a2);
+})
+
+AUTOHOOK(SetCurrentPlaylist, engine.dll + 0x18EB20,
+void,, (const char* pPlaylistName),
+{
+ SetCurrentPlaylist(pPlaylistName);
+ spdlog::info("Set playlist to {}", pPlaylistName);
+})
-void SetPlaylistVarOverrideHook(const char* varName, const char* value)
+AUTOHOOK(SetPlaylistVarOverride, engine.dll + 0x18ED00,
+void,, (const char* pVarName, const char* pValue),
{
- if (strlen(value) >= 64)
+ if (strlen(pValue) >= 64)
return;
- R2::SetPlaylistVarOverride(varName, value);
-}
+ R2::SetPlaylistVarOverride(pVarName, pValue);
+})
-const char* GetCurrentPlaylistVarHook(const char* varName, bool useOverrides)
+AUTOHOOK(GetCurrentPlaylistVar, engine.dll + 0x18C680,
+const char*,, (const char* pVarName, bool bUseOverrides),
{
- if (!useOverrides && !strcmp(varName, "max_players"))
- useOverrides = true;
+ if (!bUseOverrides && !strcmp(pVarName, "max_players"))
+ bUseOverrides = true;
+
+ return R2::GetCurrentPlaylistVar(pVarName, bUseOverrides);
+})
- return R2::GetCurrentPlaylistVar(varName, useOverrides);
-}
-typedef int (*GetCurrentGamemodeMaxPlayersType)();
-GetCurrentGamemodeMaxPlayersType GetCurrentGamemodeMaxPlayers;
-int GetCurrentGamemodeMaxPlayersHook()
+AUTOHOOK(GetCurrentGamemodeMaxPlayers, engine.dll + 0x18C430,
+int,, (),
{
- const char* maxPlayersStr = R2::GetCurrentPlaylistVar("max_players", 0);
- if (!maxPlayersStr)
+ const char* pMaxPlayers = R2::GetCurrentPlaylistVar("max_players", 0);
+ if (!pMaxPlayers)
return GetCurrentGamemodeMaxPlayers();
- int maxPlayers = atoi(maxPlayersStr);
- return maxPlayers;
-}
+ int iMaxPlayers = atoi(pMaxPlayers);
+ return iMaxPlayers;
+})
+
void ConCommand_playlist(const CCommand& args)
{
@@ -77,16 +86,18 @@ void ConCommand_setplaylistvaroverride(const CCommand& args)
ON_DLL_LOAD_RELIESON("engine.dll", PlaylistHooks, ConCommand, [](HMODULE baseAddress)
{
+ AUTOHOOK_DISPATCH()
+
+ R2::GetCurrentPlaylistName = (const char* (*)())((char*)baseAddress + 0x18C640);
+ R2::SetCurrentPlaylist = (void (*)(const char*))((char*)baseAddress + 0x18EB20);
+ R2::SetPlaylistVarOverride = (void (*)(const char*, const char*))((char*)baseAddress + 0x18ED00);
+ R2::GetCurrentPlaylistVar = (const char* (*)(const char*, bool))((char*)baseAddress + 0x18C680);
+
// playlist is the name of the command on respawn servers, but we already use setplaylist so can't get rid of it
RegisterConCommand("playlist", ConCommand_playlist, "Sets the current playlist", FCVAR_NONE);
RegisterConCommand("setplaylist", ConCommand_playlist, "Sets the current playlist", FCVAR_NONE);
RegisterConCommand("setplaylistvaroverrides", ConCommand_setplaylistvaroverride, "sets a playlist var override", FCVAR_NONE);
- 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);
-
// 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
@@ -94,25 +105,10 @@ ON_DLL_LOAD_RELIESON("engine.dll", PlaylistHooks, ConCommand, [](HMODULE baseAdd
Cvar_ns_use_clc_SetPlaylistVarOverride = new ConVar(
"ns_use_clc_SetPlaylistVarOverride", "0", FCVAR_GAMEDLL, "Whether the server should accept clc_SetPlaylistVarOverride messages");
- 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*>(&R2::SetPlaylistVarOverride));
- ENABLER_CREATEHOOK(
- hook, (char*)baseAddress + 0x18C680, &GetCurrentPlaylistVarHook, reinterpret_cast<LPVOID*>(&R2::GetCurrentPlaylistVar));
- ENABLER_CREATEHOOK(
- 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((uintptr_t)baseAddress + 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);
+ NSMem::NOP((uintptr_t)baseAddress + 0x18ED17, 6);
}) \ No newline at end of file