extensions/sdktools/voice.cpp
author Michael McKoy <ferret99gt@gmail.com>
Sun Sep 23 21:01:07 2007 +0000 (2007-09-23)
changeset 1468 b90faced4648
parent 1330 ab94316bb52b
child 1947 e73a1e51833b
permissions -rw-r--r--
Added VOICE_TEAM and VOICE_LISTENTEAM flags to the SDKTools voice functionality.
teame06@1245
     1
/**
teame06@1245
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
teame06@1245
     4
 * SourceMod SDKTools Extension
teame06@1245
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
teame06@1245
     7
 *
ds@1330
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    10
 * Free Software Foundation.
ferret99gt@1468
    11
 *
ds@1330
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    15
 * details.
teame06@1245
    16
 *
ds@1330
    17
 * You should have received a copy of the GNU General Public License along with
ds@1330
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
teame06@1245
    19
 *
ds@1330
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    27
 * or <http://www.sourcemod.net/license.php>.
teame06@1245
    28
 *
faluco@1247
    29
 * Version: $Id$
teame06@1245
    30
 */
teame06@1245
    31
teame06@1235
    32
#include <extension.h>
teame06@1235
    33
teame06@1235
    34
#define SPEAK_NORMAL		0
teame06@1235
    35
#define SPEAK_MUTED			1
teame06@1235
    36
#define SPEAK_ALL			2
teame06@1235
    37
#define SPEAK_LISTENALL		4
ferret99gt@1468
    38
#define SPEAK_TEAM			8
ferret99gt@1468
    39
#define SPEAK_LISTENTEAM	16
teame06@1235
    40
teame06@1235
    41
size_t g_VoiceFlags[65];
teame06@1235
    42
size_t g_VoiceFlagsCount = 0;
teame06@1235
    43
teame06@1235
    44
SH_DECL_HOOK3(IVoiceServer, SetClientListening, SH_NOATTRIB, 0, bool, int, int, bool);
teame06@1235
    45
teame06@1235
    46
bool SDKTools::OnSetClientListening(int iReceiver, int iSender, bool bListen)
teame06@1235
    47
{
ferret99gt@1468
    48
	if (g_VoiceFlags[iSender] & SPEAK_MUTED)
teame06@1235
    49
	{
teame06@1235
    50
		RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, bListen, &IVoiceServer::SetClientListening, (iReceiver, iSender, false));
teame06@1235
    51
	}
teame06@1235
    52
ferret99gt@1468
    53
	if ((g_VoiceFlags[iSender] & SPEAK_ALL) || (g_VoiceFlags[iReceiver] & SPEAK_LISTENALL))
teame06@1235
    54
	{
teame06@1235
    55
		RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, bListen, &IVoiceServer::SetClientListening, (iReceiver, iSender, true));
teame06@1235
    56
	}
teame06@1235
    57
ferret99gt@1468
    58
	if ((g_VoiceFlags[iSender] & SPEAK_TEAM) || (g_VoiceFlags[iReceiver] & SPEAK_LISTENTEAM))
teame06@1235
    59
	{
ferret99gt@1468
    60
		IGamePlayer *pReceiver = playerhelpers->GetGamePlayer(iReceiver);
ferret99gt@1468
    61
		IGamePlayer *pSender = playerhelpers->GetGamePlayer(iSender);
ferret99gt@1468
    62
ferret99gt@1468
    63
		if (pReceiver && pSender && pReceiver->IsInGame() && pSender->IsInGame())
ferret99gt@1468
    64
		{
ferret99gt@1468
    65
			IPlayerInfo *pRInfo = pReceiver->GetPlayerInfo();
ferret99gt@1468
    66
			IPlayerInfo *pSInfo = pSender->GetPlayerInfo();
ferret99gt@1468
    67
ferret99gt@1468
    68
			if (pRInfo && pSInfo && pRInfo->GetTeamIndex() == pSInfo->GetTeamIndex())
ferret99gt@1468
    69
			{
ferret99gt@1468
    70
				RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, bListen, &IVoiceServer::SetClientListening, (iReceiver, iSender, true));
ferret99gt@1468
    71
			}
ferret99gt@1468
    72
		}
teame06@1235
    73
	}
teame06@1235
    74
teame06@1235
    75
	RETURN_META_VALUE(MRES_IGNORED, bListen);
teame06@1235
    76
}
teame06@1235
    77
teame06@1235
    78
void SDKTools::OnClientDisconnecting(int client)
teame06@1235
    79
{
teame06@1235
    80
	if (g_VoiceFlags[client])
ferret99gt@1468
    81
	{
teame06@1235
    82
		g_VoiceFlags[client] = 0;
teame06@1235
    83
		if (!--g_VoiceFlagsCount)
teame06@1235
    84
		{
teame06@1235
    85
			SH_REMOVE_HOOK_MEMFUNC(IVoiceServer, SetClientListening, voiceserver, &g_SdkTools, &SDKTools::OnSetClientListening, false);
teame06@1235
    86
		}
teame06@1235
    87
	}
teame06@1235
    88
}
teame06@1235
    89
