plugins/basefuncommands.sp
author David Anderson <dvander@alliedmods.net>
Sat Dec 22 08:57:08 2007 +0000 (2007-12-22)
changeset 1813 372939c88bc7
parent 1801 06ff8ce94b2b
child 1821 214e212a8c04
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@1194
     1
/**
ds@1330
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
ds@1330
     4
 * SourceMod Basic Fun Commands Plugin
ferret99gt@1194
     5
 * Implements basic punishment commands.
ds@1330
     6
 *
ds@1330
     7
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     8
 * =============================================================================
ferret99gt@1194
     9
 *
ds@1330
    10
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
    11
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    12
 * Free Software Foundation.
ds@1330
    13
 * 
ds@1330
    14
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    17
 * details.
ferret99gt@1194
    18
 *
ds@1330
    19
 * You should have received a copy of the GNU General Public License along with
ds@1330
    20
 * this program.  If not, see <http://www.gnu.org/licenses/>.
teame06@1212
    21
 *
ds@1330
    22
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    23
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    24
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    25
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    26
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    27
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    28
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    29
 * or <http://www.sourcemod.net/license.php>.
ferret99gt@1194
    30
 *
ferret99gt@1194
    31
 * Version: $Id$
ferret99gt@1194
    32
 */
ferret99gt@1194
    33
ferret99gt@1194
    34
#pragma semicolon 1
ferret99gt@1194
    35
ferret99gt@1194
    36
#include <sourcemod>
ferret99gt@1194
    37
#include <sdktools>
pred@1536
    38
#undef REQUIRE_PLUGIN
pred@1536
    39
#include <adminmenu>
ferret99gt@1194
    40
teame06@1212
    41
public Plugin:myinfo =
ferret99gt@1194
    42
{
ferret99gt@1194
    43
	name = "Basic Fun Commands",
ferret99gt@1194
    44
	author = "AlliedModders LLC",
ferret99gt@1194
    45
	description = "Basic Fun Commands",
ferret99gt@1194
    46
	version = SOURCEMOD_VERSION,
ferret99gt@1194
    47
	url = "http://www.sourcemod.net/"
ferret99gt@1194
    48
};
ferret99gt@1194
    49
pred@1536
    50
new Handle:hTopMenu = INVALID_HANDLE;
pred@1536
    51
ferret99gt@1801
    52
// Sounds
ferret99gt@1801
    53
#define SOUND_BLIP		"buttons/blip1.wav"
ferret99gt@1801
    54
#define SOUND_BEEP		"buttons/button17.wav"
ferret99gt@1801
    55
#define SOUND_FINAL		"weapons/cguard/charging.wav"
ferret99gt@1801
    56
#define SOUND_BOOM		"weapons/explode3.wav"
ferret99gt@1801
    57
#define SOUND_FREEZE		"physics/glass/glass_impact_bullet4.wav"
ferret99gt@1801
    58
ferret99gt@1801
    59
// Following are model indexes for temp entities
ferret99gt@1801
    60
new g_BeamSprite;
ferret99gt@1801
    61
new g_BeamSprite2;
ferret99gt@1801
    62
new g_HaloSprite;
ferret99gt@1801
    63
new g_GlowSprite;
ferret99gt@1801
    64
new g_ExplosionSprite;
pred@1536
    65
ferret99gt@1801
    66
// Basic color arrays for temp entities
ferret99gt@1801
    67
new redColor[4] = {255, 75, 75, 255};
ferret99gt@1801
    68
new orangeColor[4] = {255, 128, 0, 255};
ferret99gt@1801
    69
new greenColor[4] = {75, 255, 75, 255};
ferret99gt@1801
    70
new blueColor[4] = {75, 75, 255, 255};
ferret99gt@1801
    71
new whiteColor[4] = {255, 255, 255, 255};
ferret99gt@1801
    72
new greyColor[4] = {128, 128, 128, 255};
ferret99gt@1801
    73
ferret99gt@1801
    74
