From b1bf7ee7c45f9da7ba985f00f451445b48aa799e Mon Sep 17 00:00:00 2001
From: IcePixelx <41352111+PixieCore@users.noreply.github.com>
Date: Sat, 14 Aug 2021 12:46:52 +0200
Subject: [PATCH] Re-Load playlists from disk after disconnecting or getting
dropped of server.
---
r5dev/include/hooks.h | 3 +++
r5dev/include/patterns.h | 8 ++++++++
r5dev/r5dev.vcxproj | 1 +
r5dev/r5dev.vcxproj.filters | 3 +++
r5dev/src/hooks/hooks.cpp | 3 +++
r5dev/src/hooks/netchannel.cpp | 13 +++++++++++++
6 files changed, 31 insertions(+)
create mode 100644 r5dev/src/hooks/netchannel.cpp
diff --git a/r5dev/include/hooks.h b/r5dev/include/hooks.h
index f59366a7..6b33a004 100644
--- a/r5dev/include/hooks.h
+++ b/r5dev/include/hooks.h
@@ -43,6 +43,7 @@ namespace Hooks
bool NET_ReceiveDatagram(int sock, void* inpacket, bool raw);
unsigned int NET_SendDatagram(SOCKET s, const char* buf, int len, int flags);
void NET_PrintFunc(const char* fmt, ...);
+ void NetChanShutdown(void* rcx, const char* reason, unsigned __int8 unk1, char unk2);
using NET_PrintFuncFn = void(*)(const char* fmt, ...);
extern NET_PrintFuncFn originalNET_PrintFunc;
@@ -52,6 +53,8 @@ namespace Hooks
using NET_SendDatagramFn = unsigned int(*)(SOCKET, const char*, int, int);
extern NET_SendDatagramFn originalNET_SendDatagram;
+ using NetChan_ShutDown = void(*)(void*, const char*, unsigned __int8, char);
+ extern NetChan_ShutDown originalNetChanShutDown;
#pragma endregion
#pragma region ConVar
diff --git a/r5dev/include/patterns.h b/r5dev/include/patterns.h
index 1bced023..592a5c58 100644
--- a/r5dev/include/patterns.h
+++ b/r5dev/include/patterns.h
@@ -14,6 +14,9 @@ namespace
/*0x14046F490*/
FUNC_AT_ADDRESS(addr_ConCommand_IsFlagSet, bool(*)(int*, int), r5_patterns.PatternSearch("85 51 38 0F 95 C0 C3").GetPtr());
+
+ /*0x140279CE0*/
+ FUNC_AT_ADDRESS(addr_downloadPlaylists_Callback, void*, r5_patterns.PatternSearch("33 C9 C6 05 ? ? ? ? ? E9 ? ? ? ?").GetPtr());
#pragma endregion
#pragma region Squirrel
@@ -39,6 +42,9 @@ namespace
/*0x1402662D0*/
FUNC_AT_ADDRESS(addr_NET_SendDatagram, int(*)(SOCKET, const char*, int, int), r5_patterns.PatternSearch("48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 41 56 41 57 48 81 EC ? 05 ? ?").GetPtr());
+
+ /*0x14025F190*/
+ FUNC_AT_ADDRESS(addr_NetChan_Shutdown, void(*)(void*, const char*, unsigned __int8, char), r5_patterns.StringSearch("Disconnect by server.\n").FindPatternSelf("E8 ? ? ? ? 4C 89 B3 ? ? ? ?", MemoryAddress::Direction::DOWN).FollowNearCall().GetPtr());
#pragma endregion
#pragma region CHLClient
@@ -68,12 +74,14 @@ namespace
PRINT_ADDRESS("CommandExecute", addr_CommandExecute);
PRINT_ADDRESS("ConVar_IsFlagSet", addr_ConVar_IsFlagSet);
PRINT_ADDRESS("ConCommand_IsFlagSet", addr_ConCommand_IsFlagSet);
+ PRINT_ADDRESS("Downloadplaylists_Callback", addr_downloadPlaylists_Callback);
PRINT_ADDRESS("SQVM_Print", addr_SQVM_Print);
PRINT_ADDRESS("SQVM_LoadScript", addr_SQVM_LoadScript);
PRINT_ADDRESS("SQVM_LoadRson", addr_SQVM_LoadRson);
PRINT_ADDRESS("NET_PrintFunc", addr_NET_PrintFunc);
PRINT_ADDRESS("NET_ReceiveDatagram", addr_NET_ReceiveDatagram);
PRINT_ADDRESS("NET_SendDatagram ", addr_NET_SendDatagram);
+ PRINT_ADDRESS("INetChannel::Shutdown", addr_NetChan_Shutdown);
PRINT_ADDRESS("CHLClient::FrameStageNotify", addr_CHLClient_FrameStageNotify);
PRINT_ADDRESS("CVEngineServer::IsPersistenceDataAvailable", addr_CVEngineServer_IsPersistenceDataAvailable);
PRINT_ADDRESS("CBaseFileSystem::FileSystemWarning", addr_CBaseFileSystem_FileSystemWarning);
diff --git a/r5dev/r5dev.vcxproj b/r5dev/r5dev.vcxproj
index 005037e8..60de2c64 100644
--- a/r5dev/r5dev.vcxproj
+++ b/r5dev/r5dev.vcxproj
@@ -384,6 +384,7 @@ if not EXIST $(SolutionDir)r5net\lib\$(Configuration)\r5net.lib (
+
diff --git a/r5dev/r5dev.vcxproj.filters b/r5dev/r5dev.vcxproj.filters
index 6edecb61..83ee6880 100644
--- a/r5dev/r5dev.vcxproj.filters
+++ b/r5dev/r5dev.vcxproj.filters
@@ -189,6 +189,9 @@
hooks\src\cbasefilesystem
+
+ hooks\src\netchannel
+
diff --git a/r5dev/src/hooks/hooks.cpp b/r5dev/src/hooks/hooks.cpp
index ad0c1801..c255b3ab 100644
--- a/r5dev/src/hooks/hooks.cpp
+++ b/r5dev/src/hooks/hooks.cpp
@@ -31,6 +31,7 @@ void Hooks::InstallHooks()
MH_CreateHook(addr_NET_PrintFunc, &Hooks::NET_PrintFunc, reinterpret_cast(&originalNET_PrintFunc));
MH_CreateHook(addr_NET_ReceiveDatagram, &Hooks::NET_ReceiveDatagram, reinterpret_cast(&originalNET_ReceiveDatagram));
MH_CreateHook(addr_NET_SendDatagram, &Hooks::NET_SendDatagram, reinterpret_cast(&originalNET_SendDatagram));
+ MH_CreateHook(addr_NetChan_Shutdown, &Hooks::NetChanShutdown, reinterpret_cast(&originalNetChanShutDown));
///////////////////////////////////////////////////////////////////////////////
// Hook ConVar | ConCommand functions.
@@ -81,6 +82,7 @@ void Hooks::InstallHooks()
///////////////////////////////////////////////////////////////////////////////
// Enable Netchan hooks
MH_EnableHook(addr_NET_PrintFunc);
+ MH_EnableHook(addr_NetChan_Shutdown);
///////////////////////////////////////////////////////////////////////////////
// Enable ConVar | ConCommand hooks
@@ -114,6 +116,7 @@ void Hooks::RemoveHooks()
MH_RemoveHook(addr_NET_PrintFunc);
MH_RemoveHook(addr_NET_ReceiveDatagram);
MH_RemoveHook(addr_NET_SendDatagram);
+ MH_RemoveHook(addr_NetChan_Shutdown);
///////////////////////////////////////////////////////////////////////////////
// Unhook ConVar | ConCommand functions.
diff --git a/r5dev/src/hooks/netchannel.cpp b/r5dev/src/hooks/netchannel.cpp
new file mode 100644
index 00000000..2dc45d40
--- /dev/null
+++ b/r5dev/src/hooks/netchannel.cpp
@@ -0,0 +1,13 @@
+#include "pch.h"
+#include "hooks.h"
+
+namespace Hooks
+{
+ NetChan_ShutDown originalNetChanShutDown = nullptr;
+}
+
+void Hooks::NetChanShutdown(void* rcx, const char* reason, unsigned __int8 unk1, char unk2)
+{
+ reinterpret_cast(addr_downloadPlaylists_Callback)(); // Re-Load playlist from disk after getting dropped or disconnecting off a server.
+ originalNetChanShutDown(rcx, reason, unk1, unk2);
+}
\ No newline at end of file