teame06@1235
    90
static cell_t SetClientListeningFlags(IPluginContext *pContext, const cell_t *params)
teame06@1235
    91
{
teame06@1235
    92
	IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
teame06@1235
    93
	if (player == NULL)
teame06@1235
    94
	{
teame06@1235
    95
		return pContext->ThrowNativeError("Client index %d is invalid", params[1]);
teame06@1235
    96
	} else if (!player->IsConnected()) {
teame06@1235
    97
		return pContext->ThrowNativeError("Client %d is not connected", params[1]);
teame06@1235
    98
	}
teame06@1235
    99
teame06@1235
   100
	if (!params[2] && g_VoiceFlags[params[1]])
teame06@1235
   101
	{
teame06@1235
   102
		if (!--g_VoiceFlagsCount)
teame06@1235
   103
		{
teame06@1235
   104
			SH_REMOVE_HOOK_MEMFUNC(IVoiceServer, SetClientListening, voiceserver, &g_SdkTools, &SDKTools::OnSetClientListening, false);
teame06@1235
   105
		}
teame06@1235
   106
	} else if (!g_VoiceFlags[params[1]] && params[2]) {
teame06@1235
   107
teame06@1235
   108
		if (!g_VoiceFlagsCount++)
teame06@1235
   109
		{
teame06@1235
   110
			SH_ADD_HOOK_MEMFUNC(IVoiceServer, SetClientListening, voiceserver, &g_SdkTools, &SDKTools::OnSetClientListening, false);
teame06@1235
   111
		}
teame06@1235
   112
	}
teame06@1235
   113
teame06@1235
   114
	g_VoiceFlags[params[1]] = params[2];
teame06@1235
   115
teame06@1235
   116
	return 1;
teame06@1235
   117
}
teame06@1235
   118
teame06@1235
   119
static cell_t GetClientListeningFlags(IPluginContext *pContext, const cell_t *params)
teame06@1235
   120
{
teame06@1235
   121
	IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
teame06@1235
   122
	if (player == NULL)
teame06@1235
   123
	{
teame06@1235
   124
		return pContext->ThrowNativeError("Client index %d is invalid", params[1]);
teame06@1235
   125
	} else if (!player->IsConnected()) {
teame06@1235
   126
		return pContext->ThrowNativeError("Client %d is not connected", params[1]);
teame06@1235
   127
	}
teame06@1235
   128
teame06@1235
   129
	return g_VoiceFlags[params[1]];
teame06@1235
   130
}
teame06@1235
   131
teame06@1235
   132
static cell_t SetClientListening(IPluginContext *pContext, const cell_t *params)
teame06@1235
   133
{
teame06@1235
   134
	IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
teame06@1235
   135
	if (player == NULL)
teame06@1235
   136
	{
teame06@1235
   137
		return pContext->ThrowNativeError("Client index %d is invalid", params[1]);
teame06@1235
   138
	} else if (!player->IsConnected()) {
teame06@1235
   139
		return pContext->ThrowNativeError("Client %d is not connected", params[1]);
teame06@1235
   140
	}
teame06@1235
   141
teame06@1235
   142
	bool bListen = !params[3] ? false : true;
teame06@1235
   143
teame06@1235
   144
	return voiceserver->SetClientListening(params[1], params[2], bListen) ? 1 : 0;
teame06@1235
   145
}
teame06@1235
   146
teame06@1235
   147
static cell_t GetClientListening(IPluginContext *pContext, const cell_t *params)
teame06@1235
   148
{
teame06@1235
   149
	IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
teame06@1235
   150
	if (player == NULL)
teame06@1235
   151
	{
teame06@1235
   152
		return pContext->ThrowNativeError("Client index %d is invalid", params[1]);
teame06@1235
   153
	} else if (!player->IsConnected()) {
teame06@1235
   154
		return pContext->ThrowNativeError("Client %d is not connected", params[1]);
teame06@1235
   155
	}
teame06@1235
   156
teame06@1235
   157
	return voiceserver->GetClientListening(params[1], params[2]) ? 1 : 0;
teame06@1235
   158
}
teame06@1235
   159
ferret99gt@1468
   160
sp_nativeinfo_t g_VoiceNatives[] =
teame06@1235
   161
{
teame06@1235
   162
	{"SetClientListeningFlags",		SetClientListeningFlags},
teame06@1235
   163
	{"GetClientListeningFlags",		GetClientListeningFlags},
teame06@1235
   164
	{"SetClientListening",			SetClientListening},
teame06@1235
   165
	{"GetClientListening",			GetClientListening},
teame06@1235
   166
	{NULL,							NULL},
teame06@1235
   167
};