From ef5abb16ead11ca0dd542a15c734a277b89593f9 Mon Sep 17 00:00:00 2001
From: PixieCore <41352111+PixieCore@users.noreply.github.com>
Date: Wed, 23 Mar 2022 23:28:12 +0100
Subject: [PATCH] Added the ability to disable rUI drawing. By @r-ex.

---
 r5dev/core/init.cpp                   | 11 ++++++++-
 r5dev/rtech/rtech_utils.h             |  4 +--
 r5dev/rtech/rui/rui.cpp               | 35 +++++++++++++++++++++++++++
 r5dev/rtech/rui/rui.h                 | 28 +++++++++++++++++++++
 r5dev/rtech/stryder.cpp               |  3 ---
 r5dev/rtech/stryder/stryder.cpp       |  3 +++
 r5dev/rtech/{ => stryder}/stryder.h   |  0
 r5dev/tier0/IConVar.cpp               |  8 ++++++
 r5dev/tier0/cvar.cpp                  |  7 ++++++
 r5dev/tier0/cvar.h                    |  7 ++++++
 r5dev/vpc/keyvalues.cpp               |  2 +-
 r5dev/vproj/dedicated.vcxproj         |  4 +--
 r5dev/vproj/dedicated.vcxproj.filters | 15 +++++++-----
 r5dev/vproj/gamesdk.vcxproj           |  6 +++--
 r5dev/vproj/gamesdk.vcxproj.filters   | 24 +++++++++++++-----
 15 files changed, 134 insertions(+), 23 deletions(-)
 create mode 100644 r5dev/rtech/rui/rui.cpp
 create mode 100644 r5dev/rtech/rui/rui.h
 delete mode 100644 r5dev/rtech/stryder.cpp
 create mode 100644 r5dev/rtech/stryder/stryder.cpp
 rename r5dev/rtech/{ => stryder}/stryder.h (100%)

diff --git a/r5dev/core/init.cpp b/r5dev/core/init.cpp
index f716985f..887c26d0 100644
--- a/r5dev/core/init.cpp
+++ b/r5dev/core/init.cpp
@@ -44,7 +44,10 @@
 #include "squirrel/sqvm.h"
 #include "studiorender/studiorendercontext.h"
 #include "rtech/rtech_game.h"
-#include "rtech/stryder.h"
+#include "rtech/stryder/stryder.h"
+#ifndef DEDICATED
+#include "rtech/rui/rui.h"
+#endif // !DEDICATED
 #include "engine/baseclient.h"
 #include "engine/common.h"
 #include "engine/cmodel_bsp.h"
@@ -152,6 +155,9 @@ void Systems_Init()
 	SQVM_Attach();
 
 	RTech_Game_Attach();
+#ifndef DEDICATED
+	Rui_Attach();
+#endif // !DEDICATED
 
 	SysDll_Attach();
 	SysUtils_Attach();
@@ -249,6 +255,9 @@ void Systems_Shutdown()
 	SQVM_Detach();
 
 	RTech_Game_Detach();
+#ifndef DEDICATED
+	Rui_Detach();
+#endif // !DEDICATED
 
 	SysDll_Detach();
 	SysUtils_Detach();
