There are a few things I notice people doing:
Over/under validating clients.
Storing/passing entities or clients rather than using entrefs/serials/userids in delayed callbacks.
Using new instead of decl when the variable is going to be overwritten.
Disregarding return values of natives that have significant return values (usually bools, but also things like using isvalidentity instead of just checking for -1/INVALID_ENT_REFERENCE).
Making new variables before passing them to other functions, or using them in various statements (if, switch, etc), rather than just passing the return value.
Using servercommand, to change cvars or execute commands, rather than implementing the natives behind what needs to be done, or creating new natives to interface with related plugins.
Other stuff:
Using includes/stocks that don't really do anything other than add extra overhead for the mod they are working with.
Adding translation and config files to simple things that do not need them.
Annoying stuff:
Making code unreadable by using bad indentation, multiple file includes that don't make sense or are not necessary, or using inconsistent nesting (if / break / continue / return).
Reading in and constantly traversing a large file of keyvakues, rather than storing parts of them in a more optimized format for what you need, be it static vars/arrays, or tries/adt arrays.
Not using pragma semicolon.
Half of that probably consists of my coding lmao xD
What i'm seeing more now days is people storing player data in enums. i would like to know the down fall of that, does that use up more memory per say?
_________________
Re-wrote the short plugin, i replaced alot. you dont really need #defines if you are only replacing one thing with them. Version should be the only #define, especially if you plan on releasing something like this it makes it easier to update the cvar and the plugin version at the same time.
Also you were doing a RegConsoleCmd on MapStart, im not entirely sure about this one, but im sure it's wrong, since you only need to do it on plugin start and unforseen things might happen with the code (like executing twice after a few map changes.)
Spoiler
Code:
new bool:g_bIsEnabled[MAXPLAYERS + 1] = {false,...};
#define pVersion "7.0"
public Plugin:myinfo = {
name = "Toggle Command Tutorial",
author = "EasSidezZ",
description = "A Tutorial to show how to toggle a command",
version = pVersion,
url = "http://www.sourcemod.net"
}
public OnPluginStart()
{
RegConsoleCmd("sm_godmode", command_GodMode, "- Toggle God Mode On and Off");
}
public OnClientDisconnect(Client)
{
g_bIsEnabled[Client] = false;
}
//Toggle Godmode
public Action:command_GodMode(Client, iArgs)
{
if(Client > 0 && IsClientInGame(Client)) {
g_bIsEnabled[Client] = !g_bIsEnabled[Client];
SetEntProp(Client, Prop_Data, "m_takedamage", (g_bIsEnabled[Client]) ? 0 : 2, 1);
ReplyToCommand(Client, "[SM] God Mode %s", (g_bIsEnabled[Client]) ? "Enabled" : "Disabled");
}
return Plugin_Handled;
}