Unfortunately no.
I will add your feature request to gag 4 spec later on.
In the mean time, here is a temporary solution.
Not tested, but it should work alright. sm_mutespecs to mute spectators.
Meaning that they won't be able to talk to the teams, but they can still talk to all in spectator. They can still hear what the teams say.
Of course this plugin "ruins" a normal game if sv_alltalk ain't on. Meaning that the teams can hear each other.
PHP Code:
#include <sourcemod>
#include <sdktools>
#define PLUGIN_VERSION "1.0.0"
#define TEAM_SPECTATOR 1
static bool: g_bIsMuteOn = false;
static const Float: UPDATE_DELAY = 0.3; // After a team change, use this delay to make sure voice updates corretly
public Plugin:myinfo =
{
name = "Mute Specs",
author = "Mr. Zero",
description = "A temporary solution for Inker and his loud mouthed spectators (yes you NeoIyse :p)",
version = PLUGIN_VERSION,
url = "http://forums.alliedmods.net/showthread.php?t=142755"
}
public OnPluginStart()
{
RegAdminCmd("sm_mutespecs", OnMuteSpecsCommand, ADMFLAG_CHAT, "Toggles mute on spectators", _, FCVAR_PLUGIN);
HookEvent("round_start", OnUpdateEventTemp, EventHookMode_PostNoCopy);
HookEvent("round_end", OnUpdateEventTemp, EventHookMode_PostNoCopy);
HookEvent("player_team", OnUpdateEventTemp, EventHookMode_PostNoCopy);
HookEvent("player_spawn", OnUpdateEvent, EventHookMode_PostNoCopy);
HookEvent("player_disconnect", OnUpdateEvent, EventHookMode_PostNoCopy);
HookEvent("player_death", OnUpdateEvent, EventHookMode_PostNoCopy);
HookEvent("player_bot_replace", OnUpdateEvent, EventHookMode_PostNoCopy);
HookEvent("bot_player_replace", OnUpdateEvent, EventHookMode_PostNoCopy);
HookEvent("defibrillator_used", OnUpdateEvent, EventHookMode_PostNoCopy);
}
public Action:OnMuteSpecsCommand(client, args)
{
new bool:wasOn = g_bIsMuteOn;
g_bIsMuteOn = !g_bIsMuteOn;
ShowActivity(client, "Toggled mute for spectators");
if (wasOn) RestoreListenOverrides();
return Plugin_Handled;
}
public OnUpdateEventTemp(Handle:event, const String:name[], bool:dontBroadcast)
{
CreateTimer(UPDATE_DELAY, UpdateListenOverrides_Timer);
}
public OnUpdateEvent(Handle:event, const String:name[], bool:dontBroadcast)
{
UpdateListenOverrides();
}
public Action:UpdateListenOverrides_Timer(Handle:timer)
{
UpdateListenOverrides();
return Plugin_Stop;
}
static UpdateListenOverrides()
{
if (!g_bIsMuteOn) return;
new bool:isReceiverSpec, bool:isSenderSpec;
for (new receiver = 1; receiver <= MaxClients; receiver++)
{
if (!IsClientInGame(receiver) || IsFakeClient(receiver)) continue;
isReceiverSpec = (GetClientTeam(receiver) == TEAM_SPECTATOR);
for (new sender = 1; sender <= MaxClients; sender++)
{
if (receiver == sender || !IsClientInGame(sender) || IsFakeClient(sender)) continue;
isSenderSpec = (GetClientTeam(sender) == TEAM_SPECTATOR);
/* Listen tabel:
* Receiver / Sender | On Team | On Spec |
* On Team | Yes | No |
* On Spec | Yes | Yes |
*/
if (!isReceiverSpec && !isSenderSpec) // Receiver on team, Sender on team
{
SetListenOverride(receiver, sender, Listen_Yes);
}
else if (isReceiverSpec && !isSenderSpec) // Receiver on spec, Sender on team
{
SetListenOverride(receiver, sender, Listen_Yes);
}
else if (!isReceiverSpec && isSenderSpec) // Receiver on team, Sender on spec
{
SetListenOverride(receiver, sender, Listen_No);
}
else if (isReceiverSpec && isSenderSpec) // Receiver on spec, Sender on spec
{
SetListenOverride(receiver, sender, Listen_Yes);
}
}
}
}
static RestoreListenOverrides()
{
for (new receiver = 1; receiver <= MaxClients; receiver++)
{
if (!IsClientInGame(receiver) || IsFakeClient(receiver)) continue;
for (new sender = 1; sender <= MaxClients; sender++)
{
if (receiver == sender || !IsClientInGame(sender) || IsFakeClient(sender)) continue;
SetListenOverride(receiver, sender, Listen_Default);
}
}
}