// Used for some trace rays.
ferret99gt@1801
    75
/*
ferret99gt@1801
    76
new g_FilteredEntity = -1;
ferret99gt@1801
    77
public bool:TR_Filter_Client(ent, contentMask)
ferret99gt@1801
    78
{
ferret99gt@1801
    79
   return (ent == g_FilteredEntity) ? false : true;
ferret99gt@1801
    80
}
ferret99gt@1801
    81
*/
ferret99gt@1801
    82
ferret99gt@1801
    83
// Include various commands and supporting functions
ferret99gt@1785
    84
#include "basefuncommands/beacon.sp"
ferret99gt@1801
    85
#include "basefuncommands/timebomb.sp"
ferret99gt@1801
    86
#include "basefuncommands/fire.sp"
ferret99gt@1801
    87
#include "basefuncommands/ice.sp"
pred@1536
    88
ferret99gt@1194
    89
public OnPluginStart()
ferret99gt@1194
    90
{
ferret99gt@1194
    91
	LoadTranslations("common.phrases");
dvander@1624
    92
	LoadTranslations("basefuncommands.phrases");
ferret99gt@1194
    93
teame06@1214
    94
	RegAdminCmd("sm_play", Command_Play, ADMFLAG_GENERIC, "sm_play <#userid|name> <filename>");
ferret99gt@1801
    95
ferret99gt@1801
    96
	HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);	
ferret99gt@1801
    97
ferret99gt@1801
    98
	SetupBeacon();		// sm_beacon
ferret99gt@1801
    99
	SetupTimeBomb();	// sm_timebomb
ferret99gt@1801
   100
	SetupFire();		// sm_burn and sm_firebomb
ferret99gt@1801
   101
	SetupIce();			// sm_freeze and sm_freezebomb
ferret99gt@1801
   102
	
ferret99gt@1801
   103
	AutoExecConfig(true, "funcommands");
pred@1536
   104
	
pred@1536
   105
	/* Account for late loading */
pred@1536
   106
	new Handle:topmenu;
pred@1536
   107
	if (LibraryExists("adminmenu") && ((topmenu = GetAdminTopMenu()) != INVALID_HANDLE))
pred@1536
   108
	{
pred@1536
   109
		OnAdminMenuReady(topmenu);
pred@1536
   110
	}
pred@1536
   111
}
pred@1536
   112
dvander@1788
   113
public OnMapStart()
dvander@1788
   114
{
ferret99gt@1801
   115
	PrecacheSound(SOUND_BLIP, true);
ferret99gt@1801
   116
	PrecacheSound(SOUND_BEEP, true);
ferret99gt@1801
   117
	PrecacheSound(SOUND_FINAL, true);
ferret99gt@1801
   118
	PrecacheSound(SOUND_BOOM, true);
ferret99gt@1801
   119
	PrecacheSound(SOUND_FREEZE, true);
ferret99gt@1801
   120
ferret99gt@1801
   121
	g_BeamSprite = PrecacheModel("materials/sprites/laser.vmt");
ferret99gt@1801
   122
	g_BeamSprite2 = PrecacheModel("sprites/bluelight1.vmt");
ferret99gt@1801
   123
	g_HaloSprite = PrecacheModel("materials/sprites/halo01.vmt");	
ferret99gt@1801
   124
	g_GlowSprite = PrecacheModel("sprites/blueglow2.vmt");
ferret99gt@1801
   125
	g_ExplosionSprite = PrecacheModel("sprites/sprite_fire01.vmt");
dvander@1788
   126
}
dvander@1788
   127
ferret99gt@1785
   128
public OnMapEnd()
ferret99gt@1785
   129
{
ferret99gt@1785
   130
	KillAllBeacons();
ferret99gt@1801
   131
	KillAllTimeBombs();
ferret99gt@1801
   132
	KillAllFireBombs();
ferret99gt@1801
   133
	KillAllFreezes();
ferret99gt@1801
   134
}
ferret99gt@1801
   135
