From fe32bf031d0d4e09586454cfaf56ddfc7344e8b3 Mon Sep 17 00:00:00 2001 From: gab4000 Date: Sat, 1 Nov 2025 18:02:58 +0100 Subject: [PATCH 1/4] feat: add methods to manage all permissions for city ranks --- .../city/sub/rank/CityRankCommands.java | 56 +++++++++++++++++++ .../sub/rank/menus/CityRankDetailsMenu.java | 7 +-- .../sub/rank/menus/CityRankPermsMenu.java | 40 ++++++++++--- 3 files changed, 90 insertions(+), 13 deletions(-) diff --git a/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCommands.java b/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCommands.java index 6107c0532..28624147f 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCommands.java +++ b/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCommands.java @@ -93,6 +93,62 @@ public static void swapPermission(Player player, DBCityRank rank, CityPermission rank.swapPermission(permission); } + /** + * Add all permissions to a rank. + * + * @param player The player who is adding the permissions. + * @param rank The rank to add the permissions to. + */ + public static void addAllPermissions(Player player, DBCityRank rank) { + City city = CityManager.getPlayerCity(player.getUniqueId()); + if (city == null) { + MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return; + } + if (!city.hasPermission(player.getUniqueId(), CityPermission.PERMS)) { + MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return; + } + if (rank == null) { + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_RANKS_NOT_EXIST.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return; + } + + for (CityPermission permission : CityPermission.values()) { + if (permission != CityPermission.OWNER) return; + if (rank.getPermissionsSet().contains(permission)) continue; + rank.getPermissionsSet().add(permission); + } + } + + /** + * Remove all permissions from a rank. + * + * @param player The player who is removing the permissions. + * @param rank The rank to remove the permissions from. + */ + public static void removeAllPermissions(Player player, DBCityRank rank) { + City city = CityManager.getPlayerCity(player.getUniqueId()); + if (city == null) { + MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return; + } + if (!city.hasPermission(player.getUniqueId(), CityPermission.PERMS)) { + MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return; + } + if (rank == null) { + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_RANKS_NOT_EXIST.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return; + } + + for (CityPermission permission : CityPermission.values()) { + if (permission != CityPermission.OWNER) continue; + if (!rank.getPermissionsSet().contains(permission)) continue; + rank.getPermissionsSet().remove(permission); + } + } + @Subcommand("assign") @CommandPermission("omc.commands.city.rank.assign") public void assign(Player player, @Optional @Named("rank") @SuggestWith(CityRanksAutoComplete.class) String rankName, @Optional @Named("player") @SuggestWith(CityMembersAutoComplete.class) OfflinePlayer target) { diff --git a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankDetailsMenu.java b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankDetailsMenu.java index 78fb66970..226e3cd57 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankDetailsMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankDetailsMenu.java @@ -241,11 +241,8 @@ private Map createRank() { itemMeta.displayName(Component.text("§bLes permissions du grade")); itemMeta.lore(lorePerm); }).setOnClick(inventoryClickEvent -> { - if (!canManageRanks) { - MessagesManager.sendMessage(getOwner(), Component.text("§cVous n'avez pas la permission de modifier les permissions"), Prefix.CITY, MessageType.ERROR, false); - return; - } - new CityRankPermsMenu(getOwner(), oldRank, newRank, true, 0).open(); + if (!canManageRanks) new CityRankPermsMenu(getOwner(), oldRank, newRank, false, 0).open(); + else new CityRankPermsMenu(getOwner(), oldRank, newRank, true, 0).open(); })); map.put(18, new ItemBuilder(this, CustomItemRegistry.getByName("omc_menus:refuse_btn").getBest(), itemMeta -> { diff --git a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankPermsMenu.java b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankPermsMenu.java index 9267c815c..93eef3860 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankPermsMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankPermsMenu.java @@ -59,12 +59,6 @@ public CityRankPermsMenu(Player owner, DBCityRank oldRank, DBCityRank newRank, b public List getItems() { List items = new ArrayList<>(); - if (!this.canEdit) { - MessagesManager.sendMessage(getOwner(), Component.text("§cVous n'avez pas la permission de modifier les permissions"), Prefix.CITY, MessageType.ERROR, false); - getOwner().closeInventory(); - return null; - } - for (CityPermission permission : CityPermission.values()) { if (permission == CityPermission.OWNER) continue; @@ -78,8 +72,12 @@ public List getItems() { ); itemMeta.lore(lore); }).setOnClick(inventoryClickEvent -> { - CityRankCommands.swapPermission(getOwner(), newRank, permission); - new CityRankPermsMenu(getOwner(), oldRank, newRank, true, page).open(); + if (!canEdit) + MessagesManager.sendMessage(getOwner(), Component.text("§cVous n'avez pas la permission de modifier ce grade"), Prefix.CITY, MessageType.ERROR, true); + else { + CityRankCommands.swapPermission(getOwner(), newRank, permission); + new CityRankPermsMenu(getOwner(), oldRank, newRank, true, page).open(); + } }).hide(ItemUtils.getDataComponentType()); items.add(itemBuilder); @@ -110,6 +108,32 @@ public Map getButtons() { }).setOnClick(inventoryClickEvent -> new CityRankPermsMenu(getOwner(), oldRank, newRank, canEdit, page + 1).open())); } + if (canEdit) { + map.put(52, new ItemBuilder(this, Material.RED_DYE, itemMeta -> { + itemMeta.displayName(Component.text("§cTout retirer")); + itemMeta.lore(List.of(Component.text("§7Cliquez pour retirer toutes les permissions du membre"))); + }).setOnClick(inventoryClickEvent -> { + if (!canEdit) + MessagesManager.sendMessage(getOwner(), Component.text("§cVous n'avez pas la permission de modifier les permissions des grades"), Prefix.CITY, MessageType.ERROR, true); + else { + CityRankCommands.removeAllPermissions(getOwner(), newRank); + new CityRankPermsMenu(getOwner(), oldRank, newRank, true, page).open(); + } + })); + + map.put(53, new ItemBuilder(this, Material.GREEN_DYE, itemMeta -> { + itemMeta.displayName(Component.text("§aTout ajouter")); + itemMeta.lore(List.of(Component.text("§7Cliquez pour ajouter toutes les permissions au membre"))); + }).setOnClick(inventoryClickEvent -> { + if (!canEdit) + MessagesManager.sendMessage(getOwner(), Component.text("§cVous n'avez pas la permission de modifier les permissions des grades"), Prefix.CITY, MessageType.ERROR, true); + else { + CityRankCommands.addAllPermissions(getOwner(), newRank); + new CityRankPermsMenu(getOwner(), oldRank, newRank, true, page).open(); + } + })); + } + return map; } From 18ef46c05604ec60cdaf5691b98ddf7e067e9942 Mon Sep 17 00:00:00 2001 From: gab4000 Date: Sat, 1 Nov 2025 18:03:07 +0100 Subject: [PATCH 2/4] feat: add commands to add and remove all permissions for city members --- .../city/commands/CityPermsCommands.java | 48 +++++++++++++++++++ .../features/city/menu/CityPermsMenu.java | 39 +++++++++++++-- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/openmc/core/features/city/commands/CityPermsCommands.java b/src/main/java/fr/openmc/core/features/city/commands/CityPermsCommands.java index 97029ecd4..3309f2699 100644 --- a/src/main/java/fr/openmc/core/features/city/commands/CityPermsCommands.java +++ b/src/main/java/fr/openmc/core/features/city/commands/CityPermsCommands.java @@ -118,4 +118,52 @@ void get(Player sender, @SuggestWith(CityMembersAutoComplete.class) OfflinePlaye if (!CityPermsConditions.canSeePerms(sender, player.getUniqueId())) return; new CityPermsMenu(sender, player.getUniqueId(), false).open(); } + + @Subcommand("removeall") + @CommandPermission("omc.commands.city.perm.removeall") + @Description("Retirer toutes les permissions d'un membre") + public static void removeAll(Player sender, @SuggestWith(CityMembersAutoComplete.class) OfflinePlayer player) { + if (!CityPermsConditions.canSeePerms(sender, player.getUniqueId())) return; + if (!CityPermsConditions.canModifyPerms(sender, null)) return; + + City city = CityManager.getPlayerCity(sender.getUniqueId()); + + if (city == null) { + MessagesManager.sendMessage(sender, MessagesManager.Message.PLAYER_NO_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return; + } + + if (!city.getMembers().contains(player.getUniqueId())) { + MessagesManager.sendMessage(sender, Component.text("Ce joueur n'est pas dans ta ville"), Prefix.CITY, MessageType.ERROR, false); + return; + } + + for (CityPermission permission : CityPermission.values()) { + if (permission == CityPermission.OWNER) continue; + city.removePermission(player.getUniqueId(), permission); + } + } + + @Subcommand("addall") + @CommandPermission("omc.commands.city.perm.addall") + @Description("Ajouter toutes les permissions à un membre") + public static void addAll(Player sender, @SuggestWith(CityMembersAutoComplete.class) OfflinePlayer player) { + if (! CityPermsConditions.canSeePerms(sender, player.getUniqueId())) return; + if (! CityPermsConditions.canModifyPerms(sender, null)) return; + + City city = CityManager.getPlayerCity(sender.getUniqueId()); + if (city == null) { + MessagesManager.sendMessage(sender, MessagesManager.Message.PLAYER_NO_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return; + } + if (! city.getMembers().contains(player.getUniqueId())) { + MessagesManager.sendMessage(sender, Component.text("Ce joueur n'est pas dans ta ville"), Prefix.CITY, MessageType.ERROR, false); + return; + } + + for (CityPermission permission : CityPermission.values()) { + if (permission == CityPermission.OWNER) continue; + city.addPermission(player.getUniqueId(), permission); + } + } } diff --git a/src/main/java/fr/openmc/core/features/city/menu/CityPermsMenu.java b/src/main/java/fr/openmc/core/features/city/menu/CityPermsMenu.java index 869c8fb15..c104ace51 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/CityPermsMenu.java +++ b/src/main/java/fr/openmc/core/features/city/menu/CityPermsMenu.java @@ -11,6 +11,9 @@ import fr.openmc.core.features.city.commands.CityPermsCommands; import fr.openmc.core.items.CustomItemRegistry; import fr.openmc.core.utils.cache.CacheOfflinePlayer; +import fr.openmc.core.utils.messages.MessageType; +import fr.openmc.core.utils.messages.MessagesManager; +import fr.openmc.core.utils.messages.Prefix; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; @@ -79,10 +82,12 @@ public List getItems() { ); itemMeta.lore(edit ? lore : List.of()); }).setOnClick(inventoryClickEvent -> { - if (!edit) return; - CityPermsCommands.swap(player, CacheOfflinePlayer.getOfflinePlayer(memberUUID), permission); - player.closeInventory(); - this.open(); + if (!edit) + MessagesManager.sendMessage(getOwner(), Component.text("§cVous n'avez pas la permission de modifier les permissions des membres"), Prefix.CITY, MessageType.ERROR, true); + else { + CityPermsCommands.swap(player, CacheOfflinePlayer.getOfflinePlayer(memberUUID), permission); + new CityPermsMenu(player, memberUUID, true).open(); + } }).hide(ItemUtils.getDataComponentType()); items.add(itemBuilder); @@ -110,6 +115,32 @@ public Map getButtons() { itemMeta.lore(List.of(Component.text("§7Cliquez pour aller à la page suivante"))); }).setNextPageButton()); + if (edit) { + map.put(52, new ItemBuilder(this, Material.RED_DYE, itemMeta -> { + itemMeta.displayName(Component.text("§cTout retirer")); + itemMeta.lore(List.of(Component.text("§7Cliquez pour retirer toutes les permissions du membre"))); + }).setOnClick(inventoryClickEvent -> { + if (!edit) + MessagesManager.sendMessage(getOwner(), Component.text("§cVous n'avez pas la permission de modifier les permissions des membres"), Prefix.CITY, MessageType.ERROR, true); + else { + CityPermsCommands.removeAll(getOwner(), CacheOfflinePlayer.getOfflinePlayer(memberUUID)); + new CityPermsMenu(getOwner(), memberUUID, true).open(); + } + })); + + map.put(53, new ItemBuilder(this, Material.GREEN_DYE, itemMeta -> { + itemMeta.displayName(Component.text("§aTout ajouter")); + itemMeta.lore(List.of(Component.text("§7Cliquez pour ajouter toutes les permissions au membre"))); + }).setOnClick(inventoryClickEvent -> { + if (!edit) + MessagesManager.sendMessage(getOwner(), Component.text("§cVous n'avez pas la permission de modifier les permissions des membres"), Prefix.CITY, MessageType.ERROR, true); + else { + CityPermsCommands.addAll(getOwner(), CacheOfflinePlayer.getOfflinePlayer(memberUUID)); + new CityPermsMenu(getOwner(), memberUUID, true).open(); + } + })); + } + return map; } From 66b131dd230a1b1e9c8543b94455ff27baedf0bc Mon Sep 17 00:00:00 2001 From: gab4000 Date: Sat, 1 Nov 2025 18:10:24 +0100 Subject: [PATCH 3/4] =?UTF-8?q?les=20=E2=9C=A8=20points=20d'exclamation=20?= =?UTF-8?q?=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/features/city/commands/CityPermsCommands.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/openmc/core/features/city/commands/CityPermsCommands.java b/src/main/java/fr/openmc/core/features/city/commands/CityPermsCommands.java index 3309f2699..19445c10c 100644 --- a/src/main/java/fr/openmc/core/features/city/commands/CityPermsCommands.java +++ b/src/main/java/fr/openmc/core/features/city/commands/CityPermsCommands.java @@ -148,15 +148,15 @@ public static void removeAll(Player sender, @SuggestWith(CityMembersAutoComplete @CommandPermission("omc.commands.city.perm.addall") @Description("Ajouter toutes les permissions à un membre") public static void addAll(Player sender, @SuggestWith(CityMembersAutoComplete.class) OfflinePlayer player) { - if (! CityPermsConditions.canSeePerms(sender, player.getUniqueId())) return; - if (! CityPermsConditions.canModifyPerms(sender, null)) return; + if (!CityPermsConditions.canSeePerms(sender, player.getUniqueId())) return; + if (!CityPermsConditions.canModifyPerms(sender, null)) return; City city = CityManager.getPlayerCity(sender.getUniqueId()); if (city == null) { MessagesManager.sendMessage(sender, MessagesManager.Message.PLAYER_NO_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } - if (! city.getMembers().contains(player.getUniqueId())) { + if (!city.getMembers().contains(player.getUniqueId())) { MessagesManager.sendMessage(sender, Component.text("Ce joueur n'est pas dans ta ville"), Prefix.CITY, MessageType.ERROR, false); return; } From f2cac058eaf12fdaa9f264abd799897b309a652d Mon Sep 17 00:00:00 2001 From: gab4000 Date: Sat, 1 Nov 2025 19:03:39 +0100 Subject: [PATCH 4/4] feat: implement rank permission checks and improve rank management functionality --- .../fr/openmc/core/features/city/City.java | 3 ++- .../city/conditions/CityKickCondition.java | 5 ++++ .../features/city/menu/CityPermsMenu.java | 2 +- .../core/features/city/models/DBCityRank.java | 18 +++++++++++++ .../city/sub/rank/CityRankAction.java | 3 +++ .../city/sub/rank/CityRankCommands.java | 25 ++++++++----------- .../city/sub/rank/CityRankCondition.java | 14 +++++++++++ .../sub/rank/menus/CityRankDetailsMenu.java | 10 +++++++- .../sub/rank/menus/CityRankMemberMenu.java | 12 ++++++++- .../sub/rank/menus/CityRankPermsMenu.java | 2 +- .../city/sub/rank/menus/CityRanksMenu.java | 3 ++- .../core/utils/messages/MessagesManager.java | 1 + 12 files changed, 78 insertions(+), 20 deletions(-) diff --git a/src/main/java/fr/openmc/core/features/city/City.java b/src/main/java/fr/openmc/core/features/city/City.java index 18163ddfd..08570b9bb 100644 --- a/src/main/java/fr/openmc/core/features/city/City.java +++ b/src/main/java/fr/openmc/core/features/city/City.java @@ -33,6 +33,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.stream.Collectors; @@ -736,7 +737,7 @@ public void updateRank(DBCityRank oldRank, DBCityRank newRank) { * @param member The UUID of the member to check. * @return The CityRank object representing the member's rank, or null if not found. */ - public DBCityRank getRankOfMember(UUID member) { + public @Nullable DBCityRank getRankOfMember(UUID member) { for (DBCityRank rank : cityRanks) { if (rank.getMembersSet().contains(member)) { return rank; diff --git a/src/main/java/fr/openmc/core/features/city/conditions/CityKickCondition.java b/src/main/java/fr/openmc/core/features/city/conditions/CityKickCondition.java index 544190f50..29eeb72f9 100644 --- a/src/main/java/fr/openmc/core/features/city/conditions/CityKickCondition.java +++ b/src/main/java/fr/openmc/core/features/city/conditions/CityKickCondition.java @@ -43,6 +43,11 @@ public static boolean canCityKickPlayer(City city, Player player, OfflinePlayer MessagesManager.sendMessage(player, Component.text("Tu ne peux pas exclure le propriétaire de la ville"), Prefix.CITY, MessageType.ERROR, false); return false; } + + if (city.getRankOfMember(player.getUniqueId()).getPriority() <= city.getRankOfMember(playerToKick.getUniqueId()).getPriority()) { + MessagesManager.sendMessage(player, Component.text("Tu ne peux pas exclure un membre ayant un grade supérieur ou égal au tien"), Prefix.CITY, MessageType.ERROR, false); + return false; + } return true; } } diff --git a/src/main/java/fr/openmc/core/features/city/menu/CityPermsMenu.java b/src/main/java/fr/openmc/core/features/city/menu/CityPermsMenu.java index c104ace51..1ddb7898f 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/CityPermsMenu.java +++ b/src/main/java/fr/openmc/core/features/city/menu/CityPermsMenu.java @@ -128,7 +128,7 @@ public Map getButtons() { } })); - map.put(53, new ItemBuilder(this, Material.GREEN_DYE, itemMeta -> { + map.put(53, new ItemBuilder(this, Material.LIME_DYE, itemMeta -> { itemMeta.displayName(Component.text("§aTout ajouter")); itemMeta.lore(List.of(Component.text("§7Cliquez pour ajouter toutes les permissions au membre"))); }).setOnClick(inventoryClickEvent -> { diff --git a/src/main/java/fr/openmc/core/features/city/models/DBCityRank.java b/src/main/java/fr/openmc/core/features/city/models/DBCityRank.java index 225ef42d0..a77ecca71 100644 --- a/src/main/java/fr/openmc/core/features/city/models/DBCityRank.java +++ b/src/main/java/fr/openmc/core/features/city/models/DBCityRank.java @@ -156,6 +156,24 @@ public void swapPermission(CityPermission permission) { } } + /** + * Clears all permissions from this rank. + */ + public void clearPermissions() { + permissionsSet.clear(); + } + + /** + * Adds all available permissions to this rank, except OWNER. + */ + public void addAllPermissions() { + for (CityPermission permission : CityPermission.values()) { + if (permission != CityPermission.OWNER) { + permissionsSet.add(permission); + } + } + } + /** * Adds a member to this rank. * diff --git a/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankAction.java b/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankAction.java index 858c440c1..de8fda260 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankAction.java +++ b/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankAction.java @@ -189,6 +189,9 @@ public static void assignRank(Player player, String rankName, OfflinePlayer memb MessagesManager.sendMessage(player, MessagesManager.Message.CITY_RANKS_NOT_EXIST.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } + if (!CityRankCondition.canModifyRankPermissions(city, player, rank.getPriority())) { + return; + } city.changeRank(player, member.getUniqueId(), rank); } diff --git a/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCommands.java b/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCommands.java index 28624147f..f905c8838 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCommands.java +++ b/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCommands.java @@ -56,10 +56,6 @@ public void edit( MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } - if (!city.hasPermission(player.getUniqueId(), CityPermission.MANAGE_RANKS)) { - MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); - return; - } DBCityRank rank = city.getRankByName(rankName); if (rank == null) { MessagesManager.sendMessage(player, MessagesManager.Message.CITY_RANKS_NOT_EXIST.getMessage(), Prefix.CITY, MessageType.ERROR, false); @@ -89,6 +85,9 @@ public static void swapPermission(Player player, DBCityRank rank, CityPermission MessagesManager.sendMessage(player, MessagesManager.Message.CITY_RANKS_NOT_EXIST.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } + if (!CityRankCondition.canModifyRankPermissions(city, player, rank.getPriority())) { + return; + } rank.swapPermission(permission); } @@ -113,12 +112,11 @@ public static void addAllPermissions(Player player, DBCityRank rank) { MessagesManager.sendMessage(player, MessagesManager.Message.CITY_RANKS_NOT_EXIST.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } - - for (CityPermission permission : CityPermission.values()) { - if (permission != CityPermission.OWNER) return; - if (rank.getPermissionsSet().contains(permission)) continue; - rank.getPermissionsSet().add(permission); + if (!CityRankCondition.canModifyRankPermissions(city, player, rank.getPriority())) { + return; } + + rank.addAllPermissions(); } /** @@ -141,12 +139,11 @@ public static void removeAllPermissions(Player player, DBCityRank rank) { MessagesManager.sendMessage(player, MessagesManager.Message.CITY_RANKS_NOT_EXIST.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } - - for (CityPermission permission : CityPermission.values()) { - if (permission != CityPermission.OWNER) continue; - if (!rank.getPermissionsSet().contains(permission)) continue; - rank.getPermissionsSet().remove(permission); + if (!CityRankCondition.canModifyRankPermissions(city, player, rank.getPriority())) { + return; } + + rank.clearPermissions(); } @Subcommand("assign") diff --git a/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCondition.java b/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCondition.java index a267edc57..8dc52a3de 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCondition.java +++ b/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCondition.java @@ -74,6 +74,9 @@ public static boolean canRenameRank(City city, Player player, String oldRankName MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } + if (!canModifyRankPermissions(city, player, rank.getPriority())) { + return false; + } if (city.getRanks().size() >= RankLimitRewards.getRankLimit(city.getLevel())) { MessagesManager.sendMessage(player, MessagesManager.Message.CITY_RANKS_MAX.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; @@ -98,6 +101,7 @@ public static boolean canDeleteRank(City city, Player player, String rankName) { MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } + DBCityRank rank = city.getRankByName(rankName); if (rank == null) { MessagesManager.sendMessage(player, MessagesManager.Message.CITY_RANKS_NOT_EXIST.getMessage(), Prefix.CITY, MessageType.ERROR, false); @@ -109,6 +113,16 @@ public static boolean canDeleteRank(City city, Player player, String rankName) { return false; } + return canModifyRankPermissions(city, player, rank.getPriority()); + } + + public static boolean canModifyRankPermissions(City city, Player player, int rankPriority) { + if (city.getRankOfMember(player.getUniqueId()) == null) return true; + + if (city.getRankOfMember(player.getUniqueId()).getPriority() >= rankPriority) { + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_RANKS_CANNOT_MODIFY_HIGHER.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return false; + } return true; } } diff --git a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankDetailsMenu.java b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankDetailsMenu.java index 226e3cd57..7fa3d9eb3 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankDetailsMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankDetailsMenu.java @@ -8,6 +8,7 @@ import fr.openmc.core.features.city.models.DBCityRank; import fr.openmc.core.features.city.sub.milestone.rewards.RankLimitRewards; import fr.openmc.core.features.city.sub.rank.CityRankAction; +import fr.openmc.core.features.city.sub.rank.CityRankCondition; import fr.openmc.core.features.city.sub.rank.CityRankManager; import fr.openmc.core.items.CustomItemRegistry; import fr.openmc.core.utils.ItemUtils; @@ -100,6 +101,12 @@ private Map createRank() { Component.text("§7Priorité actuelle : §d" + this.newRank.getPriority()) )); }).setOnClick(inventoryClickEvent -> { + if (!canManageRanks) return; + + if (!CityRankCondition.canModifyRankPermissions(city, getOwner(), newRank.getPriority())) { + return; + } + if (inventoryClickEvent.isLeftClick()) { new CityRankDetailsMenu(getOwner(), city, newRank.withPriority((newRank.getPriority() + 1) % 18)).open(); } else if (inventoryClickEvent.isRightClick()) { @@ -165,7 +172,8 @@ private Map createRank() { Map map = new HashMap<>(); Player player = getOwner(); - boolean canManageRanks = city.hasPermission(player.getUniqueId(), CityPermission.MANAGE_RANKS); + boolean canManageRanks = city.hasPermission(player.getUniqueId(), CityPermission.MANAGE_RANKS) + && CityRankCondition.canModifyRankPermissions(city, player, oldRank.getPriority()); List lorePriority = new ArrayList<>(List.of(Component.text("§7Priorité actuelle : §d" + this.newRank.getPriority()))); if (canManageRanks) { diff --git a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankMemberMenu.java b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankMemberMenu.java index 298933471..5c2b000de 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankMemberMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankMemberMenu.java @@ -7,6 +7,7 @@ import fr.openmc.api.menulib.utils.ItemUtils; import fr.openmc.core.features.city.City; import fr.openmc.core.features.city.CityPermission; +import fr.openmc.core.features.city.sub.rank.CityRankCondition; import fr.openmc.core.utils.cache.CacheOfflinePlayer; import fr.openmc.core.utils.messages.MessageType; import fr.openmc.core.utils.messages.MessagesManager; @@ -65,13 +66,22 @@ public List getItems() { itemMeta.displayName(Component.text(player.getName() != null ? player.getName() : "§c§oJoueur inconnu").decoration(TextDecoration.ITALIC, false)); itemMeta.lore(lore); }).setOnClick(event -> { - if (city.hasPermission(player.getUniqueId(), CityPermission.OWNER)) return; + if (city.hasPermission(player.getUniqueId(), CityPermission.OWNER)) { + MessagesManager.sendMessage(getOwner(), MessagesManager.Message.PLAYER_IS_OWNER.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return; + } if (!city.hasPermission(getOwner().getUniqueId(), CityPermission.ASSIGN_RANKS)) { MessagesManager.sendMessage(getOwner(), MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); getOwner().closeInventory(); return; } + + if (city.getRankOfMember(player.getUniqueId()) != null) { + if (!CityRankCondition.canModifyRankPermissions(city, getOwner(), city.getRankOfMember(player.getUniqueId()).getPriority())) { + return; + } + } new CityRankAssignMenu(getOwner(), uuid, city).open(); })); diff --git a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankPermsMenu.java b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankPermsMenu.java index 93eef3860..4b2f108ea 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankPermsMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankPermsMenu.java @@ -121,7 +121,7 @@ public Map getButtons() { } })); - map.put(53, new ItemBuilder(this, Material.GREEN_DYE, itemMeta -> { + map.put(53, new ItemBuilder(this, Material.LIME_DYE, itemMeta -> { itemMeta.displayName(Component.text("§aTout ajouter")); itemMeta.lore(List.of(Component.text("§7Cliquez pour ajouter toutes les permissions au membre"))); }).setOnClick(inventoryClickEvent -> { diff --git a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRanksMenu.java b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRanksMenu.java index deb7743cb..bc29546b6 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRanksMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRanksMenu.java @@ -8,6 +8,7 @@ import fr.openmc.core.features.city.menu.main.CityMenu; import fr.openmc.core.features.city.models.DBCityRank; import fr.openmc.core.features.city.sub.rank.CityRankAction; +import fr.openmc.core.features.city.sub.rank.CityRankCondition; import fr.openmc.core.items.CustomItemRegistry; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextDecoration; @@ -71,7 +72,7 @@ public void onClose(InventoryCloseEvent event) { Component.text("§7Priorité : §d" + priority).decoration(TextDecoration.ITALIC, false), Component.text("§7Permissions : §b" + rank.getPermissionsSet().size()).decoration(TextDecoration.ITALIC, false), Component.empty(), - Component.text(canManageRanks ? "§e§lCLIQUEZ POUR MODIFIER LE ROLE" : "§e§lCLIQUEZ POUR S'Y INFORMER") + Component.text(canManageRanks && CityRankCondition.canModifyRankPermissions(city, getOwner(), priority) ? "§e§lCLIQUEZ POUR MODIFIER LE ROLE" : "§e§lCLIQUEZ POUR S'Y INFORMER") )); } ).setOnClick(inventoryClickEvent -> new CityRankDetailsMenu(player, city, rank).open()) diff --git a/src/main/java/fr/openmc/core/utils/messages/MessagesManager.java b/src/main/java/fr/openmc/core/utils/messages/MessagesManager.java index e21cd2035..1880f8c8b 100644 --- a/src/main/java/fr/openmc/core/utils/messages/MessagesManager.java +++ b/src/main/java/fr/openmc/core/utils/messages/MessagesManager.java @@ -138,6 +138,7 @@ public enum Message { CITY_RANKS_MAX(Component.text("Le nombre maximum de grades a été atteint, tu ne peux pas en ajouter d'autres.")), CITY_RANKS_ALREADY_EXIST(Component.text("Ce grade existe déjà.")), CITY_RANKS_CANNOT_DELETE(Component.text("Tu ne peux pas supprimer le grade de propriétaire.")), + CITY_RANKS_CANNOT_MODIFY_HIGHER(Component.text("Tu ne peux pas modifier un grade supérieur ou égal au tien.")), CITY_NOT_FOUND(Component.text("La ville n'existe pas")),