aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorr-ex <67599507+r-ex@users.noreply.github.com>2022-04-21 03:03:09 +0100
committerGitHub <noreply@github.com>2022-04-21 03:03:09 +0100
commitc2f9dd4695824a75e930db5eaea96f5df2f4ea27 (patch)
treecd971ad20fdbddf02e8e6a629da66b4b008ef2af
parent47ea109be0d73120ddfe6896494e1fce986515b3 (diff)
downloadNorthstarLauncher-c2f9dd4695824a75e930db5eaea96f5df2f4ea27.tar.gz
NorthstarLauncher-c2f9dd4695824a75e930db5eaea96f5df2f4ea27.zip
DebugOverlay (#106)
* DebugOverlay yea * default enable_debug_overlays to 0, and make FCVAR_CHEAT Co-authored-by: BobTheBob <32057864+BobTheBob9@users.noreply.github.com>
-rw-r--r--NorthstarDedicatedTest/NorthstarDedicatedTest.vcxproj2
-rw-r--r--NorthstarDedicatedTest/NorthstarDedicatedTest.vcxproj.filters6
-rw-r--r--NorthstarDedicatedTest/debugoverlay.cpp159
-rw-r--r--NorthstarDedicatedTest/debugoverlay.h3
-rw-r--r--NorthstarDedicatedTest/dllmain.cpp4
5 files changed, 173 insertions, 1 deletions
diff --git a/NorthstarDedicatedTest/NorthstarDedicatedTest.vcxproj b/NorthstarDedicatedTest/NorthstarDedicatedTest.vcxproj
index be70b70b..13f907e1 100644
--- a/NorthstarDedicatedTest/NorthstarDedicatedTest.vcxproj
+++ b/NorthstarDedicatedTest/NorthstarDedicatedTest.vcxproj
@@ -114,6 +114,7 @@
<ClInclude Include="buildainfile.h" />
<ClInclude Include="chatcommand.h" />
<ClInclude Include="clientchathooks.h" />
+ <ClInclude Include="debugoverlay.h" />
<ClInclude Include="clientruihooks.h" />
<ClInclude Include="clientvideooverrides.h" />
<ClInclude Include="localchatwriter.h" />
@@ -580,6 +581,7 @@
<ClCompile Include="context.cpp" />
<ClCompile Include="convar.cpp" />
<ClCompile Include="cvar.cpp" />
+ <ClCompile Include="debugoverlay.cpp" />
<ClCompile Include="dedicated.cpp" />
<ClCompile Include="dedicatedmaterialsystem.cpp" />
<ClCompile Include="dllmain.cpp" />
diff --git a/NorthstarDedicatedTest/NorthstarDedicatedTest.vcxproj.filters b/NorthstarDedicatedTest/NorthstarDedicatedTest.vcxproj.filters
index 4089f1ca..e9c52d1d 100644
--- a/NorthstarDedicatedTest/NorthstarDedicatedTest.vcxproj.filters
+++ b/NorthstarDedicatedTest/NorthstarDedicatedTest.vcxproj.filters
@@ -1488,6 +1488,9 @@
<ClInclude Include="plugin_abi.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="debugoverlay.h">
+ <Filter>Header Files\Client</Filter>
+ </ClInclude>
<ClInclude Include="clientvideooverrides.h">
<Filter>Header Files\Client</Filter>
</ClInclude>
@@ -1658,6 +1661,9 @@
<ClCompile Include="plugins.cpp">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="debugoverlay.cpp">
+ <Filter>Source Files\Client</Filter>
+ </ClCompile>
<ClCompile Include="clientvideooverrides.cpp">
<Filter>Source Files\Client</Filter>
</ClCompile>
diff --git a/NorthstarDedicatedTest/debugoverlay.cpp b/NorthstarDedicatedTest/debugoverlay.cpp
new file mode 100644
index 00000000..9620609f
--- /dev/null
+++ b/NorthstarDedicatedTest/debugoverlay.cpp
@@ -0,0 +1,159 @@
+#include "pch.h"
+#include "debugoverlay.h"
+#include "dedicated.h"
+#include "cvar.h"
+
+struct Vector3
+{
+ float x, y, z;
+};
+
+struct QAngle
+{
+ float x, y, z, w;
+};
+
+enum OverlayType_t
+{
+ OVERLAY_BOX = 0,
+ OVERLAY_SPHERE,
+ OVERLAY_LINE,
+ OVERLAY_TRIANGLE,
+ OVERLAY_SWEPT_BOX,
+ OVERLAY_BOX2,
+ OVERLAY_CAPSULE
+};
+
+struct OverlayBase_t
+{
+ OverlayBase_t()
+ {
+ m_Type = OVERLAY_BOX;
+ m_nServerCount = -1;
+ m_nCreationTick = -1;
+ m_flEndTime = 0.0f;
+ m_pNextOverlay = NULL;
+ }
+
+ OverlayType_t m_Type; // What type of overlay is it?
+ int m_nCreationTick; // Duration -1 means go away after this frame #
+ int m_nServerCount; // Latch server count, too
+ float m_flEndTime; // When does this box go away
+ OverlayBase_t* m_pNextOverlay;
+ __int64 m_pUnk;
+};
+
+struct OverlayLine_t : public OverlayBase_t
+{
+ OverlayLine_t() { m_Type = OVERLAY_LINE; }
+
+ Vector3 origin;
+ Vector3 dest;
+ int r;
+ int g;
+ int b;
+ int a;
+ bool noDepthTest;
+};
+
+struct OverlayBox_t : public OverlayBase_t
+{
+ OverlayBox_t() { m_Type = OVERLAY_BOX; }
+
+ Vector3 origin;
+ Vector3 mins;
+ Vector3 maxs;
+ QAngle angles;
+ int r;
+ int g;
+ int b;
+ int a;
+};
+
+// this is in cvar.h, don't need it here
+/*class Color
+{
+ public:
+ Color(int r, int g, int b, int a)
+ {
+ _color[0] = (unsigned char)r;
+ _color[1] = (unsigned char)g;
+ _color[2] = (unsigned char)b;
+ _color[3] = (unsigned char)a;
+ }
+
+ private:
+ unsigned char _color[4];
+};*/
+
+static HMODULE sEngineModule;
+
+typedef void (*DrawOverlayType)(OverlayBase_t* a1);
+DrawOverlayType DrawOverlay;
+
+typedef void (*RenderLineType)(Vector3 v1, Vector3 v2, Color c, bool bZBuffer);
+static RenderLineType RenderLine;
+
+typedef void (*RenderBoxType)(Vector3 vOrigin, QAngle angles, Vector3 vMins, Vector3 vMaxs, Color c, bool bZBuffer, bool bInsideOut);
+static RenderBoxType RenderBox;
+
+static RenderBoxType RenderWireframeBox;
+
+// engine.dll+0xABCB0
+void __fastcall DrawOverlayHook(OverlayBase_t* pOverlay)
+{
+ EnterCriticalSection((LPCRITICAL_SECTION)((char*)sEngineModule + 0x10DB0A38)); // s_OverlayMutex
+
+ void* pMaterialSystem = *(void**)((char*)sEngineModule + 0x14C675B0);
+
+ switch (pOverlay->m_Type)
+ {
+ case OVERLAY_LINE:
+ {
+ OverlayLine_t* pLine = static_cast<OverlayLine_t*>(pOverlay);
+ RenderLine(pLine->origin, pLine->dest, Color(pLine->r, pLine->g, pLine->b, pLine->a), pLine->noDepthTest);
+ }
+ break;
+ case OVERLAY_BOX:
+ {
+ OverlayBox_t* pCurrBox = static_cast<OverlayBox_t*>(pOverlay);
+ if (pCurrBox->a > 0)
+ {
+ RenderBox(
+ pCurrBox->origin, pCurrBox->angles, pCurrBox->mins, pCurrBox->maxs,
+ Color(pCurrBox->r, pCurrBox->g, pCurrBox->b, pCurrBox->a), false, false);
+ }
+ if (pCurrBox->a < 255)
+ {
+ RenderWireframeBox(
+ pCurrBox->origin, pCurrBox->angles, pCurrBox->mins, pCurrBox->maxs, Color(pCurrBox->r, pCurrBox->g, pCurrBox->b, 255),
+ false, false);
+ }
+ }
+ break;
+ }
+ LeaveCriticalSection((LPCRITICAL_SECTION)((char*)sEngineModule + 0x10DB0A38));
+}
+
+void InitialiseDebugOverlay(HMODULE baseAddress)
+{
+ if (IsDedicated())
+ return;
+
+ HookEnabler hook;
+ ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0xABCB0, &DrawOverlayHook, reinterpret_cast<LPVOID*>(&DrawOverlay));
+
+ RenderLine = reinterpret_cast<RenderLineType>((char*)baseAddress + 0x192A70);
+
+ RenderBox = reinterpret_cast<RenderBoxType>((char*)baseAddress + 0x192520);
+
+ RenderWireframeBox = reinterpret_cast<RenderBoxType>((char*)baseAddress + 0x193DA0);
+
+ sEngineModule = baseAddress;
+
+ // not in g_pCVar->FindVar by this point for whatever reason, so have to get from memory
+ ConVar* Cvar_enable_debug_overlays = (ConVar*)((char*)baseAddress + 0x10DB0990);
+ Cvar_enable_debug_overlays->SetValue(false);
+ Cvar_enable_debug_overlays->m_pszDefaultValue = (char*)"0";
+ Cvar_enable_debug_overlays->AddFlags(FCVAR_CHEAT);
+} \ No newline at end of file
diff --git a/NorthstarDedicatedTest/debugoverlay.h b/NorthstarDedicatedTest/debugoverlay.h
new file mode 100644
index 00000000..a300018c
--- /dev/null
+++ b/NorthstarDedicatedTest/debugoverlay.h
@@ -0,0 +1,3 @@
+#pragma once
+
+void InitialiseDebugOverlay(HMODULE baseAddress); \ No newline at end of file
diff --git a/NorthstarDedicatedTest/dllmain.cpp b/NorthstarDedicatedTest/dllmain.cpp
index b5e06e3a..26503f52 100644
--- a/NorthstarDedicatedTest/dllmain.cpp
+++ b/NorthstarDedicatedTest/dllmain.cpp
@@ -39,6 +39,7 @@
#include "scriptservertoclientstringcommand.h"
#include "plugin_abi.h"
#include "plugins.h"
+#include "debugoverlay.h"
#include "clientvideooverrides.h"
#include "clientruihooks.h"
#include <string.h>
@@ -229,6 +230,7 @@ bool InitialiseNorthstar()
// client-exclusive patches
{
+
AddDllLoadCallbackForClient("tier0.dll", InitialiseTier0LanguageHooks);
AddDllLoadCallbackForClient("client.dll", InitialiseClientSquirrel);
AddDllLoadCallbackForClient("client.dll", InitialiseSourceConsole);
@@ -248,7 +250,7 @@ bool InitialiseNorthstar()
AddDllLoadCallbackForClient("client.dll", InitialiseScriptServerToClientStringCommands);
AddDllLoadCallbackForClient("client.dll", InitialiseClientVideoOverrides);
AddDllLoadCallbackForClient("engine.dll", InitialiseEngineClientRUIHooks);
-
+ AddDllLoadCallbackForClient("engine.dll", InitialiseDebugOverlay);
// audio hooks
AddDllLoadCallbackForClient("client.dll", InitialiseMilesAudioHooks);
}