ferret99gt@1801
   136
public Action:Event_RoundEnd(Handle:event,const String:name[],bool:dontBroadcast)
ferret99gt@1801
   137
{
ferret99gt@1801
   138
	KillAllBeacons();
ferret99gt@1801
   139
	KillAllTimeBombs();
ferret99gt@1801
   140
	KillAllFireBombs();
ferret99gt@1801
   141
	KillAllFreezes();
ferret99gt@1801
   142
	
ferret99gt@1801
   143
	return Plugin_Handled;
ferret99gt@1785
   144
}
ferret99gt@1785
   145
pred@1536
   146
public OnAdminMenuReady(Handle:topmenu)
pred@1536
   147
{
pred@1536
   148
	/* Block us from being called twice */
pred@1536
   149
	if (topmenu == hTopMenu)
pred@1536
   150
	{
pred@1536
   151
		return;
pred@1536
   152
	}
pred@1536
   153
	
pred@1536
   154
	/* Save the Handle */
pred@1536
   155
	hTopMenu = topmenu;
pred@1536
   156
	
pred@1536
   157
	/* Find the "Player Commands" category */
pred@1536
   158
	new TopMenuObject:player_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_PLAYERCOMMANDS);
pred@1536
   159
pred@1536
   160
	if (player_commands != INVALID_TOPMENUOBJECT)
pred@1536
   161
	{
pred@1536
   162
		AddToTopMenu(hTopMenu,
ferret99gt@1801
   163
			"sm_beacon",
pred@1536
   164
			TopMenuObject_Item,
ferret99gt@1801
   165
			AdminMenu_Beacon,
pred@1536
   166
			player_commands,
ferret99gt@1801
   167
			"sm_beacon",
pred@1536
   168
			ADMFLAG_SLAY);
ferret99gt@1801
   169
		
pred@1536
   170
		AddToTopMenu(hTopMenu,
dvander@1600
   171
			"sm_burn",
pred@1536
   172
			TopMenuObject_Item,
pred@1536
   173
			AdminMenu_Burn,
pred@1536
   174
			player_commands,
pred@1536
   175
			"sm_burn",
pred@1536
   176
			ADMFLAG_SLAY);
pred@1536
   177
			
pred@1536
   178
		AddToTopMenu(hTopMenu,
ferret99gt@1801
   179
			"sm_freeze",
pred@1536
   180
			TopMenuObject_Item,
ferret99gt@1801
   181
			AdminMenu_Freeze,
pred@1536
   182
			player_commands,
ferret99gt@1801
   183
			"sm_freeze",
ferret99gt@1801
   184
			ADMFLAG_SLAY);
ferret99gt@1801
   185
ferret99gt@1801
   186
		AddToTopMenu(hTopMenu,
ferret99gt@1801
   187
			"sm_timebomb",
ferret99gt@1801
   188
			TopMenuObject_Item,
ferret99gt@1801
   189
			AdminMenu_TimeBomb,
ferret99gt@1801
   190
			player_commands,
ferret99gt@1801
   191
			"sm_timebomb",
pred@1536
   192
			ADMFLAG_SLAY);	
ferret99gt@1785
   193
			
ferret99gt@1785
   194
		AddToTopMenu(hTopMenu,
ferret99gt@1801
   195
			"sm_firebomb",
ferret99gt@1785
   196
			TopMenuObject_Item,
ferret99gt@1801
   197
			AdminMenu_FireBomb,
ferret99gt@1785
   198
			player_commands,
ferret99gt@1801
   199
			"sm_firebomb",
ferret99gt@1801
   200
			ADMFLAG_SLAY);
ferret99gt@1801
   201
			
ferret99gt@1801
   202
		AddToTopMenu(hTopMenu,
ferret99gt@1801
   203
			"sm_freezebomb",
ferret99gt@1801
   204
			TopMenuObject_Item,
ferret99gt@1801
   205
			AdminMenu_FreezeBomb,
ferret99gt@1801
   206
			player_commands,
ferret99gt@1801
   207
			"sm_freezebomb",
ferret99gt@1801
   208
			ADMFLAG_SLAY);
pred@1536
   209
	}
