Move Dedicated patches related to chat to new Chat component
This commit is contained in:
parent
fa40711ee8
commit
624daa858e
@ -102,6 +102,7 @@ namespace Components
|
||||
Loader::Register(new StartupMessages());
|
||||
Loader::Register(new SoundMutexFix());
|
||||
Loader::Register(new Gamepad());
|
||||
Loader::Register(new Chat());
|
||||
Loader::Register(new TextRenderer());
|
||||
|
||||
Loader::Register(new Client());
|
||||
|
@ -130,6 +130,7 @@ namespace Components
|
||||
#include "Modules/StartupMessages.hpp"
|
||||
#include "Modules/Stats.hpp"
|
||||
#include "Modules/SoundMutexFix.hpp"
|
||||
#include "Modules/Chat.hpp"
|
||||
#include "Modules/TextRenderer.hpp"
|
||||
|
||||
#include "Modules/Gamepad.hpp"
|
||||
|
84
src/Components/Modules/Chat.cpp
Normal file
84
src/Components/Modules/Chat.cpp
Normal file
@ -0,0 +1,84 @@
|
||||
#include "STDInclude.hpp"
|
||||
|
||||
namespace Components
|
||||
{
|
||||
bool Chat::SendChat;
|
||||
|
||||
const char* Chat::EvaluateSay(char* text, Game::gentity_t* player)
|
||||
{
|
||||
SendChat = true;
|
||||
|
||||
if (text[1] == '/')
|
||||
{
|
||||
SendChat = false;
|
||||
text[1] = text[0];
|
||||
++text;
|
||||
}
|
||||
|
||||
TextRenderer::StripMaterialTextIcons(text, text, strlen(text) + 1);
|
||||
|
||||
Game::Scr_AddEntity(player);
|
||||
Game::Scr_AddString(text + 1);
|
||||
Game::Scr_NotifyLevel(Game::SL_GetString("say", 0), 2);
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
__declspec(naked) void Chat::PreSayStub()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
mov eax, [esp + 100h + 10h]
|
||||
|
||||
push eax
|
||||
pushad
|
||||
|
||||
push[esp + 100h + 28h]
|
||||
push eax
|
||||
call Chat::EvaluateSay
|
||||
add esp, 8h
|
||||
|
||||
mov[esp + 20h], eax
|
||||
popad
|
||||
pop eax
|
||||
|
||||
mov[esp + 100h + 10h], eax
|
||||
|
||||
jmp PlayerName::CleanStrStub
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(naked) void Chat::PostSayStub()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
// eax is used by the callee
|
||||
push eax
|
||||
|
||||
xor eax, eax
|
||||
mov al, Chat::SendChat
|
||||
|
||||
test al, al
|
||||
jnz return
|
||||
|
||||
// Don't send the chat
|
||||
pop eax
|
||||
retn
|
||||
|
||||
return:
|
||||
pop eax
|
||||
|
||||
// Jump to the target
|
||||
push 5DF620h
|
||||
retn
|
||||
}
|
||||
}
|
||||
|
||||
Chat::Chat()
|
||||
{
|
||||
// Intercept chat sending
|
||||
Utils::Hook(0x4D000B, PreSayStub, HOOK_CALL).install()->quick();
|
||||
Utils::Hook(0x4D00D4, PostSayStub, HOOK_CALL).install()->quick();
|
||||
Utils::Hook(0x4D0110, PostSayStub, HOOK_CALL).install()->quick();
|
||||
}
|
||||
}
|
18
src/Components/Modules/Chat.hpp
Normal file
18
src/Components/Modules/Chat.hpp
Normal file
@ -0,0 +1,18 @@
|
||||
#pragma once
|
||||
|
||||
namespace Components
|
||||
{
|
||||
class Chat : public Component
|
||||
{
|
||||
public:
|
||||
Chat();
|
||||
|
||||
private:
|
||||
static bool SendChat;
|
||||
|
||||
static const char* EvaluateSay(char* text, Game::gentity_t* player);
|
||||
|
||||
static void PreSayStub();
|
||||
static void PostSayStub();
|
||||
};
|
||||
}
|
@ -4,8 +4,6 @@ namespace Components
|
||||
{
|
||||
SteamID Dedicated::PlayerGuids[18][2];
|
||||
|
||||
bool Dedicated::SendChat;
|
||||
|
||||
bool Dedicated::IsEnabled()
|
||||
{
|
||||
static std::optional<bool> flag;
|
||||
@ -76,76 +74,6 @@ namespace Components
|
||||
}
|
||||
}
|
||||
|
||||
const char* Dedicated::EvaluateSay(char* text, Game::gentity_t* player)
|
||||
{
|
||||
Dedicated::SendChat = true;
|
||||
|
||||
if (text[1] == '/')
|
||||
{
|
||||
Dedicated::SendChat = false;
|
||||
text[1] = text[0];
|
||||
++text;
|
||||
}
|
||||
|
||||
TextRenderer::StripMaterialTextIcons(text, text, strlen(text) + 1);
|
||||
|
||||
Game::Scr_AddEntity(player);
|
||||
Game::Scr_AddString(text + 1);
|
||||
Game::Scr_NotifyLevel(Game::SL_GetString("say", 0), 2);
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
__declspec(naked) void Dedicated::PreSayStub()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
mov eax, [esp + 100h + 10h]
|
||||
|
||||
push eax
|
||||
pushad
|
||||
|
||||
push [esp + 100h + 28h]
|
||||
push eax
|
||||
call Dedicated::EvaluateSay
|
||||
add esp, 8h
|
||||
|
||||
mov [esp + 20h], eax
|
||||
popad
|
||||
pop eax
|
||||
|
||||
mov [esp + 100h + 10h], eax
|
||||
|
||||
jmp PlayerName::CleanStrStub
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(naked) void Dedicated::PostSayStub()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
// eax is used by the callee
|
||||
push eax
|
||||
|
||||
xor eax, eax
|
||||
mov al, Dedicated::SendChat
|
||||
|
||||
test al, al
|
||||
jnz return
|
||||
|
||||
// Don't send the chat
|
||||
pop eax
|
||||
retn
|
||||
|
||||
return:
|
||||
pop eax
|
||||
|
||||
// Jump to the target
|
||||
push 5DF620h
|
||||
retn
|
||||
}
|
||||
}
|
||||
|
||||
void Dedicated::TransmitGuids()
|
||||
{
|
||||
std::string list = Utils::String::VA("%c", 20);
|
||||
@ -306,11 +234,6 @@ namespace Components
|
||||
Dvar::Register<bool>("sv_dontrotate", false, Game::dvar_flag::DVAR_FLAG_CHEAT, "");
|
||||
Dvar::Register<bool>("com_logFilter", true, Game::dvar_flag::DVAR_FLAG_LATCHED, "Removes ~95% of unneeded lines from the log");
|
||||
|
||||
// Intercept chat sending
|
||||
Utils::Hook(0x4D000B, Dedicated::PreSayStub, HOOK_CALL).install()->quick();
|
||||
Utils::Hook(0x4D00D4, Dedicated::PostSayStub, HOOK_CALL).install()->quick();
|
||||
Utils::Hook(0x4D0110, Dedicated::PostSayStub, HOOK_CALL).install()->quick();
|
||||
|
||||
if (Dedicated::IsEnabled() || ZoneBuilder::IsEnabled())
|
||||
{
|
||||
// Make sure all callbacks are handled
|
||||
|
@ -15,19 +15,12 @@ namespace Components
|
||||
static void Heartbeat();
|
||||
|
||||
private:
|
||||
static bool SendChat;
|
||||
|
||||
static void MapRotate();
|
||||
static void InitDedicatedServer();
|
||||
|
||||
static void PostInitialization();
|
||||
static void PostInitializationStub();
|
||||
|
||||
static const char* EvaluateSay(char* text, Game::gentity_t* player);
|
||||
|
||||
static void PreSayStub();
|
||||
static void PostSayStub();
|
||||
|
||||
static void FrameStub();
|
||||
|
||||
static void TransmitGuids();
|
||||
|
Loading…
Reference in New Issue
Block a user