Add API to set if player can hear another player (#467)

* Add API to set if player can hear another player
This commit is contained in:
fant1kua 2019-12-14 12:24:40 +02:00 committed by Dmitry Novikov
parent 19269aa450
commit 27b2a8c8c9
6 changed files with 72 additions and 5 deletions

View File

@ -1,3 +1,3 @@
majorVersion=5 majorVersion=5
minorVersion=12 minorVersion=13
maintenanceVersion=0 maintenanceVersion=0

View File

@ -806,9 +806,20 @@ class CCStrikeGameMgrHelper: public IVoiceGameMgrHelper
public: public:
virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pSender); virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pSender);
#ifdef REGAMEDLL_ADD
virtual void ResetCanHearPlayer(edict_t* pEdict);
virtual void SetCanHearPlayer(CBasePlayer* pListener, CBasePlayer* pSender, bool bCanHear);
virtual bool GetCanHearPlayer(CBasePlayer* pListener, CBasePlayer* pSender);
#endif
#ifdef REGAMEDLL_API #ifdef REGAMEDLL_API
bool CanPlayerHearPlayer_OrigFunc(CBasePlayer *pListener, CBasePlayer *pSender); bool CanPlayerHearPlayer_OrigFunc(CBasePlayer *pListener, CBasePlayer *pSender);
#endif #endif
public:
#ifdef REGAMEDLL_ADD
CBitVec<VOICE_MAX_PLAYERS> m_iCanHearMasks[VOICE_MAX_PLAYERS];
#endif
}; };
extern CGameRules DLLEXPORT *g_pGameRules; extern CGameRules DLLEXPORT *g_pGameRules;

View File

