ferret99gt@1789: /**
ferret99gt@1789: * vim: set ts=4 :
ferret99gt@1789: * =============================================================================
ferret99gt@1789: * SourceMod Basecommands Plugin
ferret99gt@1789: * Provides kick functionality
ferret99gt@1789: *
ds@1947: * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved.
ferret99gt@1789: * =============================================================================
ferret99gt@1789: *
ferret99gt@1789: * This program is free software; you can redistribute it and/or modify it under
ferret99gt@1789: * the terms of the GNU General Public License, version 3.0, as published by the
ferret99gt@1789: * Free Software Foundation.
ferret99gt@1789: *
ferret99gt@1789: * This program is distributed in the hope that it will be useful, but WITHOUT
ferret99gt@1789: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ferret99gt@1789: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
ferret99gt@1789: * details.
ferret99gt@1789: *
ferret99gt@1789: * You should have received a copy of the GNU General Public License along with
ferret99gt@1789: * this program. If not, see .
ferret99gt@1789: *
ferret99gt@1789: * As a special exception, AlliedModders LLC gives you permission to link the
ferret99gt@1789: * code of this program (as well as its derivative works) to "Half-Life 2," the
ferret99gt@1789: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ferret99gt@1789: * by the Valve Corporation. You must obey the GNU General Public License in
ferret99gt@1789: * all respects for all other code used. Additionally, AlliedModders LLC grants
ferret99gt@1789: * this exception to all derivative works. AlliedModders LLC defines further
ferret99gt@1789: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ferret99gt@1789: * or .
ferret99gt@1789: *
ferret99gt@1789: * Version: $Id$
ferret99gt@1789: */
ferret99gt@1789:
dvander@1510: PerformKick(client, target, const String:reason[])
dvander@1510: {
dvander@1510: LogAction(client, target, "\"%L\" kicked \"%L\" (reason \"%s\")", client, target, reason);
dvander@1510:
dvander@1510: if (reason[0] == '\0')
dvander@1510: {
dvander@1510: KickClient(target, "%t", "Kicked by admin");
dvander@1510: }
dvander@1510: else
dvander@1510: {
dvander@1510: KickClient(target, "%s", reason);
dvander@1510: }
dvander@1510: }
dvander@1510:
dvander@1510: DisplayKickMenu(client)
dvander@1510: {
dvander@1510: new Handle:menu = CreateMenu(MenuHandler_Kick);
dvander@1510:
dvander@1510: decl String:title[100];
dvander@1510: Format(title, sizeof(title), "%T:", "Kick player", client);
dvander@1510: SetMenuTitle(menu, title);
dvander@1510: SetMenuExitBackButton(menu, true);
dvander@1510:
pred@1626: AddTargetsToMenu(menu, client, false, false);
dvander@1510:
dvander@1510: DisplayMenu(menu, client, MENU_TIME_FOREVER);
dvander@1510: }
dvander@1510:
dvander@1510: public AdminMenu_Kick(Handle:topmenu,
dvander@1510: TopMenuAction:action,
dvander@1510: TopMenuObject:object_id,
dvander@1510: param,
dvander@1510: String:buffer[],
dvander@1510: maxlength)
dvander@1510: {
dvander@1525: if (action == TopMenuAction_DisplayOption)
dvander@1510: {
dvander@1510: Format(buffer, maxlength, "%T", "Kick player", param);
dvander@1510: }
dvander@1510: else if (action == TopMenuAction_SelectOption)
dvander@1510: {
dvander@1510: DisplayKickMenu(param);
dvander@1510: }
dvander@1510: }
dvander@1510:
dvander@1510: public MenuHandler_Kick(Handle:menu, MenuAction:action, param1, param2)
dvander@1510: {
dvander@1510: if (action == MenuAction_End)
dvander@1510: {
dvander@1510: CloseHandle(menu);
dvander@1510: }
dvander@1510: else if (action == MenuAction_Cancel)
dvander@1510: {
dvander@1510: if (param2 == MenuCancel_ExitBack && hTopMenu != INVALID_HANDLE)
dvander@1510: {
dvander@1510: DisplayTopMenu(hTopMenu, param1, TopMenuPosition_LastCategory);
dvander@1510: }
dvander@1510: }
dvander@1510: else if (action == MenuAction_Select)
dvander@1510: {
dvander@1510: decl String:info[32];
dvander@1510: new userid, target;
dvander@1510:
dvander@1510: GetMenuItem(menu, param2, info, sizeof(info));
dvander@1510: userid = StringToInt(info);
dvander@1510:
dvander@1510: if ((target = GetClientOfUserId(userid)) == 0)
dvander@1510: {
dvander@1510: PrintToChat(param1, "[SM] %t", "Player no longer available");
dvander@1510: }
dvander@1510: else if (!CanUserTarget(param1, target))
dvander@1510: {
dvander@1510: PrintToChat(param1, "[SM] %t", "Unable to target");
dvander@1510: }
dvander@1510: else
dvander@1510: {
dvander@1623: decl String:name[MAX_NAME_LENGTH];
dvander@1623: GetClientName(target, name, sizeof(name));
dvander@1624: ShowActivity2(param1, "[SM] ", "%t", "Kicked target", "_s", name);
dvander@1510: PerformKick(param1, target, "");
dvander@1510: }
dvander@1510:
dvander@1510: /* Re-draw the menu if they're still valid */
dvander@1510: if (IsClientInGame(param1) && !IsClientInKickQueue(param1))
dvander@1510: {
dvander@1510: DisplayKickMenu(param1);
dvander@1510: }
dvander@1510: }
dvander@1510: }
dvander@1510:
dvander@1510: public Action:Command_Kick(client, args)
dvander@1510: {
dvander@1510: if (args < 1)
dvander@1510: {
dvander@1510: ReplyToCommand(client, "[SM] Usage: sm_kick <#userid|name> [reason]");
dvander@1510: return Plugin_Handled;
dvander@1510: }
dvander@1510:
dvander@1510: decl String:Arguments[256];
dvander@1510: GetCmdArgString(Arguments, sizeof(Arguments));
dvander@1510:
dvander@1510: decl String:arg[65];
dvander@1510: new len = BreakString(Arguments, arg, sizeof(arg));
dvander@1623:
dvander@1510: if (len == -1)
dvander@1510: {
dvander@1510: /* Safely null terminate */
dvander@1510: len = 0;
dvander@1510: Arguments[0] = '\0';
dvander@1510: }
dvander@1510:
dvander@1623: decl String:target_name[MAX_TARGET_LENGTH];
dvander@1623: decl target_list[MAXPLAYERS], target_count, bool:tn_is_ml;
dvander@1623:
dvander@1623: if ((target_count = ProcessTargetString(
dvander@1623: arg,
dvander@1623: client,
dvander@1623: target_list,
dvander@1623: MAXPLAYERS,
dvander@1623: COMMAND_FILTER_CONNECTED,
dvander@1623: target_name,
dvander@1623: sizeof(target_name),
dvander@1623: tn_is_ml)) > 0)
dvander@1623: {
dvander@1623: if (tn_is_ml)
dvander@1623: {
dvander@1623: ShowActivity2(client, "[SM] ", "%t", "Kicked target", target_name);
dvander@1623: }
dvander@1623: else
dvander@1623: {
dvander@1624: ShowActivity2(client, "[SM] ", "%t", "Kicked target", "_s", target_name);
dvander@1623: }
dvander@1623:
dvander@1623: new kick_self = 0;
dvander@1623:
dvander@1623: for (new i = 0; i < target_count; i++)
dvander@1623: {
dvander@1623: /* Kick everyone else first */
dvander@1623: if (target_list[i] == client)
dvander@1623: {
dvander@1623: kick_self = client;
dvander@1623: }
dvander@1658: else
dvander@1658: {
dvander@1658: PerformKick(client, target_list[i], Arguments[len]);
dvander@1658: }
dvander@1623: }
dvander@1623:
dvander@1623: if (kick_self)
dvander@1623: {
dvander@1623: PerformKick(client, client, Arguments[len]);
dvander@1623: }
dvander@1623: }
dvander@1623: else
dvander@1623: {
dvander@1623: ReplyToTargetError(client, target_count);
dvander@1623: }
dvander@1510:
dvander@1510: return Plugin_Handled;
dvander@1510: }