diff --git a/r5dev/rtech/rtech_utils.h b/r5dev/rtech/rtech_utils.h
index 0b62d31e..9bf1b083 100644
--- a/r5dev/rtech/rtech_utils.h
+++ b/r5dev/rtech/rtech_utils.h
@@ -71,8 +71,8 @@ enum class RPakStatus_t : std::int32_t
 };
 
 const std::map<RPakStatus_t, std::string> RPakStatusToString {
-	{ RPakStatus_t::PAK_STATUS_FREED,                 "PAK_STATUS_FREED" },
-	{ RPakStatus_t::PAK_STATUS_LOAD_PENDING,          "PAK_STATUS_LOAD_PENDING" },
+	{ RPakStatus_t::PAK_STATUS_FREED,                  "PAK_STATUS_FREED" },
+	{ RPakStatus_t::PAK_STATUS_LOAD_PENDING,           "PAK_STATUS_LOAD_PENDING" },
 	{ RPakStatus_t::PAK_STATUS_REPAK_RUNNING,          "PAK_STATUS_REPAK_RUNNING" },
 	{ RPakStatus_t::PAK_STATUS_REPAK_DONE,             "PAK_STATUS_REPAK_DONE" },
 	{ RPakStatus_t::PAK_STATUS_LOAD_STARTING,          "PAK_STATUS_LOAD_STARTING" },
diff --git a/r5dev/rtech/rui/rui.cpp b/r5dev/rtech/rui/rui.cpp
new file mode 100644
index 00000000..b3661c4b
--- /dev/null
+++ b/r5dev/rtech/rui/rui.cpp
@@ -0,0 +1,35 @@
+//=============================================================================//
+//
+// Purpose: rUI Utilities
+//
+//=============================================================================//
+
+#include "core/stdafx.h"
+
+#ifndef DEDICATED
+
+#include "rui.h"
+#include <tier0/cvar.h>
+
+//-----------------------------------------------------------------------------
+// Purpose: Probably responsible to decide if rUI is allowed to draw.
+//-----------------------------------------------------------------------------
+bool __fastcall HRuiDraw(__int64* a1, __m128* a2, const __m128i* a3, __int64 a4, __m128* a5)
+{
+	if (!rui_drawEnable->GetBool())
+		return false;
+
+	return RuiDraw(a1, a2, a3, a4, a5);
+}
+
+void Rui_Attach()
+{
+	DetourAttach((LPVOID*)&RuiDraw, &HRuiDraw);
+}
+
+void Rui_Detach()
+{
+	DetourDetach((LPVOID*)&RuiDraw, &HRuiDraw);
+}
+
+#endif // !DEDICATED
\ No newline at end of file
diff --git a/r5dev/rtech/rui/rui.h b/r5dev/rtech/rui/rui.h
new file mode 100644
index 00000000..d76ba1aa
--- /dev/null
+++ b/r5dev/rtech/rui/rui.h
@@ -0,0 +1,28 @@
+#pragma once
+
+#ifndef DEDICATED
+
+namespace
+{
+	/* ==== RUI ====================================================================================================================================================== */
+	ADDRESS p_RuiDraw = g_mGameDll.FindPatternSIMD((std::uint8_t*)"\x40\x53\x48\x83\xEC\x40\x4C\x8B\x5A\x18", "xxxxxxxxxx");
+	bool (__fastcall* RuiDraw)(__int64* a1, __m128* a2, const __m128i* a3, __int64 a4, __m128* a5) = (bool (__fastcall*)(__int64*, __m128*, const __m128i*, __int64, __m128*))p_RuiDraw.GetPtr(); /* 40 53 48 83 EC 40 4C 8B 5A 18 */
+}
+
+void Rui_Attach();
+void Rui_Detach();
+
+///////////////////////////////////////////////////////////////////////////////
+class HRui : public IDetour
+{
+	virtual void debugp()
+	{
+		std::cout << "| FUN: RuiDraw                    : 0x" << std::hex << std::uppercase << p_RuiDraw.GetPtr() << std::setw(npad) << " |" << std::endl;
+		std::cout << "+----------------------------------------------------------------+" << std::endl;
+	}
+};
+///////////////////////////////////////////////////////////////////////////////
+
+REGISTER(HRui);
+
+#endif // !DEDICATED
\ No newline at end of file
diff --git a/r5dev/rtech/stryder.cpp b/r5dev/rtech/stryder.cpp
deleted file mode 100644
index d8101c70..00000000
--- a/r5dev/rtech/stryder.cpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "core/stdafx.h"
-#include "rtech/stryder.h"
-//TODO
diff --git a/r5dev/rtech/stryder/stryder.cpp b/r5dev/rtech/stryder/stryder.cpp
new file mode 100644
index 00000000..94002830
--- /dev/null
+++ b/r5dev/rtech/stryder/stryder.cpp
@@ -0,0 +1,3 @@
+#include "core/stdafx.h"
+#include "rtech/stryder/stryder.h"
+//TODO
diff --git a/r5dev/rtech/stryder.h b/r5dev/rtech/stryder/stryder.h
similarity index 100%
rename from r5dev/rtech/stryder.h
rename to r5dev/rtech/stryder/stryder.h
diff --git a/r5dev/tier0/IConVar.cpp b/r5dev/tier0/IConVar.cpp
index 26048b12..935f658e 100644
--- a/r5dev/tier0/IConVar.cpp
+++ b/r5dev/tier0/IConVar.cpp
@@ -138,6 +138,14 @@ void ConVar::Init(void) const
 	net_userandomkey           = new ConVar("net_userandomkey"          , "1"                        , FCVAR_RELEASE        , "If set to 1, the netchannel generates and sets a random base64 netkey.", false, 0.f, false, 0.f, nullptr, nullptr);
 	r5net_matchmaking_hostname = new ConVar("r5net_matchmaking_hostname", "r5a-comp-sv.herokuapp.com", FCVAR_RELEASE        , "Holds the R5Net matchmaking hostname.", false, 0.f, false, 0.f, nullptr, nullptr);
 	r5net_show_debug           = new ConVar("r5net_show_debug"          , "1"                        , FCVAR_DEVELOPMENTONLY, "Shows debug output for R5Net.", false, 0.f, false, 0.f, nullptr, nullptr);
+	//-------------------------------------------------------------------------
+	// RTECH API                                                              |
+	
+	// RUI                                                                    |
+#ifndef DEDICATED
+	rui_drawEnable = new ConVar("rui_drawEnable", "1", FCVAR_RELEASE, "Draws the rUI, 1 = Draw, 0 = No Draw.", false, 0.f, false, 0.f, nullptr, nullptr);
+#endif // !DEDICATED
+	//-------------------------------------------------------------------------
 }
 
 //-----------------------------------------------------------------------------
