@@ -249,7 +249,7 @@ private void handleModuleGuiClick(InventoryClickEvent event, Player player) {
249249 }
250250
251251 if (rawSlot == nextSlot ) {
252- List <Module > modules = getModulesForCategory (guiHolder .categoryKey );
252+ List <Module > modules = getModulesForCategory (player , guiHolder .categoryKey );
253253 List <Integer > moduleSlots = layout .moduleSlots ();
254254 int pageSize = Math .max (1 , moduleSlots .size ());
255255 int maxPage = Math .max (0 , (int ) Math .ceil ((double ) modules .size () / pageSize ) - 1 );
@@ -284,7 +284,7 @@ private void handleModuleGuiClick(InventoryClickEvent event, Player player) {
284284 if (isSinglePage ) {
285285 int catIdx = layout .categorySlots ().indexOf (rawSlot );
286286 if (catIdx >= 0 ) {
287- List <CategoryEntry > categories = getVisibleCategories ();
287+ List <CategoryEntry > categories = getVisibleCategories (player );
288288
289289 if (catIdx < categories .size ()) {
290290 openGui (player , categories .get (catIdx ).key (), 0 , GuiView .MODULES );
@@ -302,7 +302,7 @@ private void handleModuleGuiClick(InventoryClickEvent event, Player player) {
302302 syncInventory (player );
303303 return ;
304304 }
305- List <CategoryEntry > categories = getVisibleCategories ();
305+ List <CategoryEntry > categories = getVisibleCategories (player );
306306 int categoryIndex = guiHolder .page * contentSlots .size () + idxInPage ;
307307 if (categoryIndex < 0 || categoryIndex >= categories .size ()) {
308308 syncInventory (player );
@@ -314,14 +314,20 @@ private void handleModuleGuiClick(InventoryClickEvent event, Player player) {
314314 }
315315
316316 if (guiHolder .view == GuiView .MODULES ) {
317- List <Module > modules = getModulesForCategory (guiHolder .categoryKey );
317+ List <Module > modules = getModulesForCategory (player , guiHolder .categoryKey );
318318 Integer globalIdx = guiHolder .slotToGlobalModuleIndex .get (rawSlot );
319319 if (globalIdx == null || globalIdx < 0 || globalIdx >= modules .size ()) {
320320 syncInventory (player );
321321 return ;
322322 }
323323
324324 Module module = modules .get (globalIdx );
325+ if (!plugin .getPlayerModulePreferences ().hasTogglePermission (player , module )) {
326+ player .sendMessage (color (getString ("messages.no-module-toggle-permission" , "&cYou do not have permission to toggle this module." )));
327+ syncInventory (player );
328+ return ;
329+ }
330+
325331 boolean enabled = plugin .getPlayerModulePreferences ().toggleFor (player , module );
326332
327333 String msg = color (getString ("messages.toggle" , "&e%module% &7-> %state%" ))
@@ -459,13 +465,13 @@ private void openGui(Player player, String categoryKey, int requestedPage, GuiVi
459465 String activeCategory = categoryKey ;
460466 if (view == GuiView .MODULES && isCategoriesEnabled ()) {
461467 if (activeCategory == null || activeCategory .isBlank () || "all" .equalsIgnoreCase (activeCategory )) {
462- activeCategory = resolveDefaultCategoryKey ();
468+ activeCategory = resolveDefaultCategoryKey (player );
463469 }
464470 }
465471
466472 int entryCount = (view == GuiView .CATEGORIES && !isSinglePage )
467- ? getVisibleCategories ().size ()
468- : getModulesForCategory (activeCategory ).size ();
473+ ? getVisibleCategories (player ).size ()
474+ : getModulesForCategory (player , activeCategory ).size ();
469475 int totalPages = Math .max (1 , (int ) Math .ceil ((double ) entryCount / pageSize ));
470476 int page = Math .max (0 , Math .min (requestedPage , totalPages - 1 ));
471477
@@ -480,7 +486,7 @@ private void openGui(Player player, String categoryKey, int requestedPage, GuiVi
480486 int start = page * pageSize ;
481487
482488 List <Module > modulesForView = view == GuiView .MODULES
483- ? getModulesForCategory (activeCategory )
489+ ? getModulesForCategory (player , activeCategory )
484490 : List .of ();
485491 Map <Integer , Integer > moduleSlotIndexMap = view == GuiView .MODULES
486492 ? computeModulePlacements (modulesForView , start , pageSize , contentSlots , readModuleSlotOverrides ())
@@ -495,7 +501,7 @@ private void openGui(Player player, String categoryKey, int requestedPage, GuiVi
495501 }
496502
497503 if (isSinglePage ) {
498- List <CategoryEntry > categories = getVisibleCategories ();
504+ List <CategoryEntry > categories = getVisibleCategories (player );
499505
500506 for (int i = 0 ; i < layout .categorySlots ().size (); i ++) {
501507 if (i >= categories .size ()) {
@@ -521,7 +527,7 @@ private void openGui(Player player, String categoryKey, int requestedPage, GuiVi
521527 inv .setItem (invSlot , buildModuleItem (player , modulesForView .get (modIdx )));
522528 }
523529 } else if (view == GuiView .CATEGORIES ) {
524- List <CategoryEntry > categories = getVisibleCategories ();
530+ List <CategoryEntry > categories = getVisibleCategories (player );
525531 for (int i = 0 ; i < pageSize ; i ++) {
526532 int categoryIndex = start + i ;
527533 if (categoryIndex >= categories .size ()) {
@@ -982,29 +988,30 @@ private boolean isModuleGui(Inventory inventory) {
982988 return inventory != null && inventory .getHolder () instanceof ModuleGuiHolder ;
983989 }
984990
985- private List <Module > getModules () {
991+ private List <Module > getModules (Player player ) {
986992 return plugin .getModuleManager ().getPlayerScopedModules ().stream ()
987993 .filter (module -> module .isEnabledByConfig (plugin .getConfig ()))
994+ .filter (module -> plugin .getPlayerModulePreferences ().hasTogglePermission (player , module ))
988995 .sorted (Comparator .comparing (Module ::getName , String .CASE_INSENSITIVE_ORDER ))
989996 .collect (Collectors .toList ());
990997 }
991998
992- public List <Module > getModulesForCategory (String categoryKey ) {
999+ public List <Module > getModulesForCategory (Player player , String categoryKey ) {
9931000 if (!isCategoriesEnabled ()) {
9941001 if (categoryKey == null || categoryKey .isBlank () || "all" .equalsIgnoreCase (categoryKey )) {
995- return getModules ();
1002+ return getModules (player );
9961003 }
9971004 } else {
9981005 if (categoryKey == null || categoryKey .isBlank () || "all" .equalsIgnoreCase (categoryKey )) {
999- String def = resolveDefaultCategoryKey ();
1006+ String def = resolveDefaultCategoryKey (player );
10001007 if (def == null ) {
10011008 return List .of ();
10021009 }
10031010 categoryKey = def ;
10041011 }
10051012 }
10061013 final String resolvedKey = categoryKey ;
1007- return getModules ().stream ()
1014+ return getModules (player ).stream ()
10081015 .filter (module -> resolveModuleCategoryKey (module ).equalsIgnoreCase (resolvedKey ))
10091016 .collect (Collectors .toList ());
10101017 }
@@ -1018,17 +1025,13 @@ public String getCategoryDisplayName(String categoryKey) {
10181025 if (!isCategoriesEnabled ()) {
10191026 return color (getString ("gui.modules-aggregate-display" , "&fModules" ));
10201027 }
1021- String def = resolveDefaultCategoryKey ();
1022- if (def != null ) {
1023- return color (getString ("gui.categories.items." + def + ".display-name" , toTitleCase (def .replace ('-' , ' ' ))));
1024- }
10251028 return color (getString ("gui.modules-empty-display" , "&fModules" ));
10261029 }
10271030 return color (getString ("gui.categories.items." + categoryKey + ".display-name" , toTitleCase (categoryKey .replace ('-' , ' ' ))));
10281031 }
10291032
1030- private String resolveDefaultCategoryKey () {
1031- List <CategoryEntry > visible = getVisibleCategories ();
1033+ private String resolveDefaultCategoryKey (Player player ) {
1034+ List <CategoryEntry > visible = getVisibleCategories (player );
10321035 return visible .isEmpty () ? null : visible .get (0 ).key ();
10331036 }
10341037
@@ -1055,9 +1058,9 @@ private String normalizeCategoryKey(String value) {
10551058 return value .toLowerCase (Locale .ROOT ).replaceAll ("[^a-z0-9-]" , "-" );
10561059 }
10571060
1058- public List <CategoryEntry > getVisibleCategories () {
1061+ public List <CategoryEntry > getVisibleCategories (Player player ) {
10591062 Map <String , Long > counts = new HashMap <>();
1060- for (Module module : getModules ()) {
1063+ for (Module module : getModules (player )) {
10611064 counts .merge (resolveModuleCategoryKey (module ), 1L , Long ::sum );
10621065 }
10631066
0 commit comments