aboutsummaryrefslogtreecommitdiff
path: root/NorthstarDLL/gameutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'NorthstarDLL/gameutils.cpp')
-rw-r--r--NorthstarDLL/gameutils.cpp119
1 files changed, 119 insertions, 0 deletions
diff --git a/NorthstarDLL/gameutils.cpp b/NorthstarDLL/gameutils.cpp
new file mode 100644
index 00000000..792d8bf2
--- /dev/null
+++ b/NorthstarDLL/gameutils.cpp
@@ -0,0 +1,119 @@
+#include "pch.h"
+#include "convar.h"
+#include "gameutils.h"
+
+// memory
+IMemAlloc* g_pMemAllocSingleton;
+typedef IMemAlloc* (*CreateGlobalMemAllocType)();
+CreateGlobalMemAllocType CreateGlobalMemAlloc;
+
+// cmd.h
+Cbuf_GetCurrentPlayerType Cbuf_GetCurrentPlayer;
+Cbuf_AddTextType Cbuf_AddText;
+Cbuf_ExecuteType Cbuf_Execute;
+
+// hoststate stuff
+CHostState* g_pHostState;
+
+// cengine stuff
+CEngine* g_pEngine;
+server_state_t* sv_m_State;
+
+// network stuff
+ConVar* Cvar_hostport;
+
+// playlist stuff
+GetCurrentPlaylistType GetCurrentPlaylistName;
+SetCurrentPlaylistType SetCurrentPlaylist;
+SetPlaylistVarOverrideType SetPlaylistVarOverride;
+GetCurrentPlaylistVarType GetCurrentPlaylistVar;
+
+// server entity stuff
+Server_GetEntityByIndexType Server_GetEntityByIndex;
+
+// auth
+char* g_LocalPlayerUserID;
+char* g_LocalPlayerOriginToken;
+
+// misc stuff
+ErrorType Error;
+CommandLineType CommandLine;
+Plat_FloatTimeType Plat_FloatTime;
+ThreadInServerFrameThreadType ThreadInServerFrameThread;
+GetBaseLocalClientType GetBaseLocalClient;
+
+void InitialiseEngineGameUtilFunctions(HMODULE baseAddress)
+{
+ Cbuf_GetCurrentPlayer = (Cbuf_GetCurrentPlayerType)((char*)baseAddress + 0x120630);
+ Cbuf_AddText = (Cbuf_AddTextType)((char*)baseAddress + 0x1203B0);
+ Cbuf_Execute = (Cbuf_ExecuteType)((char*)baseAddress + 0x1204B0);
+
+ g_pHostState = (CHostState*)((char*)baseAddress + 0x7CF180);
+ g_pEngine = *(CEngine**)((char*)baseAddress + 0x7D70C8);
+ sv_m_State = (server_state_t*)((char*)baseAddress + 0x12A53D48);
+
+ GetCurrentPlaylistName = (GetCurrentPlaylistType)((char*)baseAddress + 0x18C640);
+ SetCurrentPlaylist = (SetCurrentPlaylistType)((char*)baseAddress + 0x18EB20);
+ SetPlaylistVarOverride = (SetPlaylistVarOverrideType)((char*)baseAddress + 0x18ED00);
+ GetCurrentPlaylistVar = (GetCurrentPlaylistVarType)((char*)baseAddress + 0x18C680);
+
+ g_LocalPlayerUserID = (char*)baseAddress + 0x13F8E688;
+ g_LocalPlayerOriginToken = (char*)baseAddress + 0x13979C80;
+
+ GetBaseLocalClient = (GetBaseLocalClientType)((char*)baseAddress + 0x78200);
+
+ /* NOTE:
+ g_pCVar->FindVar("convar_name") now works. These are no longer needed.
+ You can also itterate over every ConVar using CCVarIteratorInternal
+ dump the pointers to a vector and access them from there.
+ Example:
+ std::vector<ConVar*> g_pAllConVars;
+ for (auto& map : g_pCVar->DumpToMap())
+ {
+ ConVar* pConVar = g_pCVar->FindVar(map.first.c_str());
+ if (pConVar)
+ {
+ g_pAllConVars.push_back(pConVar);
+ }
+ }*/
+
+ Cvar_hostport = (ConVar*)((char*)baseAddress + 0x13FA6070);
+}
+
+void InitialiseServerGameUtilFunctions(HMODULE baseAddress)
+{
+ Server_GetEntityByIndex = (Server_GetEntityByIndexType)((char*)baseAddress + 0xFB820);
+}
+
+void InitialiseTier0GameUtilFunctions(HMODULE baseAddress)
+{
+ if (!baseAddress)
+ {
+ spdlog::critical("tier0 base address is null, but it should be already loaded");
+ throw "tier0 base address is null, but it should be already loaded";
+ }
+ if (g_pMemAllocSingleton)
+ return; // seems this function was already called
+ CreateGlobalMemAlloc = reinterpret_cast<CreateGlobalMemAllocType>(GetProcAddress(baseAddress, "CreateGlobalMemAlloc"));
+ IMemAlloc** ppMemAllocSingleton = reinterpret_cast<IMemAlloc**>(GetProcAddress(baseAddress, "g_pMemAllocSingleton"));
+ if (!ppMemAllocSingleton)
+ {
+ spdlog::critical("Address of g_pMemAllocSingleton is a null pointer, this should never happen");
+ throw "Address of g_pMemAllocSingleton is a null pointer, this should never happen";
+ }
+ if (!*ppMemAllocSingleton)
+ {
+ g_pMemAllocSingleton = CreateGlobalMemAlloc();
+ *ppMemAllocSingleton = g_pMemAllocSingleton;
+ spdlog::info("Created new g_pMemAllocSingleton");
+ }
+ else
+ {
+ g_pMemAllocSingleton = *ppMemAllocSingleton;
+ }
+
+ Error = reinterpret_cast<ErrorType>(GetProcAddress(baseAddress, "Error"));
+ CommandLine = reinterpret_cast<CommandLineType>(GetProcAddress(baseAddress, "CommandLine"));
+ Plat_FloatTime = reinterpret_cast<Plat_FloatTimeType>(GetProcAddress(baseAddress, "Plat_FloatTime"));
+ ThreadInServerFrameThread = reinterpret_cast<ThreadInServerFrameThreadType>(GetProcAddress(baseAddress, "ThreadInServerFrameThread"));
+} \ No newline at end of file