plugins/basecomm.sp
author Nicholas Hastings <skamonkey@gmail.com>
Wed Jan 23 11:14:51 2013 -0500 (2013-01-23)
changeset 3751 cd8b8f356da2
parent 3645 80c9ae186971
child 3974 9b3779f472d4
permissions -rw-r--r--
Fixed native error when using PbReadRepeated* natives for index 0 (bug 5579).
ferret99gt@1475
     1
/**
ferret99gt@1475
     2
 * vim: set ts=4 :
ferret99gt@1475
     3
 * =============================================================================
ferret99gt@1475
     4
 * SourceMod Communication Plugin
ferret99gt@1475
     5
 * Provides fucntionality for controlling communication on the server
ferret99gt@1475
     6
 *
ds@1947
     7
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
ferret99gt@1475
     8
 * =============================================================================
ferret99gt@1475
     9
 *
ferret99gt@1475
    10
 * This program is free software; you can redistribute it and/or modify it under
ferret99gt@1475
    11
 * the terms of the GNU General Public License, version 3.0, as published by the
ferret99gt@1475
    12
 * Free Software Foundation.
dvander@1627
    13
 * 1
ferret99gt@1475
    14
 * This program is distributed in the hope that it will be useful, but WITHOUT
ferret99gt@1475
    15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ferret99gt@1475
    16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ferret99gt@1475
    17
 * details.
ferret99gt@1475
    18
 *
ferret99gt@1475
    19
 * You should have received a copy of the GNU General Public License along with
ferret99gt@1475
    20
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ferret99gt@1475
    21
 *
ferret99gt@1475
    22
 * As a special exception, AlliedModders LLC gives you permission to link the
ferret99gt@1475
    23
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ferret99gt@1475
    24
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ferret99gt@1475
    25
 * by the Valve Corporation.  You must obey the GNU General Public License in
ferret99gt@1475
    26
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ferret99gt@1475
    27
 * this exception to all derivative works.  AlliedModders LLC defines further
ferret99gt@1475
    28
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ferret99gt@1475
    29
 * or <http://www.sourcemod.net/license.php>.
ferret99gt@1475
    30
 *
ferret99gt@1475
    31
 * Version: $Id$
ferret99gt@1475
    32
 */
ferret99gt@1475
    33
ferret99gt@1475
    34
#include <sourcemod>
ferret99gt@1475
    35
#include <sdktools>
pred@1536
    36
#undef REQUIRE_PLUGIN
pred@1536
    37
#include <adminmenu>
ferret99gt@1475
    38
ferret99gt@1475
    39
#pragma semicolon 1
ferret99gt@1475
    40
ferret99gt@1475
    41
public Plugin:myinfo =
ferret99gt@1475
    42
{
ferret99gt@1475
    43
	name = "Basic Comm Control",
ferret99gt@1475
    44
	author = "AlliedModders LLC",
dvander@2872
    45
	description = "Provides methods of controlling communication.",
ferret99gt@1475
    46
	version = SOURCEMOD_VERSION,
ferret99gt@1475
    47
	url = "http://www.sourcemod.net/"
ferret99gt@1475
    48
};
ferret99gt@1475
    49
ferret99gt@1475
    50
new bool:g_Muted[MAXPLAYERS+1];		// Is the player muted?
ferret99gt@1475
    51
new bool:g_Gagged[MAXPLAYERS+1];	// Is the player gagged?
ferret99gt@1475
    52
ferret99gt@1475
    53
new Handle:g_Cvar_Deadtalk = INVALID_HANDLE;	// Holds the handle for sm_deadtalk
ferret99gt@1475
    54
new Handle:g_Cvar_Alltalk = INVALID_HANDLE;	// Holds the handle for sv_alltalk
ferret99gt@1475
    55
new bool:g_Hooked = false;			// Tracks if we've hooked events for deadtalk
ferret99gt@1475
    56
pred@1536
    57
new Handle:hTopMenu = INVALID_HANDLE;
pred@1536
    58
pred@1536
    59
new g_GagTarget[MAXPLAYERS+1];
pred@1536
    60
pred@1536
    61
#include "basecomm/gag.sp"
skamonkey@3340
    62
#include "basecomm/natives.sp"
drifter01620@3645
    63
#include "basecomm/forwards.sp"
skamonkey@3340
    64
skamonkey@3340
    65
public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
skamonkey@3340
    66
{
skamonkey@3340
    67
	CreateNative("BaseComm_IsClientGagged", Native_IsClientGagged);
skamonkey@3340
    68
	CreateNative("BaseComm_IsClientMuted",  Native_IsClientMuted);
skamonkey@3340
    69
	CreateNative("BaseComm_SetClientGag",   Native_SetClientGag);
skamonkey@3340
    70
	CreateNative("BaseComm_SetClientMute",  Native_SetClientMute);
skamonkey@3431
    71
	RegPluginLibrary("basecomm");
skamonkey@3340
    72
	
skamonkey@3340
    73
	return APLRes_Success;
skamonkey@3340
    74
}
pred@1536
    75
ferret99gt@1475
    76
