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: new offset = FindDataMapOffs(client, "m_flGravity"); dvander@1889: new Float:temp = GetEntDataFloat(client, offset); dvander@1889: PrintToChatAll("Gravity check %f", temp); 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: dvander@1889: AddMenuItem(menu, "4.0", "Gravity Very High"); dvander@1889: AddMenuItem(menu, "2.0", "Gravity High"); dvander@1889: AddMenuItem(menu, "1.0", "Gravity Normal"); dvander@1889: AddMenuItem(menu, "0.5", "Gravity Low"); dvander@1889: AddMenuItem(menu, "0.1", "Gravity Very Low"); 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: }