aboutsummaryrefslogtreecommitdiff
path: root/NorthstarDLL/host.cpp
blob: e8cb9bdc1758c962a31e51527a88ba7c13e5f355 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "pch.h"
#include "convar.h"
#include "modmanager.h"
#include "printcommand.h"
#include "printmaps.h"
#include "r2engine.h"

AUTOHOOK_INIT()

// clang-format off
AUTOHOOK(Host_Init, engine.dll + 0x155EA0,
void, __fastcall, (bool bDedicated))
// clang-format on
{
	spdlog::info("Host_Init()");
	Host_Init(bDedicated);

	// get all mod convars
	std::vector<std::string> vModConvarNames;
	for (auto& mod : g_pModManager->m_LoadedMods)
		for (auto& cvar : mod.ConVars)
			vModConvarNames.push_back(cvar->Name);

	// strip hidden and devonly cvar flags
	int iNumCvarsAltered = 0;
	for (auto& pair : R2::g_pCVar->DumpToMap())
	{
		// don't remove from mod cvars
		if (std::find(vModConvarNames.begin(), vModConvarNames.end(), pair.second->m_pszName) != vModConvarNames.end())
			continue;

		// strip flags
		int flags = pair.second->GetFlags();
		if (flags & FCVAR_DEVELOPMENTONLY)
		{
			flags &= ~FCVAR_DEVELOPMENTONLY;
			iNumCvarsAltered++;
		}

		if (flags & FCVAR_HIDDEN)
		{
			flags &= ~FCVAR_HIDDEN;
			iNumCvarsAltered++;
		}

		pair.second->m_nFlags = flags;
	}

	spdlog::info("Removed {} hidden/devonly cvar flags", iNumCvarsAltered);

	// make servers able to run disconnect on clients
	R2::g_pCVar->FindCommand("disconnect")->m_nFlags |= FCVAR_SERVER_CAN_EXECUTE;

	// make clients able to run status and ping
	R2::g_pCVar->FindCommand("status")->m_nFlags |= FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS;
	R2::g_pCVar->FindCommand("ping")->m_nFlags |= FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS;

	// need to initialise these after host_init since they do stuff to preexisting concommands/convars without being client/server specific
	InitialiseCommandPrint();
	InitialiseMapsPrint();

	// client/server autoexecs on necessary platforms
	// dedi needs autoexec_ns_server on boot, while non-dedi will run it on on listen server start
	if (bDedicated)
		R2::Cbuf_AddText(R2::Cbuf_GetCurrentPlayer(), "exec autoexec_ns_server", R2::cmd_source_t::kCommandSrcCode);
	else
		R2::Cbuf_AddText(R2::Cbuf_GetCurrentPlayer(), "exec autoexec_ns_client", R2::cmd_source_t::kCommandSrcCode);
}

ON_DLL_LOAD("engine.dll", Host_Init, (CModule module))
{
	AUTOHOOK_DISPATCH()
}