mirror of
https://github.com/diamante0018/BlackOpsPlugin.git
synced 2025-04-20 18:35:42 +00:00
mute/unmute chat
This commit is contained in:
parent
079f75c434
commit
7ca0ab528e
@ -1,11 +1,60 @@
|
|||||||
#include <stdinc.hpp>
|
#include <stdinc.hpp>
|
||||||
|
|
||||||
#include "loader/component_loader.hpp"
|
#include "loader/component_loader.hpp"
|
||||||
|
#include "utils/string.hpp"
|
||||||
|
|
||||||
#include "command.hpp"
|
#include "command.hpp"
|
||||||
|
|
||||||
namespace chat
|
namespace chat
|
||||||
{
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
std::unordered_set<std::uint64_t> mute_list{};
|
||||||
|
|
||||||
|
void mute_player(const game::client_s* cl)
|
||||||
|
{
|
||||||
|
if (mute_list.contains(cl->xuid))
|
||||||
|
{
|
||||||
|
game::SV_GameSendServerCommand(-1, game::SV_CMD_CAN_IGNORE,
|
||||||
|
utils::string::va("%c \"%s is already muted\"", 0x65, cl->name));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mute_list.insert(cl->xuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
void unmute_player(const game::client_s* cl)
|
||||||
|
{
|
||||||
|
mute_list.erase(cl->xuid);
|
||||||
|
|
||||||
|
game::SV_GameSendServerCommand(cl->gentity->entnum, game::SV_CMD_CAN_IGNORE,
|
||||||
|
utils::string::va("%c \"You were unmuted\"", 0x65));
|
||||||
|
}
|
||||||
|
|
||||||
|
void client_command(int clientNumber)
|
||||||
|
{
|
||||||
|
char buf[1024] = {0};
|
||||||
|
|
||||||
|
if (game::g_entities[clientNumber].client == nullptr)
|
||||||
|
{
|
||||||
|
// Not in game
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
game::SV_Cmd_ArgvBuffer(0, buf, sizeof(buf));
|
||||||
|
|
||||||
|
if (utils::string::starts_with(buf, "say") &&
|
||||||
|
mute_list.contains(game::svs_clients[clientNumber].xuid))
|
||||||
|
{
|
||||||
|
game::SV_GameSendServerCommand(clientNumber, game::SV_CMD_CAN_IGNORE,
|
||||||
|
utils::string::va("%c \"You are muted\"", 0x65));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
game::ClientCommand(clientNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class component final : public component_interface
|
class component final : public component_interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -14,6 +63,10 @@ namespace chat
|
|||||||
add_chat_commands();
|
add_chat_commands();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pre_destroy() override
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void add_chat_commands()
|
static void add_chat_commands()
|
||||||
{
|
{
|
||||||
@ -40,6 +93,50 @@ namespace chat
|
|||||||
const auto message = params.join(2);
|
const auto message = params.join(2);
|
||||||
game::G_Say(gentity, nullptr, 0, message.data());
|
game::G_Say(gentity, nullptr, 0, message.data());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
command::add("mutePlayer", [](const command::params& params)
|
||||||
|
{
|
||||||
|
if (params.size() < 2)
|
||||||
|
{
|
||||||
|
game::Com_Printf(game::CON_CHANNEL_DONT_FILTER,
|
||||||
|
"Usage: mutePlayer <client number>\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto* client = game::SV_GetPlayerByNum();
|
||||||
|
|
||||||
|
if (client == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
assert(client->gentity != nullptr);
|
||||||
|
|
||||||
|
if (client->gentity->client == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mute_player(client);
|
||||||
|
});
|
||||||
|
|
||||||
|
command::add("unmutePlayer", [](const command::params& params)
|
||||||
|
{
|
||||||
|
if (params.size() < 2)
|
||||||
|
{
|
||||||
|
game::Com_Printf(game::CON_CHANNEL_DONT_FILTER,
|
||||||
|
"Usage: unmutePlayer <client number>\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto* client = game::SV_GetPlayerByNum();
|
||||||
|
|
||||||
|
if (client == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
assert(client->gentity != nullptr);
|
||||||
|
|
||||||
|
if (client->gentity->client == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
unmute_player(client);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -533,20 +533,26 @@ namespace game
|
|||||||
struct client_s
|
struct client_s
|
||||||
{
|
{
|
||||||
clientHeader_t header;
|
clientHeader_t header;
|
||||||
const char* dropReason;
|
const char* dropReason; // 1812
|
||||||
char userinfo[1024];
|
char userinfo[1024]; // 1816
|
||||||
char reliableCommandBuffer[16384];
|
char reliableCommandBuffer[16384]; // 2840
|
||||||
int reliableCommandBufferNext;
|
int reliableCommandBufferNext; // 19224
|
||||||
svscmd_info_t reliableCommandInfo[128];
|
svscmd_info_t reliableCommandInfo[128]; // 19228
|
||||||
int reliableSequence;
|
int reliableSequence; // 20764
|
||||||
int reliableAcknowledge;
|
int reliableAcknowledge; // 20768
|
||||||
int reliableSent;
|
int reliableSent; // 20772
|
||||||
int messageAcknowledge;
|
int messageAcknowledge; // 20776
|
||||||
int gamestateMessageNum;
|
int gamestateMessageNum; // 20780
|
||||||
int challenge;
|
int challenge; // 20784
|
||||||
usercmd_s lastUsercmd;
|
usercmd_s lastUsercmd; // 20788
|
||||||
int lastClientCommand;
|
int lastClientCommand; // 20840
|
||||||
char lastClientCommandString[1024];
|
char lastClientCommandString[1024]; // 20844
|
||||||
gentity_s* gentity;
|
gentity_s* gentity; // 21868
|
||||||
|
char name[32]; // 21872
|
||||||
|
char clanAbbrev[5]; // 21904
|
||||||
|
unsigned __int64 xuid; // 21912
|
||||||
|
unsigned char __pad0[0x76D48];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static_assert(sizeof(client_s) == 0x7C2E8);
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,8 @@ namespace game
|
|||||||
WEAK symbol<void(LocalClientNum_t, int controllerIndex, const char* text)> Cmd_ExecuteSingleCommand{0x50B470, 0x0};
|
WEAK symbol<void(LocalClientNum_t, int controllerIndex, const char* text)> Cmd_ExecuteSingleCommand{0x50B470, 0x0};
|
||||||
|
|
||||||
WEAK symbol<void(client_s*, svscmd_type, const char*, ...)> SV_SendServerCommand{0x588B10, 0x0};
|
WEAK symbol<void(client_s*, svscmd_type, const char*, ...)> SV_SendServerCommand{0x588B10, 0x0};
|
||||||
|
WEAK symbol<void(int, svscmd_type, const char*)> SV_GameSendServerCommand{0x6B8730, 0x0};
|
||||||
|
WEAK symbol<void(int, char*, int)> SV_Cmd_ArgvBuffer{0x462CB0, 0x0};
|
||||||
WEAK symbol<void(client_s*, const char*)> SV_DelayDropClient{0x4A8DC0, 0x0};
|
WEAK symbol<void(client_s*, const char*)> SV_DelayDropClient{0x4A8DC0, 0x0};
|
||||||
WEAK symbol<client_s*()> SV_GetPlayerByName{0x875180, 0x0};
|
WEAK symbol<client_s*()> SV_GetPlayerByName{0x875180, 0x0};
|
||||||
WEAK symbol<client_s*()> SV_GetPlayerByNum{0x875260, 0x0};
|
WEAK symbol<client_s*()> SV_GetPlayerByNum{0x875260, 0x0};
|
||||||
@ -33,6 +35,7 @@ namespace game
|
|||||||
WEAK symbol<char*(char*)> I_CleanStr{0x4B0700, 0x0};
|
WEAK symbol<char*(char*)> I_CleanStr{0x4B0700, 0x0};
|
||||||
|
|
||||||
WEAK symbol<char*(int)> ConcatArgs{0x5D5F10, 0x0};
|
WEAK symbol<char*(int)> ConcatArgs{0x5D5F10, 0x0};
|
||||||
|
WEAK symbol<void(int)> ClientCommand{0x63DB70, 0x0};
|
||||||
WEAK symbol<void(gentity_s*, gentity_s*, int, const char*)> G_Say{0x51BBD0, 0x0};
|
WEAK symbol<void(gentity_s*, gentity_s*, int, const char*)> G_Say{0x51BBD0, 0x0};
|
||||||
|
|
||||||
WEAK symbol<void(gentity_s*, unsigned __int16, unsigned int)> Scr_Notify{0x458D30, 0x0};
|
WEAK symbol<void(gentity_s*, unsigned __int16, unsigned int)> Scr_Notify{0x458D30, 0x0};
|
||||||
@ -44,6 +47,7 @@ namespace game
|
|||||||
WEAK symbol<CmdArgs> cmd_args{0x355BD88, 0x0};
|
WEAK symbol<CmdArgs> cmd_args{0x355BD88, 0x0};
|
||||||
WEAK symbol<int> dvarCount{0x385BE74, 0x0};
|
WEAK symbol<int> dvarCount{0x385BE74, 0x0};
|
||||||
WEAK symbol<dvar_t*> sortedDvars{0x385BE88, 0x0};
|
WEAK symbol<dvar_t*> sortedDvars{0x385BE88, 0x0};
|
||||||
WEAK symbol<gentity_s> g_entities{0x32E5784, 0x0};
|
WEAK symbol<client_s> svs_clients{0x372D11C, 0x0};
|
||||||
|
WEAK symbol<gentity_s> g_entities{0x32E5640, 0x0};
|
||||||
WEAK symbol<int> level_time{0x3443F4C, 0x0};
|
WEAK symbol<int> level_time{0x3443F4C, 0x0};
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user