aboutsummaryrefslogtreecommitdiff
path: root/primedev/server/alltalk.cpp
blob: 4eb5aef754de72c244440303dbdce400bde51610 (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
#include "core/convar/convar.h"
#include "engine/r2engine.h"

size_t __fastcall ShouldAllowAlltalk()
{
	// this needs to return a 64 bit integer where 0 = true and 1 = false
	static ConVar* Cvar_sv_alltalk = g_pCVar->FindVar("sv_alltalk");
	if (Cvar_sv_alltalk->GetBool())
		return 0;

	// lobby should default to alltalk, otherwise don't allow it
	return strcmp(g_pGlobals->m_pMapName, "mp_lobby");
}

ON_DLL_LOAD_RELIESON("engine.dll", ServerAllTalk, ConVar, (CModule module))
{
	// replace strcmp function called in CClient::ProcessVoiceData with our own code that calls ShouldAllowAllTalk
	CMemory base = module.Offset(0x1085FA);

	base.Patch("48 B8"); // mov rax, 64 bit int
	// (uint8_t*)&ShouldAllowAlltalk doesn't work for some reason? need to make it a uint64 first
	uint64_t pShouldAllowAllTalk = reinterpret_cast<uint64_t>(ShouldAllowAlltalk);
	base.Offset(0x2).Patch((uint8_t*)&pShouldAllowAllTalk, 8);
	base.Offset(0xA).Patch("FF D0"); // call rax

	// nop until compare (test eax, eax)
	base.Offset(0xC).NOP(0x7);
}