public OnPluginStart()
ferret99gt@1475
    77
{
ferret99gt@1475
    78
	LoadTranslations("common.phrases");
ferret99gt@1475
    79
	LoadTranslations("basecomm.phrases");
ferret99gt@1475
    80
	
ferret99gt@1475
    81
	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
    82
	g_Cvar_Alltalk = FindConVar("sv_alltalk");
ferret99gt@1475
    83
	
skamonkey@3329
    84
	AddCommandListener(Command_Say, "say");
skamonkey@3329
    85
	AddCommandListener(Command_Say, "say_team");
ferret99gt@1475
    86
	
ferret99gt@1475
    87
	RegAdminCmd("sm_mute", Command_Mute, ADMFLAG_CHAT, "sm_mute <player> - Removes a player's ability to use voice.");
ferret99gt@1475
    88
	RegAdminCmd("sm_gag", Command_Gag, ADMFLAG_CHAT, "sm_gag <player> - Removes a player's ability to use chat.");
ferret99gt@1475
    89
	RegAdminCmd("sm_silence", Command_Silence, ADMFLAG_CHAT, "sm_silence <player> - Removes a player's ability to use voice or chat.");
ferret99gt@1475
    90
	
ferret99gt@1475
    91
	RegAdminCmd("sm_unmute", Command_Unmute, ADMFLAG_CHAT, "sm_unmute <player> - Restores a player's ability to use voice.");
ferret99gt@1475
    92
	RegAdminCmd("sm_ungag", Command_Ungag, ADMFLAG_CHAT, "sm_ungag <player> - Restores a player's ability to use chat.");
ferret99gt@1475
    93
	RegAdminCmd("sm_unsilence", Command_Unsilence, ADMFLAG_CHAT, "sm_unsilence <player> - Restores a player's ability to use voice and chat.");	
ferret99gt@1475
    94
	
ferret99gt@1475
    95
	HookConVarChange(g_Cvar_Deadtalk, ConVarChange_Deadtalk);
dvander@1660
    96
	HookConVarChange(g_Cvar_Alltalk, ConVarChange_Alltalk);
pred@1536
    97
	
pred@1536
    98
	/* Account for late loading */
pred@1536
    99
	new Handle:topmenu;
pred@1536
   100
	if (LibraryExists("adminmenu") && ((topmenu = GetAdminTopMenu()) != INVALID_HANDLE))
pred@1536
   101
	{
pred@1536
   102
		OnAdminMenuReady(topmenu);
pred@1536
   103
	}
pred@1536
   104
}
pred@1536
   105
pred@1536
   106
public OnAdminMenuReady(Handle:topmenu)
pred@1536
   107
{
pred@1536
   108
	/* Block us from being called twice */
pred@1536
   109
	if (topmenu == hTopMenu)
pred@1536
   110
	{
pred@1536
   111
		return;
pred@1536
   112
	}
pred@1536
   113
	
pred@1536
   114
	/* Save the Handle */
pred@1536
   115
	hTopMenu = topmenu;
pred@1536
   116
	
pred@1536
   117
	/* Build the "Player Commands" category */
pred@1536
   118
	new TopMenuObject:player_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_PLAYERCOMMANDS);
pred@1536
   119
	
pred@1536
   120
	if (player_commands != INVALID_TOPMENUOBJECT)
pred@1536
   121
	{
pred@1536
   122
		AddToTopMenu(hTopMenu, 
dvander@1600
   123
			"sm_gag",
pred@1536
   124
			TopMenuObject_Item,
pred@1536
   125
			AdminMenu_Gag,
pred@1536
   126
			player_commands,
pred@1536
   127
			"sm_gag",
pred@1536
   128
			ADMFLAG_CHAT);
pred@1536
   129
	}
ferret99gt@1475
   130
}
ferret99gt@1475
   131
ferret99gt@1475
   132
public ConVarChange_Deadtalk(Handle:convar, const String:oldValue[], const String:newValue[])
ferret99gt@1475
   133
{
ferret99gt@1475
   134
	if (GetConVarInt(g_Cvar_Deadtalk))
ferret99gt@1475
   135
	{
ferret99gt@1475
   136
		HookEvent("player_spawn", Event_PlayerSpawn, EventHookMode_Post);
ferret99gt@1475
   137
		HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post);
ferret99gt@1475
   138
		g_Hooked = true;
ferret99gt@1475
   139
	}
ferret99gt@1475
   140
	else if (g_Hooked)
ferret99gt@1475
   141
	{
ferret99gt@1475
   142
		UnhookEvent("player_spawn", Event_PlayerSpawn);
ferret99gt@1475
   143
		UnhookEvent("player_death", Event_PlayerDeath);		
ferret99gt@1475
   144
		g_Hooked = false;
ferret99gt@1475
   145
	}
ferret99gt@1475
   146
}
ferret99gt@1475
   147
ferret99gt@1475
   148
ferret99gt@1475
   149