teame06@1212
   210
}
teame06@1212
   211
teame06@1212
   212
public Action:Command_Play(client, args)
teame06@1212
   213
{
teame06@1241
   214
	if (args < 2)
teame06@1212
   215
	{
teame06@1214
   216
		ReplyToCommand(client, "[SM] Usage: sm_play <#userid|name> <filename>");
teame06@1212
   217
	}
teame06@1212
   218
teame06@1214
   219
	new String:Arguments[PLATFORM_MAX_PATH + 65];
teame06@1214
   220
	GetCmdArgString(Arguments, sizeof(Arguments));
teame06@1214
   221
teame06@1214
   222
 	decl String:Arg[65];
teame06@1214
   223
	new len = BreakString(Arguments, Arg, sizeof(Arg));
teame06@1212
   224
teame06@1214
   225
	/* Make sure it does not go out of bound by doing "sm_play user  "*/
teame06@1241
   226
	if (len == -1)
teame06@1214
   227
	{
teame06@1214
   228
		ReplyToCommand(client, "[SM] Usage: sm_play <#userid|name> <filename>");
teame06@1214
   229
		return Plugin_Handled;
teame06@1214
   230
	}
teame06@1212
   231
teame06@1214
   232
	/* Incase they put quotes and white spaces after the quotes */
teame06@1241
   233
	if (Arguments[len] == '"')
teame06@1214
   234
	{
teame06@1214
   235
		len++;
teame06@1214
   236
		new FileLen = TrimString(Arguments[len]) + len;
teame06@1214
   237
teame06@1241
   238
		if (Arguments[FileLen - 1] == '"')
teame06@1214
   239
		{
teame06@1214
   240
			Arguments[FileLen - 1] = '\0';
teame06@1214
   241
		}
teame06@1214
   242
	}
dvander@1624
   243
	
dvander@1624
   244
	decl String:target_name[MAX_TARGET_LENGTH];
dvander@1624
   245
	decl target_list[MAXPLAYERS], target_count, bool:tn_is_ml;
dvander@1624
   246
	
dvander@1624
   247
	if ((target_count = ProcessTargetString(
dvander@1624
   248
			Arg,
dvander@1624
   249
			client,
dvander@1624
   250
			target_list,
dvander@1624
   251
			MAXPLAYERS,
dvander@1624
   252
			COMMAND_FILTER_NO_BOTS,
dvander@1624
   253
			target_name,
dvander@1624
   254
			sizeof(target_name),
dvander@1624
   255
			tn_is_ml)) <= 0)
dvander@1624
   256
	{
dvander@1624
   257
		ReplyToTargetError(client, target_count);
dvander@1624
   258
		return Plugin_Handled;
dvander@1624
   259
	}
dvander@1624
   260
	
dvander@1624
   261
	for (new i = 0; i < target_count; i++)
dvander@1624
   262
	{
dvander@1624
   263
		ClientCommand(target_list[i], "playgamesound \"%s\"", Arguments[len]);
ferret99gt@1801
   264
		LogAction(client, target_list[i], "\"%L\" played sound on \"%L\" (file \"%s\")", client, target_list[i], Arguments[len]);
dvander@1624
   265
	}
dvander@1624
   266
	
dvander@1624
   267
	if (tn_is_ml)
dvander@1624
   268
	{
dvander@1624
   269
		ShowActivity2(client, "[SM] ", "%t", "Played sound to target", target_name);
dvander@1624
   270
	}
dvander@1624
   271
	else
dvander@1624
   272
	{
dvander@1624
   273
		ShowActivity2(client, "[SM] ", "%t", "Played sound to target", "_s", target_name);
dvander@1624
   274
	}
teame06@1212
   275
teame06@1212
   276
	return Plugin_Handled;
ferret99gt@1194
   277
}