So I see that alot of people like to uh.. make a command with a 0|1 option to toggle it on/off, and personally that's just inefficient for the user/admin.
Before I start: I want to say that this is generally what I like to do, as it might be a little extra work on my end, but it defiantly looks much nicer and refined.
Instead of using an argument to declare if we want to have, for instance, God Mode enabled, we can use a Global Variable.
This will be our FINISHED PRODUCT:
Spoiler
PHP Code:
#include <sourcemod>
#define pAuthor "EasSidezZ" #define pName "Toggle Command Tutorial" #define pDesc "A Tutorial to show how to toggle a command" #define pVersion "6.9" #define pURL "http://www.sourcemod.net"
/*Global Variables*/ new bool:g_bIsEnabled[MAXPLAYERS + 1]; /*Global Variables*/
public Plugin:myinfo = {name = pName, author = pAuthor, description = pDesc, version = pVersion, url = pURL}
public OnMapStart() { RegConsoleCmd("sm_godmode", command_GodMode, "- Toggle God Mode On and Off"); }
public OnClientPostAdminCheck(Client) { g_bIsEnabled[Client] = false; }
public OnClientDisconnect(Client) { g_bIsEnabled[Client] = false; }
//Toggle Godmode public Action:command_GodMode(Client, iArgs) { if(iArgs > 0) //If there are arguments, return an error. { ReplyToCommand(Client, "[SM] Invalid Usage: sm_godmode <NO ARGS>"); return Action:3; //Plugin Handled }
if(!g_bIsEnabled[Client]) //If the player does not have godmode, set godmode. { SetEntProp(Client, Prop_Data, "m_takedamage", 0, 1); g_bIsEnabled[Client] = true; ReplyToCommand(Client, "[SM] God Mode Enabled"); return Action:3; } else //If the player has godmode, remove it. { SetEntProp(Client, Prop_Data, "m_takedamage", 2, 1); g_bIsEnabled[Client] = false; ReplyToCommand(Client, "[SM] God Mode Disabled"); return Action:3; }
return Action:1; }
Here is an example of the OLD METHOD.
Spoiler
PHP Code:
#include <sourcemod>
#define pAuthor "EasSidezZ" #define pName "Toggle Command Tutorial" #define pDesc "A Tutorial to show how to toggle a command" #define pVersion "6.9" #define pURL "http://www.sourcemod.net"
/*Global Variables*/ new bool:g_bIsEnabled[MAXPLAYERS + 1]; /*Global Variables*/
public Plugin:myinfo = {name = pName, author = pAuthor, description = pDesc, version = pVersion, url = pURL}
public OnMapStart() { RegConsoleCmd("sm_godmode", command_GodMode, "- Toggle God Mode On and Off"); }
//Toggle Godmode public Action:command_GodMode(Client, iArgs) { decl String:sArg[32]; GetCmdArg(1, sArg, sizeof(sArg)); new iArg = StringToInt(sArg);
if(iArgs != 1) //If there are arguments, return an error. { ReplyToCommand(Client, "[SM] Invalid Usage: sm_godmode <NO ARGS>"); return Action:3; //Plugin Handled }
/*Alternate method for this... switch(iArg) { case 0: { SetEntProp(Client, Prop_Data, "m_takedamage", 2, 1); ReplyToCommand(Client, "[SM] God Mode Disabled"); return Action:3; }
case 1: { SetEntProp(Client, Prop_Data, "m_takedamage", 0, 1); ReplyToCommand(Client, "[SM] God Mode Enabled"); return Action:3; } } */
return Action:1; //Return Plugin_Changed }
I'm no master of sourcepawn, but I can tell you that there's really a ton wrong with this. For one, perhaps someone puts an argument value of 2? To fix this problem, we'll add a global client boolean, Implement our OnClientConnect()/OnClientPostAdminCheck() and OnClientDisconnect() and modify our godmode command slightly:
Spoiler
PHP Code:
#include <sourcemod>
#define pAuthor "EasSidezZ" #define pName "Toggle Command Tutorial" #define pDesc "A Tutorial to show how to toggle a command" #define pVersion "6.9" #define pURL "http://www.sourcemod.net"
/*Global Variables*/ new bool:g_bIsEnabled[MAXPLAYERS + 1]; /*Global Variables*/
public Plugin:myinfo = {name = pName, author = pAuthor, description = pDesc, version = pVersion, url = pURL}
public OnMapStart() { RegConsoleCmd("sm_godmode", command_GodMode, "- Toggle God Mode On and Off"); }
public OnClientPostAdminCheck(Client) { g_bIsEnabled[Client] = false; }
public OnClientDisconnect(Client) { g_bIsEnabled[Client] = false; }
//Toggle Godmode public Action:command_GodMode(Client, iArgs) { if(iArgs > 0) //If there are arguments, return an error. { ReplyToCommand(Client, "[SM] Invalid Usage: sm_godmode <NO ARGS>"); return Action:3; //Plugin Handled }
if(!g_bIsEnabled[Client]) //If the player does not have godmode, set godmode. { SetEntProp(Client, Prop_Data, "m_takedamage", 0, 1); g_bIsEnabled[Client] = true; ReplyToCommand(Client, "[SM] God Mode Enabled"); return Action:3; } else //If the player has godmode, remove it. { SetEntProp(Client, Prop_Data, "m_takedamage", 2, 1); g_bIsEnabled[Client] = false; ReplyToCommand(Client, "[SM] God Mode Disabled"); return Action:3; }
return Action:1; //We return Plugin_Changed because it will ALWAYS change, and we'll get a warning thrown if we don't return SOMETHING. }
As you can see, we've used our boolean to check and determine if the player has godmode. We also set it to 0 when they connect and disconnect because if we didn't, a player could leave and another would take their place, and this would assign the old client's value to the new client. (Pretty much, g_bIsEnabled[22].)
EXTRA NOTES:
Quote:
Originally Posted by ddhoward
Here's some more suggestions for making a command like this (that supports targeting other players)
Do CheckCommandAccess on an override similar to but different from the command name, such as "sm_godmode_admin" or "sm_godmode_targetothers" if your command was sm_godmode. If the player does not have access to that override (and/or no arguments exist), then ignore all arguments and simply toggle godmode on the using player, as you have done already in your code.
If the player has access to the override, and at least 1 argument has been given, run that first argument through ProcessTargetString.
If a second argument is not given, toggle godmode on all the given targets provided by ProcessTargetString. If a second argument WAS given, use the argument to determine if godmode should be toggled/enabled/disabled.