From 0a424be0621f1067afb5683ed93cfabd3b51cf80 Mon Sep 17 00:00:00 2001 From: Ome_R Date: Sat, 30 Apr 2022 19:43:20 +0300 Subject: [PATCH] Added the ability to change the way members are sorted in top islands (#1087) --- .../api/config/SettingsManager.java | 7 ++++ .../api/enums/TopIslandMembersSorting.java | 38 +++++++++++++++++++ .../SuperiorSkyblockPlugin.java | 9 +++++ .../config/SettingsContainer.java | 9 +++++ .../config/SettingsHandler.java | 6 +++ .../menu/TopIslandsPagedObjectButton.java | 4 ++ .../utils/islands/SortingComparators.java | 11 ++++++ src/main/resources/config.yml | 8 +++- 8 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 API/src/main/java/com/bgsoftware/superiorskyblock/api/enums/TopIslandMembersSorting.java diff --git a/API/src/main/java/com/bgsoftware/superiorskyblock/api/config/SettingsManager.java b/API/src/main/java/com/bgsoftware/superiorskyblock/api/config/SettingsManager.java index 967c95e8c..6ff808bac 100644 --- a/API/src/main/java/com/bgsoftware/superiorskyblock/api/config/SettingsManager.java +++ b/API/src/main/java/com/bgsoftware/superiorskyblock/api/config/SettingsManager.java @@ -1,5 +1,6 @@ package com.bgsoftware.superiorskyblock.api.config; +import com.bgsoftware.superiorskyblock.api.enums.TopIslandMembersSorting; import com.bgsoftware.superiorskyblock.api.handlers.BlockValuesManager; import com.bgsoftware.superiorskyblock.api.key.Key; import com.bgsoftware.superiorskyblock.api.objects.Pair; @@ -562,6 +563,12 @@ public interface SettingsManager { */ boolean isAutoUncoopWhenAlone(); + /** + * Get the way to sort members in the top islands menu. + * Config-path: island-top-members-sorting + */ + TopIslandMembersSorting getTopIslandMembersSorting(); + interface Database { /** diff --git a/API/src/main/java/com/bgsoftware/superiorskyblock/api/enums/TopIslandMembersSorting.java b/API/src/main/java/com/bgsoftware/superiorskyblock/api/enums/TopIslandMembersSorting.java new file mode 100644 index 000000000..a3213747a --- /dev/null +++ b/API/src/main/java/com/bgsoftware/superiorskyblock/api/enums/TopIslandMembersSorting.java @@ -0,0 +1,38 @@ +package com.bgsoftware.superiorskyblock.api.enums; + +import com.bgsoftware.superiorskyblock.api.wrappers.SuperiorPlayer; + +import java.util.Comparator; + +public enum TopIslandMembersSorting { + + /** + * Sort members in the top-islands menu by their names. + */ + NAMES, + + /** + * Sort members in the top-islands menu by their roles. + */ + ROLES; + + private Comparator comparator = null; + + TopIslandMembersSorting() { + } + + public void setComparator(Comparator comparator) { + if (this.comparator != null) + throw new IllegalArgumentException("You cannot set a comparator after it was already been set."); + + this.comparator = comparator; + } + + public Comparator getComparator() { + if (this.comparator == null) + throw new RuntimeException(this + " was not initialized."); + + return comparator; + } + +} diff --git a/src/main/java/com/bgsoftware/superiorskyblock/SuperiorSkyblockPlugin.java b/src/main/java/com/bgsoftware/superiorskyblock/SuperiorSkyblockPlugin.java index 82a2d7c8c..78f4d0412 100644 --- a/src/main/java/com/bgsoftware/superiorskyblock/SuperiorSkyblockPlugin.java +++ b/src/main/java/com/bgsoftware/superiorskyblock/SuperiorSkyblockPlugin.java @@ -68,6 +68,7 @@ import com.bgsoftware.superiorskyblock.utils.FileUtils; import com.bgsoftware.superiorskyblock.utils.debug.PluginDebugger; import com.bgsoftware.superiorskyblock.utils.events.EventsBus; +import com.bgsoftware.superiorskyblock.utils.islands.SortingComparators; import com.bgsoftware.superiorskyblock.utils.islands.SortingTypes; import com.bgsoftware.superiorskyblock.utils.items.EnchantsUtils; import com.bgsoftware.superiorskyblock.utils.items.HeadUtils; @@ -194,6 +195,14 @@ public void onLoad() { SortingTypes.registerSortingTypes(); IslandFlags.registerFlags(); + try { + SortingComparators.initializeTopIslandMembersSorting(); + } catch (IllegalArgumentException error) { + shouldEnable = false; + log("&cThe TopIslandMembersSorting was already initialized. " + + "This can be caused by a reload or another plugin initializing it."); + } + this.servicesHandler.registerPlaceholdersService(new PlaceholdersServiceImpl()); this.servicesHandler.registerHologramsService(new HologramsServiceImpl(this)); this.servicesHandler.registerEnderDragonService(new DragonBattleServiceImpl(this)); diff --git a/src/main/java/com/bgsoftware/superiorskyblock/config/SettingsContainer.java b/src/main/java/com/bgsoftware/superiorskyblock/config/SettingsContainer.java index 07eac1dee..4da79b383 100644 --- a/src/main/java/com/bgsoftware/superiorskyblock/config/SettingsContainer.java +++ b/src/main/java/com/bgsoftware/superiorskyblock/config/SettingsContainer.java @@ -2,6 +2,7 @@ import com.bgsoftware.common.config.CommentedConfiguration; import com.bgsoftware.superiorskyblock.SuperiorSkyblockPlugin; +import com.bgsoftware.superiorskyblock.api.enums.TopIslandMembersSorting; import com.bgsoftware.superiorskyblock.api.key.Key; import com.bgsoftware.superiorskyblock.api.key.KeyMap; import com.bgsoftware.superiorskyblock.api.key.KeySet; @@ -199,6 +200,7 @@ public final class SettingsContainer { public final long recalcTaskTimeout; public final boolean autoLanguageDetection; public final boolean autoUncoopWhenAlone; + public final TopIslandMembersSorting islandTopMembersSorting; public SettingsContainer(SuperiorSkyblockPlugin plugin, YamlConfiguration config) throws HandlerLoadException { databaseType = config.getString("database.type").toUpperCase(Locale.ENGLISH); @@ -503,6 +505,13 @@ else if (sections.length == 3) recalcTaskTimeout = config.getLong("recalc-task-timeout"); autoLanguageDetection = config.getBoolean("auto-language-detection", true); autoUncoopWhenAlone = config.getBoolean("auto-uncoop-when-alone", false); + TopIslandMembersSorting islandTopMembersSorting; + try { + islandTopMembersSorting = TopIslandMembersSorting.valueOf(config.getString("island-top-members-sorting").toUpperCase()); + } catch (IllegalArgumentException error) { + islandTopMembersSorting = TopIslandMembersSorting.NAMES; + } + this.islandTopMembersSorting = islandTopMembersSorting; } private List loadInteractables(SuperiorSkyblockPlugin plugin) { diff --git a/src/main/java/com/bgsoftware/superiorskyblock/config/SettingsHandler.java b/src/main/java/com/bgsoftware/superiorskyblock/config/SettingsHandler.java index 02bfd943c..e64590abf 100644 --- a/src/main/java/com/bgsoftware/superiorskyblock/config/SettingsHandler.java +++ b/src/main/java/com/bgsoftware/superiorskyblock/config/SettingsHandler.java @@ -3,6 +3,7 @@ import com.bgsoftware.common.config.CommentedConfiguration; import com.bgsoftware.superiorskyblock.SuperiorSkyblockPlugin; import com.bgsoftware.superiorskyblock.api.config.SettingsManager; +import com.bgsoftware.superiorskyblock.api.enums.TopIslandMembersSorting; import com.bgsoftware.superiorskyblock.api.handlers.BlockValuesManager; import com.bgsoftware.superiorskyblock.api.key.Key; import com.bgsoftware.superiorskyblock.api.objects.Pair; @@ -529,6 +530,11 @@ public boolean isAutoUncoopWhenAlone() { return this.container.autoUncoopWhenAlone; } + @Override + public TopIslandMembersSorting getTopIslandMembersSorting() { + return this.container.islandTopMembersSorting; + } + public void updateValue(String path, Object value) throws IOException { SuperiorSkyblockPlugin plugin = SuperiorSkyblockPlugin.getPlugin(); File file = new File(plugin.getDataFolder(), "config.yml"); diff --git a/src/main/java/com/bgsoftware/superiorskyblock/menu/button/impl/menu/TopIslandsPagedObjectButton.java b/src/main/java/com/bgsoftware/superiorskyblock/menu/button/impl/menu/TopIslandsPagedObjectButton.java index 8b5172ab3..b8933a24b 100644 --- a/src/main/java/com/bgsoftware/superiorskyblock/menu/button/impl/menu/TopIslandsPagedObjectButton.java +++ b/src/main/java/com/bgsoftware/superiorskyblock/menu/button/impl/menu/TopIslandsPagedObjectButton.java @@ -1,6 +1,7 @@ package com.bgsoftware.superiorskyblock.menu.button.impl.menu; import com.bgsoftware.superiorskyblock.SuperiorSkyblockPlugin; +import com.bgsoftware.superiorskyblock.api.enums.TopIslandMembersSorting; import com.bgsoftware.superiorskyblock.api.island.Island; import com.bgsoftware.superiorskyblock.api.service.placeholders.PlaceholdersService; import com.bgsoftware.superiorskyblock.api.wrappers.SuperiorPlayer; @@ -100,6 +101,9 @@ public ItemStack modifyButtonItem(ItemStack buttonItem, MenuTopIslands superiorM } else { PlaceholdersService placeholdersService = plugin.getServices().getPlaceholdersService(); + if (plugin.getSettings().getTopIslandMembersSorting() != TopIslandMembersSorting.NAMES) + members.sort(plugin.getSettings().getTopIslandMembersSorting().getComparator()); + members.forEach(member -> { String onlineMessage = member.isOnline() ? Message.ISLAND_TOP_STATUS_ONLINE.getMessage(inventoryViewer.getUserLocale()) : diff --git a/src/main/java/com/bgsoftware/superiorskyblock/utils/islands/SortingComparators.java b/src/main/java/com/bgsoftware/superiorskyblock/utils/islands/SortingComparators.java index e7c0b6bf2..ce8eff43f 100644 --- a/src/main/java/com/bgsoftware/superiorskyblock/utils/islands/SortingComparators.java +++ b/src/main/java/com/bgsoftware/superiorskyblock/utils/islands/SortingComparators.java @@ -1,5 +1,6 @@ package com.bgsoftware.superiorskyblock.utils.islands; +import com.bgsoftware.superiorskyblock.api.enums.TopIslandMembersSorting; import com.bgsoftware.superiorskyblock.api.island.Island; import com.bgsoftware.superiorskyblock.api.island.bank.BankTransaction; import com.bgsoftware.superiorskyblock.api.wrappers.SuperiorPlayer; @@ -41,10 +42,20 @@ public final class SortingComparators { int compare = Integer.compare(o2.getAllPlayersInside().size(), o1.getAllPlayersInside().size()); return compare == 0 ? ISLAND_NAMES_COMPARATOR.compare(o1, o2) : compare; }; + public final static Comparator ISLAND_ROLES_COMPARATOR = (o1, o2) -> { + // Comparison is between o2 and o1 as the lower the weight is, the higher the player is. + int compare = Integer.compare(o2.getPlayerRole().getWeight(), o1.getPlayerRole().getWeight()); + return compare == 0 ? PLAYER_NAMES_COMPARATOR.compare(o1, o2) : compare; + }; private SortingComparators() { } + public static void initializeTopIslandMembersSorting() throws IllegalArgumentException { + TopIslandMembersSorting.NAMES.setComparator(PLAYER_NAMES_COMPARATOR); + TopIslandMembersSorting.ROLES.setComparator(ISLAND_ROLES_COMPARATOR); + } + } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 870097d0d..8e8e3bc0a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -751,4 +751,10 @@ recalc-task-timeout: 10 auto-language-detection: true # Automatically uncoop players when there are no island members left online that can remove uncoop players. -auto-uncoop-when-alone: false \ No newline at end of file +auto-uncoop-when-alone: false + +# The way members of islands will be sorted in top islands when using the {4} placeholder. +# The followings are available: +# NAMES - Sort members by their names. +# ROLES - Sort members by their island roles. +island-top-members-sorting: NAMES \ No newline at end of file