ferret99gt@1475: /** ferret99gt@1475: * vim: set ts=4 : ferret99gt@1475: * ============================================================================= ferret99gt@1475: * SourceMod Communication Plugin ferret99gt@1475: * Provides fucntionality for controlling communication on the server ferret99gt@1475: * ds@1947: * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. ferret99gt@1475: * ============================================================================= ferret99gt@1475: * ferret99gt@1475: * This program is free software; you can redistribute it and/or modify it under ferret99gt@1475: * the terms of the GNU General Public License, version 3.0, as published by the ferret99gt@1475: * Free Software Foundation. dvander@1627: * 1 ferret99gt@1475: * This program is distributed in the hope that it will be useful, but WITHOUT ferret99gt@1475: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ferret99gt@1475: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ferret99gt@1475: * details. ferret99gt@1475: * ferret99gt@1475: * You should have received a copy of the GNU General Public License along with ferret99gt@1475: * this program. If not, see . ferret99gt@1475: * ferret99gt@1475: * As a special exception, AlliedModders LLC gives you permission to link the ferret99gt@1475: * code of this program (as well as its derivative works) to "Half-Life 2," the ferret99gt@1475: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software ferret99gt@1475: * by the Valve Corporation. You must obey the GNU General Public License in ferret99gt@1475: * all respects for all other code used. Additionally, AlliedModders LLC grants ferret99gt@1475: * this exception to all derivative works. AlliedModders LLC defines further ferret99gt@1475: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), ferret99gt@1475: * or . ferret99gt@1475: * ferret99gt@1475: * Version: $Id$ ferret99gt@1475: */ ferret99gt@1475: ferret99gt@1475: #include ferret99gt@1475: #include pred@1536: #undef REQUIRE_PLUGIN pred@1536: #include ferret99gt@1475: ferret99gt@1475: #pragma semicolon 1 ferret99gt@1475: ferret99gt@1475: public Plugin:myinfo = ferret99gt@1475: { ferret99gt@1475: name = "Basic Comm Control", ferret99gt@1475: author = "AlliedModders LLC", dvander@2872: description = "Provides methods of controlling communication.", ferret99gt@1475: version = SOURCEMOD_VERSION, ferret99gt@1475: url = "http://www.sourcemod.net/" ferret99gt@1475: }; ferret99gt@1475: ferret99gt@1475: new bool:g_Muted[MAXPLAYERS+1]; // Is the player muted? ferret99gt@1475: new bool:g_Gagged[MAXPLAYERS+1]; // Is the player gagged? ferret99gt@1475: ferret99gt@1475: new Handle:g_Cvar_Deadtalk = INVALID_HANDLE; // Holds the handle for sm_deadtalk ferret99gt@1475: new Handle:g_Cvar_Alltalk = INVALID_HANDLE; // Holds the handle for sv_alltalk ferret99gt@1475: new bool:g_Hooked = false; // Tracks if we've hooked events for deadtalk ferret99gt@1475: pred@1536: new Handle:hTopMenu = INVALID_HANDLE; pred@1536: pred@1536: new g_GagTarget[MAXPLAYERS+1]; pred@1536: pred@1536: #include "basecomm/gag.sp" skamonkey@3340: #include "basecomm/natives.sp" drifter01620@3645: #include "basecomm/forwards.sp" skamonkey@3340: skamonkey@3340: public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max) skamonkey@3340: { skamonkey@3340: CreateNative("BaseComm_IsClientGagged", Native_IsClientGagged); skamonkey@3340: CreateNative("BaseComm_IsClientMuted", Native_IsClientMuted); skamonkey@3340: CreateNative("BaseComm_SetClientGag", Native_SetClientGag); skamonkey@3340: CreateNative("BaseComm_SetClientMute", Native_SetClientMute); skamonkey@3431: RegPluginLibrary("basecomm"); skamonkey@3340: skamonkey@3340: return APLRes_Success; skamonkey@3340: } pred@1536: ferret99gt@1475: public OnPluginStart() ferret99gt@1475: { ferret99gt@1475: LoadTranslations("common.phrases"); ferret99gt@1475: LoadTranslations("basecomm.phrases"); ferret99gt@1475: ferret99gt@1475: g_Cvar_Deadtalk = CreateConVar("sm_deadtalk", "0", "Controls how dead communicate. 0 - Off. 1 - Dead players ignore teams. 2 - Dead players talk to living teammates.", 0, true, 0.0, true, 2.0); ferret99gt@1475: g_Cvar_Alltalk = FindConVar("sv_alltalk"); ferret99gt@1475: ferret99gt@1475: RegAdminCmd("sm_mute", Command_Mute, ADMFLAG_CHAT, "sm_mute - Removes a player's ability to use voice."); ferret99gt@1475: RegAdminCmd("sm_gag", Command_Gag, ADMFLAG_CHAT, "sm_gag - Removes a player's ability to use chat."); ferret99gt@1475: RegAdminCmd("sm_silence", Command_Silence, ADMFLAG_CHAT, "sm_silence - Removes a player's ability to use voice or chat."); ferret99gt@1475: ferret99gt@1475: RegAdminCmd("sm_unmute", Command_Unmute, ADMFLAG_CHAT, "sm_unmute - Restores a player's ability to use voice."); ferret99gt@1475: RegAdminCmd("sm_ungag", Command_Ungag, ADMFLAG_CHAT, "sm_ungag - Restores a player's ability to use chat."); ferret99gt@1475: RegAdminCmd("sm_unsilence", Command_Unsilence, ADMFLAG_CHAT, "sm_unsilence - Restores a player's ability to use voice and chat."); ferret99gt@1475: ferret99gt@1475: HookConVarChange(g_Cvar_Deadtalk, ConVarChange_Deadtalk); dvander@1660: HookConVarChange(g_Cvar_Alltalk, ConVarChange_Alltalk); pred@1536: pred@1536: /* Account for late loading */ pred@1536: new Handle:topmenu; pred@1536: if (LibraryExists("adminmenu") && ((topmenu = GetAdminTopMenu()) != INVALID_HANDLE)) pred@1536: { pred@1536: OnAdminMenuReady(topmenu); pred@1536: } pred@1536: } pred@1536: pred@1536: public OnAdminMenuReady(Handle:topmenu) pred@1536: { pred@1536: /* Block us from being called twice */ pred@1536: if (topmenu == hTopMenu) pred@1536: { pred@1536: return; pred@1536: } pred@1536: pred@1536: /* Save the Handle */ pred@1536: hTopMenu = topmenu; pred@1536: pred@1536: /* Build the "Player Commands" category */ pred@1536: new TopMenuObject:player_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_PLAYERCOMMANDS); pred@1536: pred@1536: if (player_commands != INVALID_TOPMENUOBJECT) pred@1536: { pred@1536: AddToTopMenu(hTopMenu, dvander@1600: "sm_gag", pred@1536: TopMenuObject_Item, pred@1536: AdminMenu_Gag, pred@1536: player_commands, pred@1536: "sm_gag", pred@1536: ADMFLAG_CHAT); pred@1536: } ferret99gt@1475: } ferret99gt@1475: ferret99gt@1475: public ConVarChange_Deadtalk(Handle:convar, const String:oldValue[], const String:newValue[]) ferret99gt@1475: { ferret99gt@1475: if (GetConVarInt(g_Cvar_Deadtalk)) ferret99gt@1475: { ferret99gt@1475: HookEvent("player_spawn", Event_PlayerSpawn, EventHookMode_Post); ferret99gt@1475: HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post); ferret99gt@1475: g_Hooked = true; ferret99gt@1475: } ferret99gt@1475: else if (g_Hooked) ferret99gt@1475: { ferret99gt@1475: UnhookEvent("player_spawn", Event_PlayerSpawn); ferret99gt@1475: UnhookEvent("player_death", Event_PlayerDeath); ferret99gt@1475: g_Hooked = false; ferret99gt@1475: } ferret99gt@1475: } ferret99gt@1475: ferret99gt@1475: ferret99gt@1475: public bool:OnClientConnect(client, String:rejectmsg[], maxlen) ferret99gt@1475: { ferret99gt@1475: g_Gagged[client] = false; ferret99gt@1475: g_Muted[client] = false; ferret99gt@1475: ferret99gt@1475: return true; ferret99gt@1475: } ferret99gt@1475: kyle@3974: public Action:OnClientSayCommand(client, const String:command[], const String:sArgs[]) ferret99gt@1475: { ferret99gt@1475: if (client) ferret99gt@1475: { ferret99gt@1475: if (g_Gagged[client]) ferret99gt@1475: { kyle@3974: return Plugin_Stop; ferret99gt@1475: } ferret99gt@1475: } ferret99gt@1475: ferret99gt@1475: return Plugin_Continue; ferret99gt@1475: } ferret99gt@1475: dvander@1660: public ConVarChange_Alltalk(Handle:convar, const String:oldValue[], const String:newValue[]) dvander@1660: { ferret99gt@1818: new mode = GetConVarInt(g_Cvar_Deadtalk); dvander@1660: skamonkey@2920: for (new i = 1; i <= MaxClients; i++) dvander@1660: { dvander@1660: if (!IsClientInGame(i)) dvander@1660: { dvander@1660: continue; dvander@1660: } dvander@1660: ferret99gt@1818: if (g_Muted[i]) dvander@1660: { ferret99gt@1818: SetClientListeningFlags(i, VOICE_MUTED); ferret99gt@1818: } ferret99gt@1818: else if (GetConVarBool(g_Cvar_Alltalk)) ferret99gt@1818: { ferret99gt@1818: SetClientListeningFlags(i, VOICE_NORMAL); dvander@1660: } zach@3095: else if (!IsPlayerAlive(i)) dvander@1660: { ferret99gt@1818: if (mode == 1) dvander@1660: { dvander@1660: SetClientListeningFlags(i, VOICE_LISTENALL); dvander@1660: } ferret99gt@1818: else if (mode == 2) dvander@1660: { dvander@1660: SetClientListeningFlags(i, VOICE_TEAM); dvander@1660: } dvander@1660: } dvander@1660: } dvander@1660: } dvander@1660: ferret99gt@1475: public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) ferret99gt@1475: { ferret99gt@1475: new client = GetClientOfUserId(GetEventInt(event, "userid")); ferret99gt@1475: pred@2355: if (!client) pred@2355: { pred@2355: return; pred@2355: } pred@2355: ferret99gt@1475: if (g_Muted[client]) ferret99gt@1475: { ferret99gt@1475: SetClientListeningFlags(client, VOICE_MUTED); ferret99gt@1475: } ferret99gt@1475: else ferret99gt@1475: { ferret99gt@1475: SetClientListeningFlags(client, VOICE_NORMAL); ferret99gt@1475: } ferret99gt@1475: } ferret99gt@1475: ferret99gt@1475: public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) ferret99gt@1475: { ferret99gt@1475: new client = GetClientOfUserId(GetEventInt(event, "userid")); ferret99gt@1475: pred@2355: if (!client) pred@2355: { pred@2355: return; pred@2355: } pred@2355: ferret99gt@1475: if (g_Muted[client]) ferret99gt@1475: { ferret99gt@1475: SetClientListeningFlags(client, VOICE_MUTED); ferret99gt@1475: return; ferret99gt@1475: } ferret99gt@1475: ferret99gt@1475: if (GetConVarBool(g_Cvar_Alltalk)) ferret99gt@1475: { ferret99gt@1475: SetClientListeningFlags(client, VOICE_NORMAL); ferret99gt@1475: return; ferret99gt@1475: } ferret99gt@1475: ferret99gt@1818: new mode = GetConVarInt(g_Cvar_Deadtalk); ferret99gt@1818: if (mode == 1) ferret99gt@1475: { ferret99gt@1475: SetClientListeningFlags(client, VOICE_LISTENALL); ferret99gt@1475: } ferret99gt@1818: else if (mode == 2) ferret99gt@1475: { ferret99gt@1475: SetClientListeningFlags(client, VOICE_TEAM); ferret99gt@1475: } dvander@1600: }