diff -r cbb82af65663 -r de71b8774afc plugins/adminmenu.sp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/adminmenu.sp Mon Oct 01 18:50:07 2007 +0000
@@ -0,0 +1,176 @@
+/**
+ * vim: set ts=4 :
+ * =============================================================================
+ * SourceMod Anti-Flood Plugin
+ * Protects against chat flooding.
+ *
+ * SourceMod (C)2004-2007 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 .
+ *
+ * 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 .
+ *
+ * Version: $Id$
+ */
+
+#pragma semicolon 1
+
+#include
+#include
+
+public Plugin:myinfo =
+{
+ name = "Admin Menu",
+ author = "AlliedModders LLC",
+ description = "Administration Menu",
+ version = SOURCEMOD_VERSION,
+ url = "http://www.sourcemod.net/"
+};
+
+/* Forwards */
+new Handle:hOnAdminMenuReady = INVALID_HANDLE;
+new Handle:hOnAdminMenuCreated = INVALID_HANDLE;
+
+/* Menus */
+new Handle:hAdminMenu = INVALID_HANDLE;
+
+/* Top menu objects */
+new TopMenuObject:obj_playercmds = INVALID_TOPMENUOBJECT;
+
+public bool:AskPluginLoad(Handle:myself, bool:late, String:error[], err_max)
+{
+ CreateNative("GetAdminTopMenu", __GetAdminTopMenu);
+ CreateNative("AddTargetsToMenu", __AddTargetsToMenu);
+ RegPluginLibrary("adminmenu");
+ return true;
+}
+
+public OnPluginStart()
+{
+ LoadTranslations("common.phrases");
+
+ hOnAdminMenuCreated = CreateGlobalForward("OnAdminMenuCreated", ET_Ignore, Param_Cell);
+ hOnAdminMenuReady = CreateGlobalForward("OnAdminMenuReady", ET_Ignore, Param_Cell);
+
+ RegAdminCmd("sm_admin", Command_DisplayMenu, ADMFLAG_GENERIC, "sm_admin");
+}
+
+public OnAllPluginsLoaded()
+{
+ hAdminMenu = CreateTopMenu(CategoryHandler);
+
+ obj_playercmds = AddToTopMenu(hAdminMenu,
+ "PlayerCommands",
+ TopMenuObject_Category,
+ CategoryHandler,
+ INVALID_TOPMENUOBJECT);
+
+ Call_StartForward(hOnAdminMenuCreated);
+ Call_PushCell(hAdminMenu);
+ Call_Finish();
+
+ Call_StartForward(hOnAdminMenuReady);
+ Call_PushCell(hAdminMenu);
+ Call_Finish();
+}
+
+public CategoryHandler(Handle:topmenu,
+ TopMenuAction:action,
+ TopMenuObject:object_id,
+ param,
+ String:buffer[],
+ maxlength)
+{
+ if (action == TopMenuAction_DrawTitle)
+ {
+ if (object_id == INVALID_TOPMENUOBJECT)
+ {
+ Format(buffer, maxlength, "%T:", "Admin Menu", param);
+ }
+ else if (object_id == obj_playercmds)
+ {
+ Format(buffer, maxlength, "%T:", "Player Commands", param);
+ }
+ }
+ else if (action == TopMenuAction_DrawOption)
+ {
+ if (object_id == obj_playercmds)
+ {
+ Format(buffer, maxlength, "%T", "Player Commands", param);
+ }
+ return ITEMDRAW_DEFAULT;
+ }
+
+ return 0;
+}
+
+public __GetAdminTopMenu(Handle:plugin, numParams)
+{
+ return _:hAdminMenu;
+}
+
+public __AddTargetsToMenu(Handle:plugin, numParams)
+{
+ return UTIL_AddTargetsToMenu(GetNativeCell(1), GetNativeCell(2), GetNativeCell(3));
+}
+
+public Action:Command_DisplayMenu(client, args)
+{
+ DisplayTopMenu(hAdminMenu, client, TopMenuPosition_Start);
+
+ return Plugin_Handled;
+}
+
+stock UTIL_AddTargetsToMenu(Handle:menu, source_client, bool:in_game_only)
+{
+ new max_clients = GetMaxClients();
+ decl String:user_id[12];
+ decl String:name[MAX_NAME_LENGTH];
+ decl String:display[MAX_NAME_LENGTH+12];
+
+ new num_clients;
+
+ for (new i = 1; i <= max_clients; i++)
+ {
+ if (!IsClientConnected(i) || IsClientInKickQueue(i))
+ {
+ continue;
+ }
+
+ if (in_game_only && !IsClientInGame(i))
+ {
+ continue;
+ }
+
+ if (source_client && !CanUserTarget(source_client, i))
+ {
+ continue;
+ }
+
+ IntToString(GetClientUserId(i), user_id, sizeof(user_id));
+ GetClientName(i, name, sizeof(name));
+ Format(display, sizeof(display), "%s (%s)", name, user_id);
+ AddMenuItem(menu, user_id, display);
+ num_clients++;
+ }
+
+ return num_clients;
+}