diff --git a/r5dev/tier0/cvar.cpp b/r5dev/tier0/cvar.cpp
index b649b9a8..8f008522 100644
--- a/r5dev/tier0/cvar.cpp
+++ b/r5dev/tier0/cvar.cpp
@@ -95,6 +95,13 @@ ConVar* sq_showvmwarning                   = nullptr;
 ConVar* net_userandomkey                   = nullptr;
 ConVar* r5net_matchmaking_hostname         = nullptr;
 ConVar* r5net_show_debug                   = nullptr;
+//-----------------------------------------------------------------------------
+// RTECH API                                                                  |
+
+// RUI                                                                        |
+#ifndef DEDICATED
+ConVar* rui_drawEnable                     = nullptr;
+#endif // !DEDICATED
 
 //-----------------------------------------------------------------------------
 // Purpose: finds base commands.
diff --git a/r5dev/tier0/cvar.h b/r5dev/tier0/cvar.h
index 90200411..5fb2f62f 100644
--- a/r5dev/tier0/cvar.h
+++ b/r5dev/tier0/cvar.h
@@ -105,6 +105,13 @@ extern ConVar* sq_showvmwarning;
 extern ConVar* net_userandomkey;
 extern ConVar* r5net_matchmaking_hostname;
 extern ConVar* r5net_show_debug;
