text: /**
   * vim: set ts=4 :
   * =============================================================================
   * SourceMod Basefuncommands Plugin
   * Provides slay functionality
   *
   * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
   * =============================================================================
   *
   * This program is free software; you can redistribute it and/or modify it under
   * the terms of the GNU General Public License, version 3.0, as published by the
   * Free Software Foundation.
   * 
   * This program is distributed in the hope that it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
   * details.
   *
   * You should have received a copy of the GNU General Public License along with
   * this program.  If not, see <http://www.gnu.org/licenses/>.
   *
   * As a special exception, AlliedModders LLC gives you permission to link the
   * code of this program (as well as its derivative works) to "Half-Life 2," the
   * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
   * by the Valve Corporation.  You must obey the GNU General Public License in
   * all respects for all other code used.  Additionally, AlliedModders LLC grants
   * this exception to all derivative works.  AlliedModders LLC defines further
   * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
   * or <http://www.sourcemod.net/license.php>.
   *
   * Version: $Id$
   */
  
  void PerformSlay(int client, int target)
  {
  	LogAction(client, target, "\"%L\" slayed \"%L\"", client, target);
  	ForcePlayerSuicide(target);
  }
  
  void DisplaySlayMenu(int client)
  {
  	Menu menu = new Menu(MenuHandler_Slay);
  	
  	char title[100];
  	Format(title, sizeof(title), "%T:", "Slay player", client);
  	menu.SetTitle(title);
  	menu.ExitBackButton = true;
  	
  	AddTargetsToMenu(menu, client, true, true);
  	
  	menu.Display(client, MENU_TIME_FOREVER);
  }
  
  public void AdminMenu_Slay(TopMenu topmenu, 
  					  TopMenuAction action,
  					  TopMenuObject object_id,
  					  int param,
  					  char[] buffer,
  					  int maxlength)
  {
  	if (action == TopMenuAction_DisplayOption)
  	{
  		Format(buffer, maxlength, "%T", "Slay player", param);
  	}
  	else if (action == TopMenuAction_SelectOption)
  	{
  		DisplaySlayMenu(param);
  	}
  }
  
  public int MenuHandler_Slay(Menu menu, MenuAction action, int param1, int param2)
  {
  	if (action == MenuAction_End)
  	{
  		delete menu;
  	}
  	else if (action == MenuAction_Cancel)
  	{
  		if (param2 == MenuCancel_ExitBack && hTopMenu != null)
  		{
  			hTopMenu.Display(param1, TopMenuPosition_LastCategory);
  		}
  	}
  	else if (action == MenuAction_Select)
  	{
  		char info[32];
  		int userid, target;
  		
  		menu.GetItem(param2, info, sizeof(info));
  		userid = StringToInt(info);
  
  		if ((target = GetClientOfUserId(userid)) == 0)
  		{
  			PrintToChat(param1, "[SM] %t", "Player no longer available");
  		}
  		else if (!CanUserTarget(param1, target))
  		{
  			PrintToChat(param1, "[SM] %t", "Unable to target");
  		}
  		else if (!IsPlayerAlive(target))
  		{
  			ReplyToCommand(param1, "[SM] %t", "Player has since died");
  		}
  		else
  		{
  			char name[MAX_NAME_LENGTH];
  			GetClientName(target, name, sizeof(name));
  			PerformSlay(param1, target);
  			ShowActivity2(param1, "[SM] ", "%t", "Slayed target", "_s", name);
  		}
  		
  		DisplaySlayMenu(param1);
  	}
  }
  
  public Action Command_Slay(int client, int args)
  {
  	if (args < 1)
  	{
  		ReplyToCommand(client, "[SM] Usage: sm_slay <#userid|name>");
  		return Plugin_Handled;
  	}
  
  	char arg[65];
  	GetCmdArg(1, arg, sizeof(arg));
  
  	char target_name[MAX_TARGET_LENGTH];
  	int target_list[MAXPLAYERS], target_count;
  	bool tn_is_ml;
  	
  	if ((target_count = ProcessTargetString(
  			arg,
  			client,
  			target_list,
  			MAXPLAYERS,
  			COMMAND_FILTER_ALIVE,
  			target_name,
  			sizeof(target_name),
  			tn_is_ml)) <= 0)
  	{
  		ReplyToTargetError(client, target_count);
  		return Plugin_Handled;
  	}
  
  	for (int i = 0; i < target_count; i++)
  	{
  		PerformSlay(client, target_list[i]);
  	}
  	
  	if (tn_is_ml)
  	{
  		ShowActivity2(client, "[SM] ", "%t", "Slayed target", target_name);
  	}
  	else
  	{
  		ShowActivity2(client, "[SM] ", "%t", "Slayed target", "_s", target_name);
  	}
  
  	return Plugin_Handled;
  }
  