extensions/sdktools/voice.cpp
author Phong Dang <teame06@gmail.com>
Wed Aug 01 04:17:36 2007 +0000 (2007-08-01)
changeset 1235 88bb46f9731e
child 1245 bb0611ab4bed
permissions -rw-r--r--
Implemented requested amb603. Added voice natives.
teame06@1235
     1
#include <extension.h>
teame06@1235
     2
teame06@1235
     3
#define SPEAK_NORMAL		0
teame06@1235
     4
#define SPEAK_MUTED			1
teame06@1235
     5
#define SPEAK_ALL			2
teame06@1235
     6
#define SPEAK_LISTENALL		4
teame06@1235
     7
teame06@1235
     8
size_t g_VoiceFlags[65];
teame06@1235
     9
size_t g_VoiceFlagsCount = 0;
teame06@1235
    10
teame06@1235
    11
SH_DECL_HOOK3(IVoiceServer, SetClientListening, SH_NOATTRIB, 0, bool, int, int, bool);
teame06@1235
    12
teame06@1235
    13
bool SDKTools::OnSetClientListening(int iReceiver, int iSender, bool bListen)
teame06@1235
    14
{
teame06@1235
    15
	if (g_VoiceFlags[iSender] & SPEAK_MUTED) 
teame06@1235
    16
	{
teame06@1235
    17
		RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, bListen, &IVoiceServer::SetClientListening, (iReceiver, iSender, false));
teame06@1235
    18
	}
teame06@1235
    19
teame06@1235
    20
	if (g_VoiceFlags[iSender] & SPEAK_ALL)
teame06@1235
    21
	{
teame06@1235
    22
		RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, bListen, &IVoiceServer::SetClientListening, (iReceiver, iSender, true));
teame06@1235
    23
	}
teame06@1235
    24
teame06@1235
    25
	if (g_VoiceFlags[iReceiver] & SPEAK_LISTENALL)
teame06@1235
    26
	{
teame06@1235
    27
		RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, bListen, &IVoiceServer::SetClientListening, (iReceiver, iSender, true));
teame06@1235
    28
	}
teame06@1235
    29
teame06@1235
    30
	RETURN_META_VALUE(MRES_IGNORED, bListen);
teame06@1235
    31
}
teame06@1235
    32
teame06@1235
    33
void SDKTools::OnClientDisconnecting(int client)
teame06@1235
    34
{
teame06@1235
    35
	if (g_VoiceFlags[client])
teame06@1235
    36
	{	
teame06@1235
    37
		g_VoiceFlags[client] = 0;
teame06@1235
    38
		if (!--g_VoiceFlagsCount)
teame06@1235
    39
		{
teame06@1235
    40
			SH_REMOVE_HOOK_MEMFUNC(IVoiceServer, SetClientListening, voiceserver, &g_SdkTools, &SDKTools::OnSetClientListening, false);
teame06@1235
    41
		}
teame06@1235
    42
	}
teame06@1235
    43
}
teame06@1235
    44
teame06@1235
    45
static cell_t SetClientListeningFlags(IPluginContext *pContext, const cell_t *params)
teame06@1235
    46
{
teame06@1235
    47
	IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
teame06@1235
    48
	if (player == NULL)
teame06@1235
    49
	{
teame06@1235
    50
		return pContext->ThrowNativeError("Client index %d is invalid", params[1]);
teame06@1235
    51
	} else if (!player->IsConnected()) {
teame06@1235
    52
		return pContext->ThrowNativeError("Client %d is not connected", params[1]);
teame06@1235
    53
	}
teame06@1235
    54
teame06@1235
    55
	if (!params[2] && g_VoiceFlags[params[1]])
teame06@1235
    56
	{
teame06@1235
    57
		if (!--g_VoiceFlagsCount)
teame06@1235
    58
		{
teame06@1235
    59
			SH_REMOVE_HOOK_MEMFUNC(IVoiceServer, SetClientListening, voiceserver, &g_SdkTools, &SDKTools::OnSetClientListening, false);
teame06@1235
    60
		}
teame06@1235
    61
	} else if (!g_VoiceFlags[params[1]] && params[2]) {
teame06@1235
    62
teame06@1235
    63
		if (!g_VoiceFlagsCount++)
teame06@1235
    64
		{
teame06@1235
    65
			SH_ADD_HOOK_MEMFUNC(IVoiceServer, SetClientListening, voiceserver, &g_SdkTools, &SDKTools::OnSetClientListening, false);
teame06@1235
    66
		}
teame06@1235
    67
	}
teame06@1235
    68
teame06@1235
    69
	g_VoiceFlags[params[1]] = params[2];
teame06@1235
    70
teame06@1235
    71
	return 1;
teame06@1235
    72
}
teame06@1235
    73
teame06@1235
    74
static cell_t GetClientListeningFlags(IPluginContext *pContext, const cell_t *params)
teame06@1235
    75
{
teame06@1235
    76
	IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
teame06@1235
    77
	if (player == NULL)
teame06@1235
    78
	{
teame06@1235
    79
		return pContext->ThrowNativeError("Client index %d is invalid", params[1]);
teame06@1235
    80
	} else if (!player->IsConnected()) {
teame06@1235
    81
		return pContext->ThrowNativeError("Client %d is not connected", params[1]);
teame06@1235
    82
	}
teame06@1235
    83
teame06@1235
    84
	return g_VoiceFlags[params[1]];
teame06@1235
    85
}
teame06@1235
    86
teame06@1235
    87
static cell_t SetClientListening(IPluginContext *pContext, const cell_t *params)
teame06@1235
    88
{
teame06@1235
    89
	IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
teame06@1235
    90
	if (player == NULL)
teame06@1235
    91
	{
teame06@1235
    92
		return pContext->ThrowNativeError("Client index %d is invalid", params[1]);
teame06@1235
    93
	} else if (!player->IsConnected()) {
teame06@1235
    94
		return pContext->ThrowNativeError("Client %d is not connected", params[1]);
teame06@1235
    95
	}
teame06@1235
    96
teame06@1235
    97
	bool bListen = !params[3] ? false : true;
teame06@1235
    98
teame06@1235
    99
	return voiceserver->SetClientListening(params[1], params[2], bListen) ? 1 : 0;
teame06@1235
   100
}
teame06@1235
   101
teame06@1235
   102
static cell_t GetClientListening(IPluginContext *pContext, const cell_t *params)
teame06@1235
   103
{
teame06@1235
   104
	IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
teame06@1235
   105
	if (player == NULL)
teame06@1235
   106
	{
teame06@1235
   107
		return pContext->ThrowNativeError("Client index %d is invalid", params[1]);
teame06@1235
   108
	} else if (!player->IsConnected()) {
teame06@1235
   109
		return pContext->ThrowNativeError("Client %d is not connected", params[1]);
teame06@1235
   110
	}
teame06@1235
   111
teame06@1235
   112
	return voiceserver->GetClientListening(params[1], params[2]) ? 1 : 0;
teame06@1235
   113
}
teame06@1235
   114
teame06@1235
   115
sp_nativeinfo_t g_VoiceNatives[] = 
teame06@1235
   116
{
teame06@1235
   117
	{"SetClientListeningFlags",		SetClientListeningFlags},
teame06@1235
   118
	{"GetClientListeningFlags",		GetClientListeningFlags},
teame06@1235
   119
	{"SetClientListening",			SetClientListening},
teame06@1235
   120
	{"GetClientListening",			GetClientListening},
teame06@1235
   121
	{NULL,							NULL},
teame06@1235
   122
};