+//-----------------------------------------------------------------------------
+// RTECH API                                                                  |
+
+// RUI                                                                        |
+#ifndef DEDICATED
+extern ConVar* rui_drawEnable;
+#endif // !DEDICATED
 
 class CCVarIteratorInternal // Fully reversed table, just look at the virtual function table and rename the function.
 {
diff --git a/r5dev/vpc/keyvalues.cpp b/r5dev/vpc/keyvalues.cpp
index e9735d1c..7052d158 100644
--- a/r5dev/vpc/keyvalues.cpp
+++ b/r5dev/vpc/keyvalues.cpp
@@ -1,6 +1,6 @@
 #include "core/stdafx.h"
 #include "vpc/keyvalues.h"
-#include "rtech/stryder.h"
+#include "rtech/stryder/stryder.h"
 #include "engine/sys_dll2.h"
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/r5dev/vproj/dedicated.vcxproj b/r5dev/vproj/dedicated.vcxproj
index 0d65ae43..31598af3 100644
--- a/r5dev/vproj/dedicated.vcxproj
+++ b/r5dev/vproj/dedicated.vcxproj
@@ -189,7 +189,7 @@
     <ClInclude Include="..\public\include\utility.h" />
     <ClInclude Include="..\rtech\rtech_utils.h" />
     <ClInclude Include="..\rtech\rtech_game.h" />
-    <ClInclude Include="..\rtech\stryder.h" />
+    <ClInclude Include="..\rtech\stryder\stryder.h" />
     <ClInclude Include="..\server\IVEngineServer.h" />
     <ClInclude Include="..\server\server.h" />
     <ClInclude Include="..\squirrel\sqapi.h" />
@@ -398,7 +398,7 @@
     <ClCompile Include="..\public\utility.cpp" />
     <ClCompile Include="..\rtech\rtech_utils.cpp" />
     <ClCompile Include="..\rtech\rtech_game.cpp" />
-    <ClCompile Include="..\rtech\stryder.cpp" />
+    <ClCompile Include="..\rtech\stryder\stryder.cpp" />
     <ClCompile Include="..\server\IVEngineServer.cpp" />
     <ClCompile Include="..\server\server.cpp" />
     <ClCompile Include="..\squirrel\sqapi.cpp" />
diff --git a/r5dev/vproj/dedicated.vcxproj.filters b/r5dev/vproj/dedicated.vcxproj.filters
index 0bc9bc50..fe528fd5 100644
--- a/r5dev/vproj/dedicated.vcxproj.filters
+++ b/r5dev/vproj/dedicated.vcxproj.filters
@@ -130,6 +130,9 @@
     <Filter Include="thirdparty\lzham\lzhamdecomp\include">
       <UniqueIdentifier>{40c41a94-4e9d-439f-9b16-68531ecc03a8}</UniqueIdentifier>
     </Filter>
+    <Filter Include="sdk\rtech\stryder">
+      <UniqueIdentifier>{07362c29-d064-4bdb-97a6-6e3dbcdc8c02}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\client\client.h">
@@ -204,9 +207,6 @@
     <ClInclude Include="..\public\include\bansystem.h">
       <Filter>sdk\public\include</Filter>
     </ClInclude>
-    <ClInclude Include="..\rtech\stryder.h">
-      <Filter>sdk\rtech</Filter>
-    </ClInclude>
     <ClInclude Include="..\rtech\rtech_utils.h">
       <Filter>sdk\rtech</Filter>
     </ClInclude>
@@ -804,6 +804,9 @@
     <ClInclude Include="..\tier0\fasttimer.h">
       <Filter>sdk\tier0</Filter>
     </ClInclude>
+    <ClInclude Include="..\rtech\stryder\stryder.h">
+      <Filter>sdk\rtech\stryder</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\client\IVEngineClient.cpp">
@@ -854,9 +857,6 @@
     <ClCompile Include="..\public\bansystem.cpp">
       <Filter>sdk\public</Filter>
     </ClCompile>
-    <ClCompile Include="..\rtech\stryder.cpp">
-      <Filter>sdk\rtech</Filter>
-    </ClCompile>
     <ClCompile Include="..\rtech\rtech_utils.cpp">
       <Filter>sdk\rtech</Filter>
     </ClCompile>
@@ -1007,6 +1007,9 @@
     <ClCompile Include="..\tier0\fasttimer.cpp">
       <Filter>sdk\tier0</Filter>
     </ClCompile>
+    <ClCompile Include="..\rtech\stryder\stryder.cpp">
+      <Filter>sdk\rtech\stryder</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\Dedicated.def" />
diff --git a/r5dev/vproj/gamesdk.vcxproj b/r5dev/vproj/gamesdk.vcxproj
index 1d3dccdb..9201a16f 100644
--- a/r5dev/vproj/gamesdk.vcxproj
+++ b/r5dev/vproj/gamesdk.vcxproj
@@ -71,7 +71,8 @@
     <ClCompile Include="..\public\utility.cpp" />
     <ClCompile Include="..\rtech\rtech_utils.cpp" />
     <ClCompile Include="..\rtech\rtech_game.cpp" />
-    <ClCompile Include="..\rtech\stryder.cpp" />
+    <ClCompile Include="..\rtech\rui\rui.cpp" />
+    <ClCompile Include="..\rtech\stryder\stryder.cpp" />
     <ClCompile Include="..\server\IVEngineServer.cpp" />
     <ClCompile Include="..\server\server.cpp" />
     <ClCompile Include="..\squirrel\sqapi.cpp" />
@@ -184,7 +185,8 @@
     <ClInclude Include="..\core\resource.h" />
     <ClInclude Include="..\rtech\rtech_utils.h" />
     <ClInclude Include="..\rtech\rtech_game.h" />
-    <ClInclude Include="..\rtech\stryder.h" />
+    <ClInclude Include="..\rtech\rui\rui.h" />
+    <ClInclude Include="..\rtech\stryder\stryder.h" />
     <ClInclude Include="..\server\IVEngineServer.h" />
     <ClInclude Include="..\server\server.h" />
     <ClInclude Include="..\squirrel\sqapi.h" />
diff --git a/r5dev/vproj/gamesdk.vcxproj.filters b/r5dev/vproj/gamesdk.vcxproj.filters
index ecd83f31..3fa09ec5 100644
--- a/r5dev/vproj/gamesdk.vcxproj.filters
+++ b/r5dev/vproj/gamesdk.vcxproj.filters
@@ -160,6 +160,12 @@
     <Filter Include="thirdparty\lzham\lzhamdecomp\include">
       <UniqueIdentifier>{3446634c-a632-4281-a500-459a56668a6b}</UniqueIdentifier>
     </Filter>
+    <Filter Include="sdk\rtech\rui">
+      <UniqueIdentifier>{3f399cbb-a487-4562-b651-f8ce846e5f94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="sdk\rtech\stryder">
+      <UniqueIdentifier>{2535a97c-967a-40af-bb52-02033747b4f0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\client\client.cpp">
@@ -210,9 +216,6 @@
     <ClCompile Include="..\rtech\rtech_utils.cpp">
       <Filter>sdk\rtech</Filter>
     </ClCompile>
-    <ClCompile Include="..\rtech\stryder.cpp">
-      <Filter>sdk\rtech</Filter>
-    </ClCompile>
     <ClCompile Include="..\inputsystem\inputsystem.cpp">
       <Filter>sdk\inputsystem</Filter>
     </ClCompile>
@@ -408,6 +411,12 @@
     <ClCompile Include="..\tier0\fasttimer.cpp">
       <Filter>sdk\tier0</Filter>
     </ClCompile>
+    <ClCompile Include="..\rtech\rui\rui.cpp">
+      <Filter>sdk\rtech\rui</Filter>
+    </ClCompile>
+    <ClCompile Include="..\rtech\stryder\stryder.cpp">
+      <Filter>sdk\rtech\stryder</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\client\cdll_engine_int.h">
@@ -470,9 +479,6 @@
     <ClInclude Include="..\rtech\rtech_utils.h">
       <Filter>sdk\rtech</Filter>
     </ClInclude>
-    <ClInclude Include="..\rtech\stryder.h">
-      <Filter>sdk\rtech</Filter>
-    </ClInclude>
     <ClInclude Include="..\inputsystem\inputsystem.h">
       <Filter>sdk\inputsystem</Filter>
     </ClInclude>
@@ -1166,6 +1172,12 @@
     <ClInclude Include="..\tier0\cpu.h">
       <Filter>sdk\tier0</Filter>
     </ClInclude>
+    <ClInclude Include="..\rtech\rui\rui.h">
+      <Filter>sdk\rtech\rui</Filter>
+    </ClInclude>
+    <ClInclude Include="..\rtech\stryder\stryder.h">
+      <Filter>sdk\rtech\stryder</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Image Include="..\shared\resource\lockedserver.png">