dvander@1889: /**
dvander@1889: * vim: set ts=4 :
dvander@1889: * =============================================================================
dvander@1889: * SourceMod Basefuncommands Plugin
dvander@1889: * Provides gravity functionality
dvander@1889: *
ds@1947: * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved.
dvander@1889: * =============================================================================
dvander@1889: *
dvander@1889: * This program is free software; you can redistribute it and/or modify it under
dvander@1889: * the terms of the GNU General Public License, version 3.0, as published by the
dvander@1889: * Free Software Foundation.
dvander@1889: *
dvander@1889: * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@1889: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@1889: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
dvander@1889: * details.
dvander@1889: *
dvander@1889: * You should have received a copy of the GNU General Public License along with
dvander@1889: * this program. If not, see .
dvander@1889: *
dvander@1889: * As a special exception, AlliedModders LLC gives you permission to link the
dvander@1889: * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@1889: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@1889: * by the Valve Corporation. You must obey the GNU General Public License in
dvander@1889: * all respects for all other code used. Additionally, AlliedModders LLC grants
dvander@1889: * this exception to all derivative works. AlliedModders LLC defines further
dvander@1889: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@1889: * or .
dvander@1889: *
dvander@1889: * Version: $Id$
dvander@1889: */
dvander@1889:
dvander@1889: new g_GravityTarget[MAXPLAYERS+1];
dvander@1889:
dvander@1889: PerformGravity(client, target, Float:amount)
dvander@1889: {
dvander@1889: SetEntityGravity(target, amount);
dvander@1889: LogAction(client, target, "\"%L\" set gravity on \"%L\" to %d.", client, target, amount);
dvander@1889: }
dvander@1889:
dvander@1889: public AdminMenu_Gravity(Handle:topmenu,
dvander@1889: TopMenuAction:action,
dvander@1889: TopMenuObject:object_id,
dvander@1889: param,
dvander@1889: String:buffer[],
dvander@1889: maxlength)
dvander@1889: {
dvander@1889: if (action == TopMenuAction_DisplayOption)
dvander@1889: {
dvander@1889: Format(buffer, maxlength, "%T", "Gravity player", param);
dvander@1889: }
dvander@1889: else if (action == TopMenuAction_SelectOption)
dvander@1889: {
dvander@1889: DisplayGravityMenu(param);
dvander@1889: }
dvander@1889: }
dvander@1889:
dvander@1889: DisplayGravityMenu(client)
dvander@1889: {
dvander@1889: new Handle:menu = CreateMenu(MenuHandler_Gravity);
dvander@1889:
dvander@1889: decl String:title[100];
dvander@1889: Format(title, sizeof(title), "%T:", "Gravity player", client);
dvander@1889: SetMenuTitle(menu, title);
dvander@1889: SetMenuExitBackButton(menu, true);
dvander@1889:
dvander@1889: AddTargetsToMenu(menu, client, true, true);
dvander@1889:
dvander@1889: DisplayMenu(menu, client, MENU_TIME_FOREVER);
dvander@1889: }
dvander@1889:
dvander@1889: DisplayGravityAmountMenu(client)
dvander@1889: {
dvander@1889: new Handle:menu = CreateMenu(MenuHandler_GravityAmount);
dvander@1889:
dvander@1889: decl String:title[100];
fyrenmoo@2640: Format(title, sizeof(title), "%T: %N", "Gravity amount", client, GetClientOfUserId(g_GravityTarget[client]));
dvander@1889: SetMenuTitle(menu, title);
dvander@1889: SetMenuExitBackButton(menu, true);
dvander@1889:
skamonkey@3887: AddTranslatedMenuItem(menu, "4.0", "Gravity Very High", client);
skamonkey@3887: AddTranslatedMenuItem(menu, "2.0", "Gravity High", client);
skamonkey@3887: AddTranslatedMenuItem(menu, "1.0", "Gravity Normal", client);
skamonkey@3887: AddTranslatedMenuItem(menu, "0.5", "Gravity Low", client);
skamonkey@3887: AddTranslatedMenuItem(menu, "0.1", "Gravity Very Low", client);
dvander@1889:
dvander@1889: DisplayMenu(menu, client, MENU_TIME_FOREVER);
dvander@1889: }
dvander@1889:
dvander@1889: public MenuHandler_Gravity(Handle:menu, MenuAction:action, param1, param2)
dvander@1889: {
dvander@1889: if (action == MenuAction_End)
dvander@1889: {
dvander@1889: CloseHandle(menu);
dvander@1889: }
dvander@1889: else if (action == MenuAction_Cancel)
dvander@1889: {
dvander@1889: if (param2 == MenuCancel_ExitBack && hTopMenu != INVALID_HANDLE)
dvander@1889: {
dvander@1889: DisplayTopMenu(hTopMenu, param1, TopMenuPosition_LastCategory);
dvander@1889: }
dvander@1889: }
dvander@1889: else if (action == MenuAction_Select)
dvander@1889: {
dvander@1889: decl String:info[32];
dvander@1889: new userid, target;
dvander@1889:
dvander@1889: GetMenuItem(menu, param2, info, sizeof(info));
dvander@1889: userid = StringToInt(info);
dvander@1889:
dvander@1889: if ((target = GetClientOfUserId(userid)) == 0)
dvander@1889: {
dvander@1889: PrintToChat(param1, "[SM] %t", "Player no longer available");
dvander@1889: }
dvander@1889: else if (!CanUserTarget(param1, target))
dvander@1889: {
dvander@1889: PrintToChat(param1, "[SM] %t", "Unable to target");
dvander@1889: }
dvander@1889: else
dvander@1889: {
dvander@1889: g_GravityTarget[param1] = userid;
dvander@1889: DisplayGravityAmountMenu(param1);
dvander@1889: return; // Return, because we went to a new menu and don't want the re-draw to occur.
dvander@1889: }
dvander@1889:
dvander@1889: /* Re-draw the menu if they're still valid */
dvander@1889: if (IsClientInGame(param1) && !IsClientInKickQueue(param1))
dvander@1889: {
dvander@1889: DisplayGravityMenu(param1);
dvander@1889: }
dvander@1889: }
dvander@1889:
dvander@1889: return;
dvander@1889: }
dvander@1889:
dvander@1889: public MenuHandler_GravityAmount(Handle:menu, MenuAction:action, param1, param2)
dvander@1889: {
dvander@1889: if (action == MenuAction_End)
dvander@1889: {
dvander@1889: CloseHandle(menu);
dvander@1889: }
dvander@1889: else if (action == MenuAction_Cancel)
dvander@1889: {
dvander@1889: if (param2 == MenuCancel_ExitBack && hTopMenu != INVALID_HANDLE)
dvander@1889: {
dvander@1889: DisplayTopMenu(hTopMenu, param1, TopMenuPosition_LastCategory);
dvander@1889: }
dvander@1889: }
dvander@1889: else if (action == MenuAction_Select)
dvander@1889: {
dvander@1889: decl String:info[32];
dvander@1889: new Float:amount, target;
dvander@1889:
dvander@1889: GetMenuItem(menu, param2, info, sizeof(info));
dvander@1889: amount = StringToFloat(info);
dvander@1889:
dvander@1889: if ((target = GetClientOfUserId(g_GravityTarget[param1])) == 0)
dvander@1889: {
dvander@1889: PrintToChat(param1, "[SM] %t", "Player no longer available");
dvander@1889: }
dvander@1889: else if (!CanUserTarget(param1, target))
dvander@1889: {
dvander@1889: PrintToChat(param1, "[SM] %t", "Unable to target");
dvander@1889: }
dvander@1889: else
dvander@1889: {
dvander@1889: new String:name[32];
dvander@1889: GetClientName(target, name, sizeof(name));
dvander@1889:
dvander@1889: PerformGravity(param1, target, amount);
dvander@1889: ShowActivity2(param1, "[SM] ", "%t", "Set gravity on target", "_s", name, amount);
dvander@1889: }
dvander@1889:
dvander@1889: /* Re-draw the menu if they're still valid */
dvander@1889: if (IsClientInGame(param1) && !IsClientInKickQueue(param1))
dvander@1889: {
dvander@1889: DisplayGravityMenu(param1);
dvander@1889: }
dvander@1889: }
dvander@1889: }
dvander@1889:
dvander@1889: public Action:Command_Gravity(client, args)
dvander@1889: {
dvander@1889: if (args < 1)
dvander@1889: {
dvander@1889: ReplyToCommand(client, "[SM] Usage: sm_gravity <#userid|name> [amount]");
dvander@1889: return Plugin_Handled;
dvander@1889: }
dvander@1889:
dvander@1889: decl String:arg[65];
dvander@1889: GetCmdArg(1, arg, sizeof(arg));
dvander@1889:
dvander@1889: new Float:amount = 1.0;
dvander@1889: if (args > 1)
dvander@1889: {
dvander@1889: decl String:arg2[20];
dvander@1889: GetCmdArg(2, arg2, sizeof(arg2));
dvander@1889: if (StringToFloatEx(arg2, amount) == 0)
dvander@1889: {
dvander@1889: ReplyToCommand(client, "[SM] %t", "Invalid Amount");
dvander@1889: return Plugin_Handled;
dvander@1889: }
dvander@1889:
dvander@1889: if (amount < 0.0)
dvander@1889: {
dvander@1889: amount = 0.0;
dvander@1889: }
dvander@1889: }
dvander@1889:
dvander@1889: decl String:target_name[MAX_TARGET_LENGTH];
dvander@1889: decl target_list[MAXPLAYERS], target_count, bool:tn_is_ml;
dvander@1889:
dvander@1889: if ((target_count = ProcessTargetString(
dvander@1889: arg,
dvander@1889: client,
dvander@1889: target_list,
dvander@1889: MAXPLAYERS,
dvander@1889: COMMAND_FILTER_ALIVE,
dvander@1889: target_name,
dvander@1889: sizeof(target_name),
dvander@1889: tn_is_ml)) <= 0)
dvander@1889: {
dvander@1889: ReplyToTargetError(client, target_count);
dvander@1889: return Plugin_Handled;
dvander@1889: }
dvander@1889:
dvander@1889: for (new i = 0; i < target_count; i++)
dvander@1889: {
dvander@1889: PerformGravity(client, target_list[i], amount);
dvander@1889: }
dvander@1889:
dvander@1889: if (tn_is_ml)
dvander@1889: {
dvander@1889: ShowActivity2(client, "[SM] ", "%t", "Set gravity on target", target_name);
dvander@1889: }
dvander@1889: else
dvander@1889: {
dvander@1889: ShowActivity2(client, "[SM] ", "%t", "Set gravity on target", "_s", target_name);
dvander@1889: }
dvander@1889:
dvander@1889: return Plugin_Handled;
dvander@1889: }