diff --git a/plugins/basecommands.sp b/plugins/basecommands.sp index 33076a2d..dbb12cfa 100644 --- a/plugins/basecommands.sp +++ b/plugins/basecommands.sp @@ -67,6 +67,7 @@ public OnPluginStart() RegAdminCmd("sm_map", Command_Map, ADMFLAG_CHANGEMAP, "sm_map "); RegAdminCmd("sm_rcon", Command_Rcon, ADMFLAG_RCON, "sm_rcon "); RegAdminCmd("sm_cvar", Command_Cvar, ADMFLAG_CONVARS, "sm_cvar [value]"); + RegAdminCmd("sm_resetcvar", Command_ResetCvar, ADMFLAG_CONVARS, "sm_resetcvar "); RegAdminCmd("sm_execcfg", Command_ExecCfg, ADMFLAG_CONFIG, "sm_execcfg "); RegAdminCmd("sm_who", Command_Who, ADMFLAG_GENERIC, "sm_who [#userid|name]"); RegAdminCmd("sm_reloadadmins", Command_ReloadAdmins, ADMFLAG_BAN, "sm_reloadadmins"); @@ -115,6 +116,36 @@ bool:IsVarProtected(const String:cvar[]) return GetTrieValue(g_ProtectedVars, cvar, dummy_value); } +bool:IsClientAllowedToChangeCvar(client, const String:cvarname[]) +{ + new Handle:hndl = FindConVar(cvarname); + + new bool:allowed = false; + new client_flags = client == 0 ? ADMFLAG_ROOT : GetUserFlagBits(client); + + if (client_flags & ADMFLAG_ROOT) + { + allowed = true; + } + else + { + if (GetConVarFlags(hndl) & FCVAR_PROTECTED) + { + allowed = ((client_flags & ADMFLAG_PASSWORD) == ADMFLAG_PASSWORD); + } + else if (StrEqual(cvarname, "sv_cheats")) + { + allowed = ((client_flags & ADMFLAG_CHEATS) == ADMFLAG_CHEATS); + } + else if (!IsVarProtected(cvarname)) + { + allowed = true; + } + } + + return allowed; +} + public OnAdminMenuReady(Handle:topmenu) { /* Block us from being called twice */ @@ -295,31 +326,8 @@ public Action:Command_Cvar(client, args) ReplyToCommand(client, "[SM] %t", "Unable to find cvar", cvarname); return Plugin_Handled; } - - new bool:allowed = false; - new client_flags = client == 0 ? ADMFLAG_ROOT : GetUserFlagBits(client); - - if (client_flags & ADMFLAG_ROOT) - { - allowed = true; - } - else - { - if (GetConVarFlags(hndl) & FCVAR_PROTECTED) - { - allowed = ((client_flags & ADMFLAG_PASSWORD) == ADMFLAG_PASSWORD); - } - else if (StrEqual(cvarname, "sv_cheats")) - { - allowed = ((client_flags & ADMFLAG_CHEATS) == ADMFLAG_CHEATS); - } - else if (!IsVarProtected(cvarname)) - { - allowed = true; - } - } - - if (!allowed) + + if (!IsClientAllowedToChangeCvar(client, cvarname)) { ReplyToCommand(client, "[SM] %t", "No access to cvar"); return Plugin_Handled; @@ -352,6 +360,50 @@ public Action:Command_Cvar(client, args) return Plugin_Handled; } +public Action:Command_ResetCvar(client, args) +{ + if (args < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_resetcvar "); + + return Plugin_Handled; + } + + decl String:cvarname[64]; + GetCmdArg(1, cvarname, sizeof(cvarname)); + + new Handle:hndl = FindConVar(cvarname); + if (hndl == INVALID_HANDLE) + { + ReplyToCommand(client, "[SM] %t", "Unable to find cvar", cvarname); + return Plugin_Handled; + } + + if (!IsClientAllowedToChangeCvar(client, cvarname)) + { + ReplyToCommand(client, "[SM] %t", "No access to cvar"); + return Plugin_Handled; + } + + ResetConVar(hndl); + + decl String:value[255]; + GetConVarString(hndl, value, sizeof(value)); + + if ((GetConVarFlags(hndl) & FCVAR_PROTECTED) != FCVAR_PROTECTED) + { + ShowActivity2(client, "[SM] ", "%t", "Cvar changed", cvarname, value); + } + else + { + ReplyToCommand(client, "[SM] %t", "Cvar changed", cvarname, value); + } + + LogAction(client, -1, "\"%L\" reset cvar (cvar \"%s\") (value \"%s\")", client, cvarname, value); + + return Plugin_Handled; +} + public Action:Command_Rcon(client, args) { if (args < 1)