plugins/basecomm.sp
author David Anderson <dvander@alliedmods.net>
Sat Dec 22 08:57:08 2007 +0000 (2007-12-22)
changeset 1813 372939c88bc7
parent 1660 85a79eaece9e
child 1818 1c712b03a024
permissions -rw-r--r--
fixed amb1305 by making OnClientPostAdminCheck() always occur after OnClientPutInServer(). this is now GUARANTEED. it was undefined before, however the usual case was opposite. if plugins were relying on this, they were written poorly and shouldn't have worked in the first place, especially with the threaded SQL plugin.
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
 *
ferret99gt@1475
     7
 * SourceMod (C)2004-2007 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",
ferret99gt@1475
    45
	description = "Provides methods of controllingg 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"
pred@1536
    62
ferret99gt@1475
    63
public OnPluginStart()
ferret99gt@1475
    64
{
ferret99gt@1475
    65
	LoadTranslations("common.phrases");
ferret99gt@1475
    66
	LoadTranslations("basecomm.phrases");
ferret99gt@1475
    67
	
ferret99gt@1475
    68
	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
    69
	g_Cvar_Alltalk = FindConVar("sv_alltalk");
ferret99gt@1475
    70
	
ferret99gt@1475
    71
	RegConsoleCmd("say", Command_Say);
ferret99gt@1475
    72
	RegConsoleCmd("say_team", Command_Say);
ferret99gt@1475
    73
	
ferret99gt@1475
    74
	RegAdminCmd("sm_mute", Command_Mute, ADMFLAG_CHAT, "sm_mute <player> - Removes a player's ability to use voice.");
ferret99gt@1475
    75
	RegAdminCmd("sm_gag", Command_Gag, ADMFLAG_CHAT, "sm_gag <player> - Removes a player's ability to use chat.");
ferret99gt@1475
    76
	RegAdminCmd("sm_silence", Command_Silence, ADMFLAG_CHAT, "sm_silence <player> - Removes a player's ability to use voice or chat.");
ferret99gt@1475
    77
	
ferret99gt@1475
    78
	RegAdminCmd("sm_unmute", Command_Unmute, ADMFLAG_CHAT, "sm_unmute <player> - Restores a player's ability to use voice.");
ferret99gt@1475
    79
	RegAdminCmd("sm_ungag", Command_Ungag, ADMFLAG_CHAT, "sm_ungag <player> - Restores a player's ability to use chat.");
ferret99gt@1475
    80
	RegAdminCmd("sm_unsilence", Command_Unsilence, ADMFLAG_CHAT, "sm_unsilence <player> - Restores a player's ability to use voice and chat.");	
ferret99gt@1475
    81
	
ferret99gt@1475
    82
	HookConVarChange(g_Cvar_Deadtalk, ConVarChange_Deadtalk);
dvander@1660
    83
	HookConVarChange(g_Cvar_Alltalk, ConVarChange_Alltalk);
pred@1536
    84
	
pred@1536
    85
	/* Account for late loading */
pred@1536
    86
	new Handle:topmenu;
pred@1536
    87
	if (LibraryExists("adminmenu") && ((topmenu = GetAdminTopMenu()) != INVALID_HANDLE))
pred@1536
    88
	{
pred@1536
    89
		OnAdminMenuReady(topmenu);
pred@1536
    90
	}
pred@1536
    91
}
pred@1536
    92
pred@1536
    93
public OnAdminMenuReady(Handle:topmenu)
pred@1536
    94
{
pred@1536
    95
	/* Block us from being called twice */
pred@1536
    96
	if (topmenu == hTopMenu)
pred@1536
    97
	{
pred@1536
    98
		return;
pred@1536
    99
	}
pred@1536
   100
	
pred@1536
   101
	/* Save the Handle */
pred@1536
   102
	hTopMenu = topmenu;
pred@1536
   103
	
pred@1536
   104
	/* Build the "Player Commands" category */
pred@1536
   105
	new TopMenuObject:player_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_PLAYERCOMMANDS);
pred@1536
   106
	
pred@1536
   107
	if (player_commands != INVALID_TOPMENUOBJECT)
pred@1536
   108
	{
pred@1536
   109
		AddToTopMenu(hTopMenu, 
dvander@1600
   110
			"sm_gag",
pred@1536
   111
			TopMenuObject_Item,
pred@1536
   112
			AdminMenu_Gag,
pred@1536
   113
			player_commands,
pred@1536
   114
			"sm_gag",
pred@1536
   115
			ADMFLAG_CHAT);
pred@1536
   116
	}
ferret99gt@1475
   117
}
ferret99gt@1475
   118
ferret99gt@1475
   119
public ConVarChange_Deadtalk(Handle:convar, const String:oldValue[], const String:newValue[])
ferret99gt@1475
   120
{
ferret99gt@1475
   121
	if (GetConVarInt(g_Cvar_Deadtalk))
ferret99gt@1475
   122
	{
ferret99gt@1475
   123
		HookEvent("player_spawn", Event_PlayerSpawn, EventHookMode_Post);
ferret99gt@1475
   124
		HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post);
ferret99gt@1475
   125
		g_Hooked = true;
ferret99gt@1475
   126
	}
ferret99gt@1475
   127
	else if (g_Hooked)
ferret99gt@1475
   128
	{
ferret99gt@1475
   129
		UnhookEvent("player_spawn", Event_PlayerSpawn);
ferret99gt@1475
   130
		UnhookEvent("player_death", Event_PlayerDeath);		
ferret99gt@1475
   131
		g_Hooked = false;
ferret99gt@1475
   132
	}
ferret99gt@1475
   133
}
ferret99gt@1475
   134