@ -89,6 +89,13 @@ LINK_HOOK_CLASS_CUSTOM_CHAIN(bool, CCStrikeGameMgrHelper, CSGameRules, CanPlayer
bool CCStrikeGameMgrHelper::__API_HOOK(CanPlayerHearPlayer)(CBasePlayer *pListener, CBasePlayer *pSender) bool CCStrikeGameMgrHelper::__API_HOOK(CanPlayerHearPlayer)(CBasePlayer *pListener, CBasePlayer *pSender)
{ {
#ifdef REGAMEDLL_ADD
if (!GetCanHearPlayer(pListener, pSender))
{
return false;
}
#endif
switch ((int)sv_alltalk.value) switch ((int)sv_alltalk.value)
{ {
case 1: // allows everyone to talk case 1: // allows everyone to talk
@ -125,6 +132,45 @@ bool CCStrikeGameMgrHelper::__API_HOOK(CanPlayerHearPlayer)(CBasePlayer *pListen
} }
} }
#ifdef REGAMEDLL_ADD
void CCStrikeGameMgrHelper::ResetCanHearPlayer(edict_t* pEdict)
{
int index = ENTINDEX(pEdict) - 1;
m_iCanHearMasks[index].Init(TRUE);
for (int iOtherClient = 0; iOtherClient < VOICE_MAX_PLAYERS; iOtherClient++)
{
if (index != iOtherClient) {
m_iCanHearMasks[iOtherClient][index] = TRUE;
}
}
}
void CCStrikeGameMgrHelper::SetCanHearPlayer(CBasePlayer* pListener, CBasePlayer* pSender, bool bCanHear)
{
if (!pListener->IsPlayer() || !pSender->IsPlayer())
{
return;
}
int listener = pListener->entindex() - 1;
int sender = pSender->entindex() - 1;
m_iCanHearMasks[listener][sender] = bCanHear ? TRUE : FALSE;
}
bool CCStrikeGameMgrHelper::GetCanHearPlayer(CBasePlayer* pListener, CBasePlayer* pSender)
{
if (!pListener->IsPlayer() || !pSender->IsPlayer())
{
return true;
}
int listener = pListener->entindex() - 1;
int sender = pSender->entindex() - 1;
return m_iCanHearMasks[listener][sender] == TRUE;
}
#endif
void Broadcast(const char *sentence) void Broadcast(const char *sentence)
{ {
char text[32]; char text[32];

View File

@ -91,9 +91,13 @@ void CVoiceGameMgr::ClientConnected(edict_t *pEdict)
int index = ENTINDEX(pEdict) - 1; int index = ENTINDEX(pEdict) - 1;
// Clear out everything we use for deltas on this guy. // Clear out everything we use for deltas on this guy.
g_bWantModEnable[index] = true; g_bWantModEnable[index] = TRUE;
g_SentGameRulesMasks[index].Init(0); g_SentGameRulesMasks[index].Init(0);
g_SentBanMasks[index].Init(0); g_SentBanMasks[index].Init(0);
#ifdef REGAMEDLL_ADD
m_pHelper->ResetCanHearPlayer(pEdict);
#endif
} }
// Called to determine if the Receiver has muted (blocked) the Sender // Called to determine if the Receiver has muted (blocked) the Sender
@ -149,7 +153,7 @@ bool CVoiceGameMgr::ClientCommand(CBasePlayer *pPlayer, const char *cmd)
VoiceServerDebug("CVoiceGameMgr::ClientCommand: VModEnable (%d)\n", !!Q_atoi(CMD_ARGV(1))); VoiceServerDebug("CVoiceGameMgr::ClientCommand: VModEnable (%d)\n", !!Q_atoi(CMD_ARGV(1)));
g_PlayerModEnable[playerClientIndex] = !!Q_atoi(CMD_ARGV(1)); g_PlayerModEnable[playerClientIndex] = !!Q_atoi(CMD_ARGV(1));
g_bWantModEnable[playerClientIndex] = false; g_bWantModEnable[playerClientIndex] = FALSE;
//UpdateMasks(); //UpdateMasks();
return true; return true;
} }
@ -187,9 +191,10 @@ void CVoiceGameMgr::UpdateMasks()
for (int iOtherClient = 0; iOtherClient < m_nMaxPlayers; iOtherClient++) for (int iOtherClient = 0; iOtherClient < m_nMaxPlayers; iOtherClient++)
{ {
CBasePlayer *pSender = UTIL_PlayerByIndex(iOtherClient + 1); CBasePlayer *pSender = UTIL_PlayerByIndex(iOtherClient + 1);
if (pSender && m_pHelper->CanPlayerHearPlayer(pPlayer, pSender)) if (pSender && m_pHelper->CanPlayerHearPlayer(pPlayer, pSender))
{ {
gameRulesMask[iOtherClient] = true; gameRulesMask[iOtherClient] = TRUE;
} }
} }
} }

View File

@ -41,6 +41,11 @@ public:
// Called each frame to determine which players are allowed to hear each other. This overrides // Called each frame to determine which players are allowed to hear each other. This overrides
// whatever squelch settings players have. // whatever squelch settings players have.
virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pTalker) = 0; virtual bool CanPlayerHearPlayer(CBasePlayer *pListener, CBasePlayer *pTalker) = 0;
#ifdef REGAMEDLL_ADD
virtual void ResetCanHearPlayer(edict_t* pEdict) = 0;
virtual void SetCanHearPlayer(CBasePlayer* pListener, CBasePlayer* pSender, bool bCanHear) = 0;
virtual bool GetCanHearPlayer(CBasePlayer* pListener, CBasePlayer* pSender) = 0;
#endif
}; };
// CVoiceGameMgr manages which clients can hear which other clients. // CVoiceGameMgr manages which clients can hear which other clients.

View File

@ -38,7 +38,7 @@
#include <API/CSInterfaces.h> #include <API/CSInterfaces.h>
#define REGAMEDLL_API_VERSION_MAJOR 5 #define REGAMEDLL_API_VERSION_MAJOR 5
#define REGAMEDLL_API_VERSION_MINOR 12 #define REGAMEDLL_API_VERSION_MINOR 13
// CBasePlayer::Spawn hook // CBasePlayer::Spawn hook
typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Spawn; typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Spawn;