diff --git a/README.md b/README.md index 1cf5977e..5bf6f686 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,8 @@ Find all cvars details on [online docs](https://srcdslab.github.io/sm-plugin-zom - zr_config_path_weapons - "configs/zr/weapons.txt" - Path, relative to root sourcemod directory, to weapons config file. - zr_config_path_hitgroups - "configs/zr/hitgroups.txt" - Path, relative to root sourcemod directory, to hitgroups config file. - zr_permissions_use_groups - "0" - Use group authentication instead of flags to access admin features. Generic admin flag is still required on some features. +- zr_permissions_flag_generic - "d" - Admin flag used for generic admin operations when group authentication is disabled. [Single flag char, e.g. d = ban | Levels: https://wiki.alliedmods.net/Adding_Admins_(SourceMod)#Levels] +- zr_permissions_flag_configuration - "i" - Admin flag used for configuration operations when group authentication is disabled. [Single flag char, e.g. i = config | Levels: https://wiki.alliedmods.net/Adding_Admins_(SourceMod)#Levels] - zr_classes_menu_spawn - "0" - Re-display class selection menu every spawn. - zr_classes_menu_join - "0" - Display class selection menu when a player spawn for the first time. - zr_classes_random - "0" - Player is assigned a random class every spawn. [Override: zr_classes_default_*] @@ -265,4 +267,4 @@ Find all cvars details on [online docs](https://srcdslab.github.io/sm-plugin-zom - maxime1907 - .Rushaway - Franug - - Anubis + - Anubis \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index eea30c1d..98757801 100644 --- a/docs/index.html +++ b/docs/index.html @@ -13,9 +13,9 @@

Zombie:Reloaded User Manual

-

Based on Plugin Version 3.12.11 (From SRCDSLAB GitHub Repository)
+

Based on Plugin Version 3.13.1 (From SRCDSLAB GitHub Repository)
Written by Richard Helgeby
-User Manual updated by .Rushaway (2025/06/21)

+User Manual updated by .Rushaway (2026/06/18)

Index

@@ -4949,23 +4949,23 @@

1. Admin Flags Used In Zombie:Reloaded

Admins must have the appropriate SourceMod admin flags to -do certain types of operations. Below is a list of all flags used in Zombie:Reloaded and what type -of operation they grant:

+do certain types of operations. The required flag is configurable per operation type through +permissions cvars:

- + - + - +
Admin Flags Used In Zombie:Reloaded
Flag:Flag cvar (default): Operation type:
Admin_Banzr_permissions_flag_generic (Admin_Ban) Access to generic operations like infecting, teleporting, and spawning players.
Admin_Rootzr_permissions_flag_configuration (Admin_Config) Access to operations that change settings in Zombie:Reloaded.
@@ -5020,6 +5020,31 @@

3. Console Variables

0 or 1

+ + + zr_permissions_flag_generic + d + + + +

Admin flag used for generic admin operations when group authentication is disabled.

+

Options:
+ Any single SourceMod admin flag character (a-t or z). Recommended default: d (ban).

+ + + + zr_permissions_flag_configuration + i + + + +

Admin flag used for configuration operations when group authentication is disabled.

+

Options:
+ Any single SourceMod admin flag character (a-t or z). Recommended default: i (config).

+

See SourceMod flag levels:
+ https://wiki.alliedmods.net/Adding_Admins_(SourceMod)#Levels

+ + @@ -6111,4 +6136,4 @@

- + \ No newline at end of file diff --git a/src/addons/sourcemod/scripting/zr/admintools.inc b/src/addons/sourcemod/scripting/zr/admintools.inc index 483aee1e..6e1c03ca 100644 --- a/src/addons/sourcemod/scripting/zr/admintools.inc +++ b/src/addons/sourcemod/scripting/zr/admintools.inc @@ -45,6 +45,50 @@ enum OperationTypes OperationType_Configuration, /** Changing settings. */ } +/** + * Resolves an admin flag from the first character in a cvar. + * Falls back to defaultFlag if the cvar is empty or invalid. + * + * @param cvar Cvar with flag character. + * @param defaultFlag Fallback admin flag. + * @return Resolved admin flag. + */ +stock AdminFlag ZRResolveAdminFlag(ConVar cvar, AdminFlag defaultFlag) +{ + if (cvar == null) + { + return defaultFlag; + } + + char flagString[16]; + cvar.GetString(flagString, sizeof(flagString)); + switch (flagString[0]) + { + case 'a', 'A': return Admin_Reservation; + case 'b', 'B': return Admin_Generic; + case 'c', 'C': return Admin_Kick; + case 'd', 'D': return Admin_Ban; + case 'e', 'E': return Admin_Unban; + case 'f', 'F': return Admin_Slay; + case 'g', 'G': return Admin_Changemap; + case 'h', 'H': return Admin_Convars; + case 'i', 'I': return Admin_Config; + case 'j', 'J': return Admin_Chat; + case 'k', 'K': return Admin_Vote; + case 'l', 'L': return Admin_Password; + case 'm', 'M': return Admin_RCON; + case 'n', 'N': return Admin_Cheats; + case 'o', 'O': return Admin_Custom1; + case 'p', 'P': return Admin_Custom2; + case 'q', 'Q': return Admin_Custom3; + case 'r', 'R': return Admin_Custom4; + case 's', 'S': return Admin_Custom5; + case 't', 'T': return Admin_Custom6; + case 'z', 'Z': return Admin_Root; + } + + return defaultFlag; +} /** * Returns whether a player is allowed to do a certain operation or not. @@ -115,11 +159,11 @@ stock bool ZRIsClientPrivileged(int client, OperationTypes operationType = Opera { case OperationType_Generic: { - flag = Admin_Ban; + flag = ZRResolveAdminFlag(CvarsGetPermissionFlagGeneric(), Admin_Ban); } case OperationType_Configuration: { - flag = Admin_Config; + flag = ZRResolveAdminFlag(CvarsGetPermissionFlagConfiguration(), Admin_Config); } default: { diff --git a/src/addons/sourcemod/scripting/zr/cvars.inc b/src/addons/sourcemod/scripting/zr/cvars.inc index ef9abbe6..542f643d 100644 --- a/src/addons/sourcemod/scripting/zr/cvars.inc +++ b/src/addons/sourcemod/scripting/zr/cvars.inc @@ -54,6 +54,8 @@ enum struct CvarsList ConVar CVAR_CONFIG_PATH_WEAPONS; ConVar CVAR_CONFIG_PATH_HITGROUPS; ConVar CVAR_PERMISSIONS_USE_GROUPS; + ConVar CVAR_PERMISSIONS_FLAG_GENERIC; + ConVar CVAR_PERMISSIONS_FLAG_CONFIGURATION; ConVar CVAR_CLASSES_MENU_SPAWN; ConVar CVAR_CLASSES_MENU_JOIN; ConVar CVAR_CLASSES_RANDOM; @@ -188,6 +190,22 @@ enum struct CvarsList */ CvarsList g_hCvarsList; +/** + * Returns the cvar handle used for generic permission flags. + */ +ConVar CvarsGetPermissionFlagGeneric() +{ + return g_hCvarsList.CVAR_PERMISSIONS_FLAG_GENERIC; +} + +/** + * Returns the cvar handle used for configuration permission flags. + */ +ConVar CvarsGetPermissionFlagConfiguration() +{ + return g_hCvarsList.CVAR_PERMISSIONS_FLAG_CONFIGURATION; +} + /** * @section Global cvar handles. */ @@ -255,6 +273,8 @@ void CvarsCreate() // Permission Settings // =========================== g_hCvarsList.CVAR_PERMISSIONS_USE_GROUPS = CreateConVar("zr_permissions_use_groups", "0", "Use group authentication instead of flags to access admin features. Generic admin flag is still required on some features."); + g_hCvarsList.CVAR_PERMISSIONS_FLAG_GENERIC = CreateConVar("zr_permissions_flag_generic", "d", "Admin flag used for generic admin operations when group authentication is disabled. ['d' = ban]", FCVAR_NONE); + g_hCvarsList.CVAR_PERMISSIONS_FLAG_CONFIGURATION = CreateConVar("zr_permissions_flag_configuration","i", "Admin flag used for configuration operations when group authentication is disabled. ['i' = config]", FCVAR_NONE); // =========================== @@ -610,4 +630,4 @@ public void CvarsHookRestartGame(ConVar cvar, const char[] oldvalue, const char[ // If log flag check fails, then don't log. LogEvent(false, LogType_Normal, LOG_CORE_EVENTS, LogModule_Cvars, "Restart Game", "\"mp_restartgame\" was caught and blocked, commencing round."); -} +} \ No newline at end of file diff --git a/src/addons/sourcemod/scripting/zr/hgversion.h.inc b/src/addons/sourcemod/scripting/zr/hgversion.h.inc index c527eb34..a0ea3264 100644 --- a/src/addons/sourcemod/scripting/zr/hgversion.h.inc +++ b/src/addons/sourcemod/scripting/zr/hgversion.h.inc @@ -4,7 +4,7 @@ #define ZR_VER_BRANCH "master" #define ZR_VER_MAJOR "3" #define ZR_VER_MINOR "13" -#define ZR_VER_PATCH "0" +#define ZR_VER_PATCH "1" #define ZR_VERSION ZR_VER_MAJOR..."."...ZR_VER_MINOR..."."...ZR_VER_PATCH #define ZR_VER_LICENSE "GNU GPL, Version 3" -#define ZR_VER_DATE "Sat May 23 CEST 2026" +#define ZR_VER_DATE "Thu Jun 18 CEST 2026" diff --git a/src/addons/sourcemod/scripting/zr/zadmin.inc b/src/addons/sourcemod/scripting/zr/zadmin.inc index 8452cf8d..735a3352 100644 --- a/src/addons/sourcemod/scripting/zr/zadmin.inc +++ b/src/addons/sourcemod/scripting/zr/zadmin.inc @@ -32,6 +32,7 @@ void ZAdminOnCommandsCreate() { // Register ZAdmin command. RegConsoleCmd(SAYHOOKS_KEYWORD_ZADMIN, ZAdminCommand, "Opens ZR admin menu."); + RegConsoleCmd("sm_zadmin", ZAdminCommand, "Opens ZR admin menu."); } /** diff --git a/src/addons/sourcemod/scripting/zr/zombiereloaded.inc b/src/addons/sourcemod/scripting/zr/zombiereloaded.inc index d699b405..6893035d 100644 --- a/src/addons/sourcemod/scripting/zr/zombiereloaded.inc +++ b/src/addons/sourcemod/scripting/zr/zombiereloaded.inc @@ -30,6 +30,12 @@ */ #define ZR_CONSOLE_INDEX 0 +/** + * Sentinel flag value used by ZRIsClientAdmin() to resolve the generic admin + * flag from configured permissions. + */ +#define ZR_ADMINFLAG_USE_CVAR view_as(-1) + /** * @section Conversion factors. */ @@ -343,10 +349,10 @@ stock bool ZRTeamHasClients(int team = -1) * Returns whether a player is a admin or not. * * @param client The client index. - * @param flag Optional. Flag to check. Default is generic admin flag. - * @return True if generic admin, false otherwise. + * @param flag Optional. Admin flag to check. Default resolves from configured generic permission flag. + * @return True if client has the requested admin flag, false otherwise. */ -stock bool ZRIsClientAdmin(int client, AdminFlag flag = Admin_Generic) +stock bool ZRIsClientAdmin(int client, AdminFlag flag = ZR_ADMINFLAG_USE_CVAR) { // If index is invalid, then stop. if (!ZRIsClientValid(client)) @@ -354,6 +360,12 @@ stock bool ZRIsClientAdmin(int client, AdminFlag flag = Admin_Generic) return false; } + // Keep default admin checks aligned with permission settings. + if (flag == ZR_ADMINFLAG_USE_CVAR) + { + flag = ZRResolveAdminFlag(CvarsGetPermissionFlagGeneric(), Admin_Ban); + } + // If client doesn't have the specified flag, then stop. if (!GetAdminFlag(GetUserAdmin(client), flag)) {