ferret99gt@1475
   135
ferret99gt@1475
   136
public bool:OnClientConnect(client, String:rejectmsg[], maxlen)
ferret99gt@1475
   137
{
ferret99gt@1475
   138
	g_Gagged[client] = false;
ferret99gt@1475
   139
	g_Muted[client] = false;
ferret99gt@1475
   140
	
ferret99gt@1475
   141
	return true;
ferret99gt@1475
   142
}
ferret99gt@1475
   143
ferret99gt@1475
   144
public Action:Command_Say(client, args)
ferret99gt@1475
   145
{
ferret99gt@1475
   146
	if (client)
ferret99gt@1475
   147
	{
ferret99gt@1475
   148
		if (g_Gagged[client])
ferret99gt@1475
   149
		{
ferret99gt@1475
   150
			return Plugin_Handled;		
ferret99gt@1475
   151
		}
ferret99gt@1475
   152
	}
ferret99gt@1475
   153
	
ferret99gt@1475
   154
	return Plugin_Continue;
ferret99gt@1475
   155
}
ferret99gt@1475
   156
dvander@1660
   157
public ConVarChange_Alltalk(Handle:convar, const String:oldValue[], const String:newValue[])
dvander@1660
   158
{
dvander@1660
   159
	if (StringToInt(newValue) != 0
dvander@1660
   160
		|| StringToInt(oldValue) == 0)
dvander@1660
   161
	{
dvander@1660
   162
		return;
dvander@1660
   163
	}
dvander@1660
   164
	
dvander@1660
   165
	new dt_val = GetConVarInt(g_Cvar_Deadtalk);
dvander@1660
   166
	new max_clients = GetMaxClients();
dvander@1660
   167
	
dvander@1660
   168
	for (new i = 1; i <= max_clients; i++)
dvander@1660
   169
	{
dvander@1660
   170
		if (!IsClientInGame(i))
dvander@1660
   171
		{
dvander@1660
   172
			continue;
dvander@1660
   173
		}
dvander@1660
   174
		
dvander@1660
   175
		PrintToServer("STAT (i %d) (g_Muted[%d] %d) (dt_val %d)", i, i, g_Muted[i], dt_val);
dvander@1660
   176
		
dvander@1660
   177
		if (IsPlayerAlive(i))
dvander@1660
   178
		{
dvander@1660
   179
			if (g_Muted[i])
dvander@1660
   180
			{
dvander@1660
   181
				SetClientListeningFlags(i, VOICE_MUTED);
dvander@1660
   182
			}
dvander@1660
   183
			else
dvander@1660
   184
			{
dvander@1660
   185
				SetClientListeningFlags(i, VOICE_NORMAL);
dvander@1660
   186
			}
dvander@1660
   187
		}
dvander@1660
   188
		else
dvander@1660
   189
		{
dvander@1660
   190
			if (g_Muted[i])
dvander@1660
   191
			{
dvander@1660
   192
				SetClientListeningFlags(i, VOICE_MUTED);
dvander@1660
   193
			}
dvander@1660
   194
			else if (dt_val == 1)
dvander@1660
   195
			{
dvander@1660
   196
				SetClientListeningFlags(i, VOICE_LISTENALL);
dvander@1660
   197
			}
dvander@1660
   198
			else if (dt_val == 2)
dvander@1660
   199
			{
dvander@1660
   200
				SetClientListeningFlags(i, VOICE_TEAM);
dvander@1660
   201
			}
dvander@1660
   202
		}
dvander@1660
   203
	}
dvander@1660
   204
}
dvander@1660
   205
ferret99gt@1475
   206
public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
ferret99gt@1475
   207
{
ferret99gt@1475
   208
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
ferret99gt@1475
   209
	
ferret99gt@1475
   210
	if (g_Muted[client])
ferret99gt@1475
   211
	{
ferret99gt@1475
   212
		SetClientListeningFlags(client, VOICE_MUTED);
ferret99gt@1475
   213
	}
ferret99gt@1475
   214
	else
ferret99gt@1475
   215
	{
ferret99gt@1475
   216
		SetClientListeningFlags(client, VOICE_NORMAL);
ferret99gt@1475
   217
	}
ferret99gt@1475
   218
}
ferret99gt@1475
   219
ferret99gt@1475
   220
public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
ferret99gt@1475
   221
{
ferret99gt@1475
   222
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
ferret99gt@1475
   223
	
ferret99gt@1475
   224
	if (g_Muted[client])
ferret99gt@1475
   225
	{
ferret99gt@1475
   226
		SetClientListeningFlags(client, VOICE_MUTED);
ferret99gt@1475
   227
		return;
ferret99gt@1475
   228
	}
ferret99gt@1475
   229
	
ferret99gt@1475
   230
	if (GetConVarBool(g_Cvar_Alltalk))
ferret99gt@1475
   231
	{
ferret99gt@1475
   232
		SetClientListeningFlags(client, VOICE_NORMAL);
ferret99gt@1475
   233
		return;
ferret99gt@1475
   234
	}
ferret99gt@1475
   235
	
dvander@1660
   236
	new dt_val = GetConVarInt(g_Cvar_Deadtalk);
dvander@1660
   237
	if (dt_val == 1)
ferret99gt@1475
   238
	{
ferret99gt@1475
   239
		SetClientListeningFlags(client, VOICE_LISTENALL);
ferret99gt@1475
   240
	}
dvander@1660
   241
	else if (dt_val == 2)
ferret99gt@1475
   242
	{
ferret99gt@1475
   243
		SetClientListeningFlags(client, VOICE_TEAM);
ferret99gt@1475
   244
	}
dvander@1600
   245
}