public bool:OnClientConnect(client, String:rejectmsg[], maxlen)
ferret99gt@1475
   150
{
ferret99gt@1475
   151
	g_Gagged[client] = false;
ferret99gt@1475
   152
	g_Muted[client] = false;
ferret99gt@1475
   153
	
ferret99gt@1475
   154
	return true;
ferret99gt@1475
   155
}
ferret99gt@1475
   156
skamonkey@3329
   157
public Action:Command_Say(client, const String:command[], args)
ferret99gt@1475
   158
{
ferret99gt@1475
   159
	if (client)
ferret99gt@1475
   160
	{
ferret99gt@1475
   161
		if (g_Gagged[client])
ferret99gt@1475
   162
		{
ferret99gt@1475
   163
			return Plugin_Handled;		
ferret99gt@1475
   164
		}
ferret99gt@1475
   165
	}
ferret99gt@1475
   166
	
ferret99gt@1475
   167
	return Plugin_Continue;
ferret99gt@1475
   168
}
ferret99gt@1475
   169
dvander@1660
   170
public ConVarChange_Alltalk(Handle:convar, const String:oldValue[], const String:newValue[])
dvander@1660
   171
{
ferret99gt@1818
   172
	new mode = GetConVarInt(g_Cvar_Deadtalk);
dvander@1660
   173
	
skamonkey@2920
   174
	for (new i = 1; i <= MaxClients; i++)
dvander@1660
   175
	{
dvander@1660
   176
		if (!IsClientInGame(i))
dvander@1660
   177
		{
dvander@1660
   178
			continue;
dvander@1660
   179
		}
dvander@1660
   180
		
ferret99gt@1818
   181
		if (g_Muted[i])
dvander@1660
   182
		{
ferret99gt@1818
   183
			SetClientListeningFlags(i, VOICE_MUTED);
ferret99gt@1818
   184
		}
ferret99gt@1818
   185
		else if (GetConVarBool(g_Cvar_Alltalk))
ferret99gt@1818
   186
		{
ferret99gt@1818
   187
			SetClientListeningFlags(i, VOICE_NORMAL);
dvander@1660
   188
		}
zach@3095
   189
		else if (!IsPlayerAlive(i))
dvander@1660
   190
		{
ferret99gt@1818
   191
			if (mode == 1)
dvander@1660
   192
			{
dvander@1660
   193
				SetClientListeningFlags(i, VOICE_LISTENALL);
dvander@1660
   194
			}
ferret99gt@1818
   195
			else if (mode == 2)
dvander@1660
   196
			{
dvander@1660
   197
				SetClientListeningFlags(i, VOICE_TEAM);
dvander@1660
   198
			}
dvander@1660
   199
		}
dvander@1660
   200
	}
dvander@1660
   201
}
dvander@1660
   202
ferret99gt@1475
   203
public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
ferret99gt@1475
   204
{
ferret99gt@1475
   205
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
ferret99gt@1475
   206
	
pred@2355
   207
	if (!client)
pred@2355
   208
	{
pred@2355
   209
		return;	
pred@2355
   210
	}
pred@2355
   211
	
ferret99gt@1475
   212
	if (g_Muted[client])
ferret99gt@1475
   213
	{
ferret99gt@1475
   214
		SetClientListeningFlags(client, VOICE_MUTED);
ferret99gt@1475
   215
	}
ferret99gt@1475
   216
	else
ferret99gt@1475
   217
	{
ferret99gt@1475
   218
		SetClientListeningFlags(client, VOICE_NORMAL);
ferret99gt@1475
   219
	}
ferret99gt@1475
   220
}
ferret99gt@1475
   221
ferret99gt@1475
   222
public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
ferret99gt@1475
   223
{
ferret99gt@1475
   224
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
ferret99gt@1475
   225
	
pred@2355
   226
	if (!client)
pred@2355
   227
	{
pred@2355
   228
		return;	
pred@2355
   229
	}
pred@2355
   230
	
ferret99gt@1475
   231
	if (g_Muted[client])
ferret99gt@1475
   232
	{
ferret99gt@1475
   233
		SetClientListeningFlags(client, VOICE_MUTED);
ferret99gt@1475
   234
		return;
ferret99gt@1475
   235
	}
ferret99gt@1475
   236
	
ferret99gt@1475
   237
	if (GetConVarBool(g_Cvar_Alltalk))
ferret99gt@1475
   238
	{
ferret99gt@1475
   239
		SetClientListeningFlags(client, VOICE_NORMAL);
ferret99gt@1475
   240
		return;
ferret99gt@1475
   241
	}
ferret99gt@1475
   242
	
ferret99gt@1818
   243
	new mode = GetConVarInt(g_Cvar_Deadtalk);
ferret99gt@1818
   244
	if (mode == 1)
ferret99gt@1475
   245
	{
ferret99gt@1475
   246
		SetClientListeningFlags(client, VOICE_LISTENALL);
ferret99gt@1475
   247
	}
ferret99gt@1818
   248
	else if (mode == 2)
ferret99gt@1475
   249
	{
ferret99gt@1475
   250
		SetClientListeningFlags(client, VOICE_TEAM);
ferret99gt@1475
   251
	}
dvander@1600
   252
}