From 206c18db66b1a1c2254f9e54be41cbdf8d511249 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sun, 19 Oct 2025 16:06:03 +0200 Subject: [PATCH] Add permission override support for menus Menus can now specify a command name for permission override checking, allowing server admins to control menu visibility via CounterStrikeSharp's admin system. Updated API, MenuManager, and FunCommands module to support this feature. Also updated slap command to emit a sound, fixed SQL migration for IP address type, and bumped version to 1.7.8-beta-2. --- .github/workflows/build.yml | 6 +++ CS2-SimpleAdmin/Api/CS2_SimpleAdminApi.cs | 4 +- CS2-SimpleAdmin/CS2-SimpleAdmin.cs | 2 +- CS2-SimpleAdmin/Commands/playercommands.cs | 1 + .../Sqlite/009_BanAllUsedIpAddress.sql | 2 +- .../013_AddNameColumnToSaPlayerIpsTable.sql | 7 +-- CS2-SimpleAdmin/Menus/MenuManager.cs | 43 ++++++++++++++++-- CS2-SimpleAdmin/VERSION | 2 +- CS2-SimpleAdminApi/ICS2-SimpleAdminApi.cs | 8 +++- .../CS2-SimpleAdminApi.dll | Bin 11264 -> 11264 bytes .../CS2-SimpleAdmin_FunCommands.cs | 26 ++++++----- .../CS2-SimpleAdmin_FunCommands/Menus.cs | 20 ++++++++ 12 files changed, 94 insertions(+), 27 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 39f323b..220bc48 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,6 +16,8 @@ env: PROJECT_NAME_CS2_SIMPLEADMIN: "CS2-SimpleAdmin" PROJECT_PATH_CS2_SIMPLEADMINAPI: "CS2-SimpleAdminApi/CS2-SimpleAdminApi.csproj" PROJECT_NAME_CS2_SIMPLEADMINAPI: "CS2-SimpleAdminApi" + PROJECT_PATH_FUNCOMMANDSMODULE: "Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands.csproj" + PROJECT_NAME_FUNCOMMANDSMODULE: "CS2-SimpleAdmin_FunCommands" PROJECT_PATH_STEALTHMODULE: "Modules/CS2-SimpleAdmin_StealthModule/CS2-SimpleAdmin_StealthModule.csproj" PROJECT_NAME_STEALTHMODULE: "CS2-SimpleAdmin_StealthModule" OUTPUT_PATH: "./counterstrikesharp" @@ -45,16 +47,20 @@ jobs: dotnet build ${{ env.PROJECT_PATH_CS2_SIMPLEADMIN }} -c Release -o ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_CS2_SIMPLEADMIN }} dotnet restore ${{ env.PROJECT_PATH_CS2_SIMPLEADMINAPI }} dotnet build ${{ env.PROJECT_PATH_CS2_SIMPLEADMINAPI }} -c Release -o ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_CS2_SIMPLEADMINAPI }} + dotnet restore ${{ env.PROJECT_PATH_FUNCOMMANDSMODULE }} + dotnet build ${{ env.PROJECT_PATH_FUNCOMMANDSMODULE }} -c Release -o ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_FUNCOMMANDSMODULE }} dotnet restore ${{ env.PROJECT_PATH_STEALTHMODULE }} dotnet build ${{ env.PROJECT_PATH_STEALTHMODULE }} -c Release -o ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_STEALTHMODULE }} - name: Combine projects run: | mkdir -p ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin + mkdir -p ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin_FunCommands mkdir -p ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin_StealthModule mkdir -p ${{ env.OUTPUT_PATH }}/shared/CS2-SimpleAdminApi cp -r ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_CS2_SIMPLEADMIN }}/* ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin/ + cp -r ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_FUNCOMMANDSMODULE }}/* ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin_FunCommands cp -r ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_STEALTHMODULE }}/* ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin_StealthModule cp -r ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_CS2_SIMPLEADMINAPI }}/* ${{ env.OUTPUT_PATH }}/shared/CS2-SimpleAdminApi/ diff --git a/CS2-SimpleAdmin/Api/CS2_SimpleAdminApi.cs b/CS2-SimpleAdmin/Api/CS2_SimpleAdminApi.cs index 95c27db..5c6edef 100644 --- a/CS2-SimpleAdmin/Api/CS2_SimpleAdminApi.cs +++ b/CS2-SimpleAdmin/Api/CS2_SimpleAdminApi.cs @@ -206,9 +206,9 @@ public class CS2_SimpleAdminApi : ICS2_SimpleAdminApi } public void RegisterMenu(string categoryId, string menuId, string menuName, - Func menuFactory, string? permission = null) + Func menuFactory, string? permission = null, string? commandName = null) { - Menus.MenuManager.Instance.RegisterMenu(categoryId, menuId, menuName, BuilderFactory, permission); + Menus.MenuManager.Instance.RegisterMenu(categoryId, menuId, menuName, BuilderFactory, permission, commandName); return; MenuBuilder BuilderFactory(CCSPlayerController player) diff --git a/CS2-SimpleAdmin/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin/CS2-SimpleAdmin.cs index 825eb09..b70953c 100644 --- a/CS2-SimpleAdmin/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin/CS2-SimpleAdmin.cs @@ -22,7 +22,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)"); public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy & Dliix66"; - public override string ModuleVersion => "1.7.8-beta-1"; + public override string ModuleVersion => "1.7.8-beta-2"; public override void Load(bool hotReload) { diff --git a/CS2-SimpleAdmin/Commands/playercommands.cs b/CS2-SimpleAdmin/Commands/playercommands.cs index 25385b5..62270b7 100644 --- a/CS2-SimpleAdmin/Commands/playercommands.cs +++ b/CS2-SimpleAdmin/Commands/playercommands.cs @@ -120,6 +120,7 @@ public partial class CS2_SimpleAdmin // Apply slap damage to the player player.Pawn.Value?.Slap(damage); + player.EmitSound("BaseGrenade.JumpThrowM"); // Log the command if (command == null) diff --git a/CS2-SimpleAdmin/Database/Migrations/Sqlite/009_BanAllUsedIpAddress.sql b/CS2-SimpleAdmin/Database/Migrations/Sqlite/009_BanAllUsedIpAddress.sql index 7a141c5..33e57f2 100644 --- a/CS2-SimpleAdmin/Database/Migrations/Sqlite/009_BanAllUsedIpAddress.sql +++ b/CS2-SimpleAdmin/Database/Migrations/Sqlite/009_BanAllUsedIpAddress.sql @@ -1,6 +1,6 @@ CREATE TABLE IF NOT EXISTS `sa_players_ips` ( `steamid` INTEGER NOT NULL, - `address` VARCHAR(64) NOT NULL, + `address` INTEGER NOT NULL `used_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`steamid`, `address`) ); \ No newline at end of file diff --git a/CS2-SimpleAdmin/Database/Migrations/Sqlite/013_AddNameColumnToSaPlayerIpsTable.sql b/CS2-SimpleAdmin/Database/Migrations/Sqlite/013_AddNameColumnToSaPlayerIpsTable.sql index 0c70054..87a80aa 100644 --- a/CS2-SimpleAdmin/Database/Migrations/Sqlite/013_AddNameColumnToSaPlayerIpsTable.sql +++ b/CS2-SimpleAdmin/Database/Migrations/Sqlite/013_AddNameColumnToSaPlayerIpsTable.sql @@ -1,9 +1,4 @@ -DELETE FROM `sa_players_ips` -WHERE `id` NOT IN ( - SELECT MIN(`id`) - FROM `sa_players_ips` - GROUP BY `steamid` -); +TRUNCATE TABLE `sa_players_ips`; ALTER TABLE `sa_players_ips` ADD `name` VARCHAR(64) NULL DEFAULT NULL; CREATE INDEX IF NOT EXISTS `idx_sa_players_ips_used_at` ON `sa_players_ips` (`used_at` DESC); \ No newline at end of file diff --git a/CS2-SimpleAdmin/Menus/MenuManager.cs b/CS2-SimpleAdmin/Menus/MenuManager.cs index a9c8a36..f1aa450 100644 --- a/CS2-SimpleAdmin/Menus/MenuManager.cs +++ b/CS2-SimpleAdmin/Menus/MenuManager.cs @@ -46,7 +46,8 @@ public class MenuManager /// Display name of the menu. /// Factory function that creates the menu for a player. /// Required permission to access this menu (optional). - public void RegisterMenu(string categoryId, string menuId, string menuName, Func menuFactory, string? permission = null) + /// Command name for permission override checking (optional, e.g., "css_god"). + public void RegisterMenu(string categoryId, string menuId, string menuName, Func menuFactory, string? permission = null, string? commandName = null) { if (!_menuCategories.ContainsKey(categoryId)) { @@ -59,6 +60,10 @@ public class MenuManager { _menuCategories[categoryId].MenuPermissions[menuId] = permission; } + if (commandName != null) + { + _menuCategories[categoryId].MenuCommandNames[menuId] = commandName; + } } /// @@ -72,6 +77,7 @@ public class MenuManager category.MenuFactories.Remove(menuId); _menuCategories[categoryId].MenuNames.Remove(menuId); _menuCategories[categoryId].MenuPermissions.Remove(menuId); + _menuCategories[categoryId].MenuCommandNames.Remove(menuId); } /// @@ -116,11 +122,39 @@ public class MenuManager var menuFactory = kvp.Value; var menuName = category.MenuNames.TryGetValue(menuId, out var name) ? name : menuId; var permission = category.MenuPermissions.TryGetValue(menuId, out var perm) ? perm : null; + var commandName = category.MenuCommandNames.TryGetValue(menuId, out var cmd) ? cmd : null; - // Check permissions - if (!string.IsNullOrEmpty(permission)) + // Check permissions with command override support + var steamId = new SteamID(player.SteamID); + + // If commandName is provided, check for permission overrides + if (!string.IsNullOrEmpty(commandName)) + { + bool hasPermission; + + // Check if command has overridden permissions + if (AdminManager.CommandIsOverriden(commandName)) + { + var overriddenPermission = AdminManager.GetPermissionOverrides(commandName); + hasPermission = AdminManager.PlayerHasPermissions(steamId, overriddenPermission); + } + else if (!string.IsNullOrEmpty(permission)) + { + // Use default permission if no override exists + hasPermission = AdminManager.PlayerHasPermissions(steamId, permission); + } + else + { + // No permission required + hasPermission = true; + } + + if (!hasPermission) + continue; + } + // Fallback to standard permission check if no commandName provided + else if (!string.IsNullOrEmpty(permission)) { - var steamId = new SteamID(player.SteamID); if (!AdminManager.PlayerHasPermissions(steamId, permission)) continue; } @@ -187,4 +221,5 @@ public class MenuCategory public Dictionary> MenuFactories { get; set; } = []; public Dictionary MenuNames { get; set; } = []; public Dictionary MenuPermissions { get; set; } = []; + public Dictionary MenuCommandNames { get; set; } = []; } diff --git a/CS2-SimpleAdmin/VERSION b/CS2-SimpleAdmin/VERSION index 1109b0c..2b32a27 100644 --- a/CS2-SimpleAdmin/VERSION +++ b/CS2-SimpleAdmin/VERSION @@ -1 +1 @@ -1.7.8-beta-1 \ No newline at end of file +1.7.8-beta-2 \ No newline at end of file diff --git a/CS2-SimpleAdminApi/ICS2-SimpleAdminApi.cs b/CS2-SimpleAdminApi/ICS2-SimpleAdminApi.cs index 9048c92..d8d4cb0 100644 --- a/CS2-SimpleAdminApi/ICS2-SimpleAdminApi.cs +++ b/CS2-SimpleAdminApi/ICS2-SimpleAdminApi.cs @@ -143,7 +143,13 @@ public interface ICS2_SimpleAdminApi /// /// Registers a menu in a category. /// - void RegisterMenu(string categoryId, string menuId, string menuName, Func menuFactory, string? permission = null); + /// The category to add this menu to. + /// Unique identifier for the menu. + /// Display name of the menu. + /// Factory function that creates the menu for a player. + /// Required permission to access this menu (optional). + /// Command name for permission override checking (optional, e.g., "css_god"). + void RegisterMenu(string categoryId, string menuId, string menuName, Func menuFactory, string? permission = null, string? commandName = null); /// /// Unregisters a menu from a category. diff --git a/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdminApi.dll b/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdminApi.dll index 45fa7565ff64acfb265259725fa1269af40b6ee8..f3ca13398292ab5eef49aa8e44524bd2e9a3dbb6 100644 GIT binary patch delta 3066 zcmZ{meQ*?a8OOiB-QT|4ZgSZRrX;3q?wUxN5NIwyUJBSmpqLg?Fi;a9B`=rQg29#$ zq+{jsLW3cclI|bUX)B3ErmR1J)8LOimrfRLDPV4h~ZgYSm zo4LYmcw6?$D5x2^7z4P#gE3PJ}vrvAxe#14ZsFJrd9Z@qE!6M z9~4P3Z){>hS>)H>~;sCywBDBcT{gn@lo6gThMdC!i|^ns42K1x2Fi#Imo zRf;_ouin_WlFo1Xd2(rX7e&|5kCN!~+hkdCyCo|}tiTe!2@5-Vqa=6WWZu2ivwfvklM3sY36c|cc z4t#WnOzdIneMcqMQtV(JmXZG?UFKlDJtR#`Q*&Y5iSHncBBF^dzUos_)mPdn>L6|o zSz+W+c0VdCz(K@)jwVpYm08SD9z;FG$z0rv!?s$10}3=Ifk|39!!qe&r35X|HfdUu z&}c}4a<|x~)rL@@-lNJk%*Dr1jd0dBVVcikr?_+AkkwD@VSYubc*sH#kI^pA$>=#LCv&vXz9~XK?O_(Qy%&61;q**B5@?SDnt!~ING-o!G-Ac;M zsO#N`Mz;zduVhz~qMInKj9poU8r@2>%5SvF#7%ymRhF~fZPRYdWPaj5ZIvZ0w_jV3 z@p_!S+D#etdw2h3YS2BTRb_IA+@o4;Mip3J({9eF-OdSZc}6+*542BYRImHGwmPHs zB;6Tp4c0}KGoC+c|5|326$OF%Hsv-U7N}{;Z9;jV z{%vdeW>f_#n{u16G*HVOP2YkQfm-7TY{8m9t+L#t-i8fW5bcbsrg0lz ze2(^uxFUYd^*jv~((`oufrcybCOz5&F6vkM0)5~@-j;; zkwiBQ!oUZ#^97!u9j`$RMaL;>RN^s_?%;p3f1~;RzifJXf2WyfxSLwjae-pVZ5nvi zNve@b$MY;a9r8RIzaWNCM0Bv32XVFk>m`47oh~`EcZuM|cV!5}HqD=CqJZe2jOZbL zH=pX54a`R7dS)y09%3HuBbvCMDClJ~Y!_lQ!zg~v*$c!3B0^PGQ0!qb`!8bHKatf{ zn2Xe7r+k1cPdpBA2)VMa0|LZzk4r`}N%Z3W^WP+o+cx%56zL z4YM^&-8>@q(W~?baTqVj1Du`W?!V5QW@m;8p@u7kYADKaj9J1?J;x2qmF%>0+`&w+ zGa!^DDXw%Br(HF)X;%$xhT|EI zZTdu+rrU-#G0wP+#8E-dA8ZurUEQ9g-n`4*T-suSws8)rcd&*YUtR77;&0GG{G@Cn zKIJI>D@6Xym{2F2Wk#6m9OZ1WI*8vB-Ng5-K4Q60&Ofa^L__ZJ2fcUa{FO#PJ1uj3 z5u5!7Bc=J}{QYoc<{){gmm{Up{9JEu$Bsnmt-L|oyW>=iUQxb$?O6M31>3)698K-I z{*dN*QB#D&;k?{|N44DEYs0BXY)sr(Q@bc$8?UVD>8?)HRrho)sqKmPRMo^29ZMD` zIyyURDr@WN5{qm7=^OmK*wKgo1F?3U`u-WA-`NKG`Mt$+jVAgiX!1vki@nr?n_k#? z^5LeD>4MaCTNkYNPZ!@`6_^Xnz*G$lee9XD(FZ<%;EhGGMNiCrQ&6MNt2jCyyGBf< z_Lkf$QsH^k`W-c>rF|GD#!-nX^q`wQ=o0kZSWR&kmQbdLay^u*p>qNq4KFOORXZ`(^#wt5vB;`9(2aY5f;d?-^qN delta 3010 zcmZ{m4@_0p9ml`t-gE!F`yP)A1k_>Wy@FC`=imvYl-jD z$@|>j_xtB8Pj1xaTFQIv=z8R39h`^d&3@ z9$Et?9%Jjzj!LYj*ugTCkUvS6IjFPyq>0z4T^O73bA*vcG!f^k)<{)fVE=#ySZelJ zVPsQw6cGz>U<8k;FTj-{<^WHkn&Lzzc442bR^Vv`nv=j3t=uQ(4Kt|(Ezov(!<>Rf zQxcS0Vc#&@5b)JCOQ{7|g}b4JdW31dirr%K;FDG_aSQXiQpJ6y;#FNS&+Zjb6nnba zRryTth#G{CvuP(uY4ge`v5yKpr4E@Vg-oeeyeTtRT=afn)~ziM(X!8H($1>3YcQkgfrA6i9;e>=U}7gOFA zXRr39l=@w8^fRhActDG#a!&?d&?-_Y&6?IKQ>w=~q1~5K|FPyY+6#P~H9CUlwKXaA zXd?JWZ5=j7lryn#zy5fo9lI&@o~UQL+WDuMP$TTCm7h$0^r}sIOk5Tq}xw zb=?;F7Q}odD7OVwzAANuz7?x|RqY6D#RI;ow48*#4V!%VfE6ay=BsIurMIEWSFekx zz8yP#b-^mpA3~q6-m}U{C499=IC?uqeYH%4NgYfoTG1-K14sSbIjc@j#PPB(g{;%# zv0@>P6u_Oq3@iq%ybMrh;e=%HI(VxjH21}4c72?S_o+%k<-eDS-q zU&KxEuY#_tAtGH@#~*0A62GNKo4|GbW?$f8?x5;*u9sYI`1PBU->HV?r6EM6I!e^M zpq%6(kQ_cNR81KVxu0v2j(XhcxRbxxKWP{P`z^0HxHyq)ox!bDsm_Za(MrP@_=xtl zzy$4SjR({5Bg=Iq4vS=q&u6bv>;IQcj`DY!tA=gVO~+-5C2A5huz{nF>zepD;JOxG zB-%Jj3?Pf>U;|I$R{yzA{rQ#n)S15z{y{6DAt(drw*@kYCcTUL=>eZ8qLYhKW+k(R zSHv5PYHf5x;C!U$}7ppV1$ zei>@a)u?s`naCC+G|iH<4KhOYy3r%}$y9_Da@ ztzjBwLhhs2<|J_#r{vR|p5ft-Gw0a3!h}%Ml|nU&a2#b8uv5)(4YQV=c8)uko$L&9 zJR}}ejmCtBxE!NILLTA7lu+M$isKoM&j__nXV`gzd5N7%9A9Q$QI+0Q__jrHIi#s> zLz?QpPvdTi-o@~3c@45wSI#u^ihh`C3M4y2Guv54yrlLaXiPdO}{th=)R!MiJt`P ziDQBuCTJ4s#k(n_UZbVKOxjI?wo*E&zhE6bi<*Ot#JAB*yiaZ;KJO@g7$E;%98xEo zVj9d^M>!jqx4cYH`?q9S1L^Gf#MCus825&N>FlULH)8{gS z&g}0q3gv7d=Ly@5yg2;m=;@W!-`~Cy9~ZTX*+WYXXzA$@LxjWO?99REw9KzBo{dGv z#T~J(&W?CIwqr$iSA0chd1YrutgN!5;+}X}SyxAQNxU=`EA5VzcYE*M?&aWKdGQ&D z^&8c1m=XFMtD%qgo%{vH@~;5Py_x)cccoama_u*My=LU}`1WVN_tGccJNb{te6w$j zZ&IV2iUUWNojbpGYtQJaGXr$_{4uHG$V4~4KS3|;6%2kpx^ zV%S0Zt(%-UojXxZzXDY*M$dstI#=Kx%9PPx7pZQPkSe8YjMz;qN4Mt{^=c<#vl+$L I#YBnqKWv~5^#A|> diff --git a/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands.cs b/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands.cs index d7d6238..43e9470 100644 --- a/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands.cs +++ b/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands.cs @@ -368,60 +368,64 @@ public partial class CS2_SimpleAdmin_FunCommands : BasePlugin, IPluginConfig 0) _sharedApi.RegisterMenu("fun", "god", Localizer?["fun_menu_god"] ?? "God Mode", - CreateGodModeMenu, "@css/cheats"); + CreateGodModeMenu, "@css/cheats", "css_god"); if (Config.NoclipCommands.Count > 0) _sharedApi.RegisterMenu("fun", "noclip", Localizer?["fun_menu_noclip"] ?? "No Clip", - CreateNoClipMenu, "@css/cheats"); + CreateNoClipMenu, "@css/cheats", "css_noclip"); if (Config.RespawnCommands.Count > 0) _sharedApi.RegisterMenu("fun", "respawn", Localizer?["fun_menu_respawn"] ?? "Respawn", - CreateRespawnMenu, "@css/cheats"); + CreateRespawnMenu, "@css/cheats", "css_respawn"); if (Config.GiveCommands.Count > 0) _sharedApi.RegisterMenu("fun", "give", Localizer?["fun_menu_give"] ?? "Give Weapon", - CreateGiveWeaponMenu, "@css/cheats"); + CreateGiveWeaponMenu, "@css/cheats", "css_give"); if (Config.StripCommands.Count > 0) _sharedApi.RegisterMenu("fun", "strip", Localizer?["fun_menu_strip"] ?? "Strip Weapons", - CreateStripWeaponsMenu, "@css/slay"); + CreateStripWeaponsMenu, "@css/slay", "css_strip"); if (Config.FreezeCommands.Count > 0) _sharedApi.RegisterMenu("fun", "freeze", Localizer?["fun_menu_freeze"] ?? "Freeze", - CreateFreezeMenu, "@css/slay"); + CreateFreezeMenu, "@css/slay", "css_freeze"); if (Config.HpCommands.Count > 0) _sharedApi.RegisterMenu("fun", "hp", Localizer?["fun_menu_hp"] ?? "Set HP", - CreateSetHpMenu, "@css/slay"); + CreateSetHpMenu, "@css/slay", "css_hp"); if (Config.SpeedCommands.Count > 0) _sharedApi.RegisterMenu("fun", "speed", Localizer?["fun_menu_speed"] ?? "Set Speed", - CreateSetSpeedMenu, "@css/slay"); + CreateSetSpeedMenu, "@css/slay", "css_speed"); if (Config.GravityCommands.Count > 0) _sharedApi.RegisterMenu("fun", "gravity", Localizer?["fun_menu_gravity"] ?? "Set Gravity", - CreateSetGravityMenu, "@css/slay"); + CreateSetGravityMenu, "@css/slay", "css_gravity"); if (Config.MoneyCommands.Count > 0) _sharedApi.RegisterMenu("fun", "money", Localizer?["fun_menu_money"] ?? "Set Money", - CreateSetMoneyMenu, "@css/slay"); + CreateSetMoneyMenu, "@css/slay", "css_money"); if (Config.ResizeCommands.Count > 0) _sharedApi.RegisterMenu("fun", "resize", Localizer?["fun_menu_resize"] ?? "Resize Player", - CreateSetResizeMenu, "@css/slay"); + CreateSetResizeMenu, "@css/slay", "css_resize"); _menusRegistered = true; Logger.LogInformation("Fun menus registered successfully!"); diff --git a/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/Menus.cs b/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/Menus.cs index b479fe8..06cd63d 100644 --- a/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/Menus.cs +++ b/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/Menus.cs @@ -7,6 +7,26 @@ namespace CS2_SimpleAdmin_FunCommands; /// /// Menu creation methods for Fun Commands module. /// This file demonstrates different menu patterns using SimpleAdmin API. +/// +/// PERMISSION OVERRIDE SUPPORT: +/// ============================ +/// When registering menus in RegisterFunMenus(), you can pass a command name (e.g., "css_god") +/// as the last parameter. This enables automatic permission override checking via CounterStrikeSharp's +/// admin system. +/// +/// How it works: +/// 1. Server admin overrides a command's permissions (e.g., css_god requires @css/vip instead of @css/cheats) +/// 2. SimpleAdmin's menu system automatically checks for overrides when displaying menus +/// 3. If override exists, it uses the overridden permission; otherwise, uses the default permission +/// +/// Example from RegisterFunMenus(): +/// _sharedApi.RegisterMenu("fun", "god", +/// Localizer?["fun_menu_god"] ?? "God Mode", +/// CreateGodModeMenu, +/// "@css/cheats", // Default permission +/// "css_god"); // Command name for override checking +/// +/// This means developers don't need to manually check permissions in their menu factory methods! /// public partial class CS2_SimpleAdmin_FunCommands {