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: }