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 2499422a4..0f53af7e2 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; @@ -741,7 +742,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; @@ -786,7 +787,7 @@ public void changeRank(Player sender, UUID playerUUID, DBCityRank newRank) { } if (hasPermission(playerUUID, CityPermission.OWNER)) { - MessagesManager.sendMessage(sender, MessagesManager.Message.PLAYER_IS_OWNER.getMessage(), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(sender, MessagesManager.Message.CITY_IS_OWNER.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } 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..b8ce4d376 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 @@ -33,7 +33,7 @@ public static void swap(Player sender, @SuggestWith(CityMembersAutoComplete.clas } if (!city.getMembers().contains(player.getUniqueId())) { - MessagesManager.sendMessage(sender, Component.text("Ce joueur n'est pas dans ta ville"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(sender, MessagesManager.Message.TARGET_IN_OTHER_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } @@ -65,7 +65,7 @@ void add( } if (!city.getMembers().contains(player.getUniqueId())) { - MessagesManager.sendMessage(sender, Component.text("Ce joueur n'est pas dans ta ville"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(sender, MessagesManager.Message.TARGET_IN_OTHER_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } @@ -97,7 +97,7 @@ void remove( } if (!city.getMembers().contains(player.getUniqueId())) { - MessagesManager.sendMessage(sender, Component.text("Ce joueur n'est pas dans ta ville"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(sender, MessagesManager.Message.TARGET_IN_OTHER_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } @@ -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, MessagesManager.Message.TARGET_IN_OTHER_CITY.getMessage(), 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, MessagesManager.Message.TARGET_IN_OTHER_CITY.getMessage(), 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/conditions/CityKickCondition.java b/src/main/java/fr/openmc/core/features/city/conditions/CityKickCondition.java index 544190f50..636816823 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 @@ -5,7 +5,6 @@ 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 org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; @@ -30,17 +29,22 @@ public static boolean canCityKickPlayer(City city, Player player, OfflinePlayer } if (player.getUniqueId().equals(playerToKick.getUniqueId())) { - MessagesManager.sendMessage(player, Component.text("Tu ne peux pas t'exclure toi même de la ville"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_KICK_HIMSELF.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } if (!(city.hasPermission(player.getUniqueId(), CityPermission.KICK))) { - MessagesManager.sendMessage(player, Component.text("Tu n'as pas la permission d'exclure un membre"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_KICK.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } if (city.hasPermission(playerToKick.getUniqueId(), CityPermission.OWNER)) { - MessagesManager.sendMessage(player, Component.text("Tu ne peux pas exclure le propriétaire de la ville"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_KICK.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return false; + } + + if (city.getRankOfMember(player.getUniqueId()).getPriority() <= city.getRankOfMember(playerToKick.getUniqueId()).getPriority()) { + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_KICK.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } return true; diff --git a/src/main/java/fr/openmc/core/features/city/conditions/CityPermsConditions.java b/src/main/java/fr/openmc/core/features/city/conditions/CityPermsConditions.java index 0beabb067..fb4929c21 100644 --- a/src/main/java/fr/openmc/core/features/city/conditions/CityPermsConditions.java +++ b/src/main/java/fr/openmc/core/features/city/conditions/CityPermsConditions.java @@ -6,7 +6,6 @@ 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 org.bukkit.entity.Player; import java.util.Objects; @@ -18,7 +17,7 @@ public static boolean canSeePerms(Player sender, UUID playerUUID) { City senderCity = CityManager.getPlayerCity(sender.getUniqueId()); if (senderCity == null) { - MessagesManager.sendMessage(sender, Component.text("Ce joueur n'habite aucune ville"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(sender, MessagesManager.Message.TARGET_NO_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } @@ -28,17 +27,17 @@ public static boolean canSeePerms(Player sender, UUID playerUUID) { } if (!Objects.equals(senderCity.getUniqueId(), city.getUniqueId())) { - MessagesManager.sendMessage(sender, Component.text("Ce joueur n'habite pas dans ta ville"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(sender, MessagesManager.Message.TARGET_IN_OTHER_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } if (!city.getMembers().contains(playerUUID)) { - MessagesManager.sendMessage(sender, Component.text("Ce joueur n'est pas dans ta ville"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(sender, MessagesManager.Message.TARGET_IN_OTHER_CITY.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } if (city.hasPermission(playerUUID, CityPermission.OWNER)) { - MessagesManager.sendMessage(sender, Component.text("Le propriétaire a les pleins pouvoirs"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(sender, MessagesManager.Message.CITY_IS_OWNER.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } @@ -54,12 +53,12 @@ public static boolean canModifyPerms(Player sender, CityPermission permission) { } if (!(city.hasPermission(sender.getUniqueId(), CityPermission.PERMS))) { - MessagesManager.sendMessage(sender, Component.text("Tu n'as pas la permission de gérer les permissions"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(sender, MessagesManager.Message.CITY_CANNOT_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } if (!city.hasPermission(sender.getUniqueId(), permission) && permission == CityPermission.PERMS) { - MessagesManager.sendMessage(sender, Component.text("Seul le propriétaire peut modifier cette permission"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(sender, MessagesManager.Message.CITY_ONLY_OWNER.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } diff --git a/src/main/java/fr/openmc/core/features/city/menu/CityChunkMenu.java b/src/main/java/fr/openmc/core/features/city/menu/CityChunkMenu.java index b95b07de6..553bf95fa 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/CityChunkMenu.java +++ b/src/main/java/fr/openmc/core/features/city/menu/CityChunkMenu.java @@ -327,7 +327,7 @@ private void handleChunkClaimClick(Player player, int chunkX, int chunkZ, boolea } if (!hasPermissionClaim) { - MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_CLAIM.getMessage(), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_CLAIM.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } @@ -363,7 +363,7 @@ private void handleChunkUnclaimClick(Player player, int chunkX, int chunkZ, bool } if (!hasPermissionClaim) { - MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_CLAIM.getMessage(), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_CLAIM.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } 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..6f2123b4e 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(), MessagesManager.Message.CITY_CANNOT_ACCESS_PERMS.getMessage(), 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,21 @@ public Map getButtons() { itemMeta.lore(List.of(Component.text("§7Cliquez pour aller à la page suivante"))); }).setNextPageButton()); + if (edit) { + map.put(53, new ItemBuilder(this, Material.GOLD_BLOCK, itemMeta -> { + itemMeta.displayName(Component.text("Gérer toutes les permissions du membre")); + itemMeta.lore(List.of( + Component.text("§cClique-gauche pour tout retirer"), + Component.text("§aClique-droit pour tout ajouter") + )); + }).setOnClick(inventoryClickEvent -> { + if (inventoryClickEvent.isLeftClick()) CityPermsCommands.removeAll(getOwner(), CacheOfflinePlayer.getOfflinePlayer(memberUUID)); + else if (inventoryClickEvent.isRightClick()) CityPermsCommands.addAll(getOwner(), CacheOfflinePlayer.getOfflinePlayer(memberUUID)); + + new CityPermsMenu(getOwner(), memberUUID, true).open(); + })); + } + return map; } diff --git a/src/main/java/fr/openmc/core/features/city/menu/CityTransferMenu.java b/src/main/java/fr/openmc/core/features/city/menu/CityTransferMenu.java index 3a8615626..0f80cebfc 100644 --- a/src/main/java/fr/openmc/core/features/city/menu/CityTransferMenu.java +++ b/src/main/java/fr/openmc/core/features/city/menu/CityTransferMenu.java @@ -70,7 +70,7 @@ public List getItems() { )); }).setOnClick(inventoryClickEvent -> { if (!hasPermissionOwner) { - MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_OWNER.getMessage(), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_ISNT_OWNER.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } 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..b6c680f28 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 @@ -170,12 +170,12 @@ public static void assignRank(Player player, String rankName, OfflinePlayer memb } if (!FeaturesRewards.hasUnlockFeature(city, FeaturesRewards.Feature.RANK)) { - MessagesManager.sendMessage(player, Component.text("Vous n'avez pas débloqué cette Feature ! Veuillez Améliorer votre Ville au niveau " + FeaturesRewards.getFeatureUnlockLevel(FeaturesRewards.Feature.RANK) + "!"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.text("Vous n'avez pas débloqué cette feature ! Veuillez améliorer votre ville au niveau " + FeaturesRewards.getFeatureUnlockLevel(FeaturesRewards.Feature.RANK) + " !"), Prefix.CITY, MessageType.ERROR, false); return; } if (!city.hasPermission(player.getUniqueId(), CityPermission.ASSIGN_RANKS)) { - MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); return; } DBCityRank rank = city.getRankByName(rankName); @@ -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 6107c0532..38a35b724 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 @@ -32,7 +32,7 @@ public void rank(Player player) { } if (!FeaturesRewards.hasUnlockFeature(city, FeaturesRewards.Feature.RANK)) { - MessagesManager.sendMessage(player, Component.text("Vous n'avez pas débloqué cette Feature ! Veuillez Améliorer votre Ville au niveau " + FeaturesRewards.getFeatureUnlockLevel(FeaturesRewards.Feature.RANK) + "!"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.text("Vous n'avez pas débloqué cette feature ! Veuillez améliorer votre ville au niveau " + FeaturesRewards.getFeatureUnlockLevel(FeaturesRewards.Feature.RANK) + " !"), Prefix.CITY, MessageType.ERROR, false); return; } @@ -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); @@ -82,17 +78,74 @@ public static void swapPermission(Player player, DBCityRank rank, CityPermission return; } if (!city.hasPermission(player.getUniqueId(), CityPermission.PERMS)) { - MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_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; } + if (!CityRankCondition.canModifyRankPermissions(city, player, rank.getPriority())) { + return; + } 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.CITY_CANNOT_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; + } + if (!CityRankCondition.canModifyRankPermissions(city, player, rank.getPriority())) { + return; + } + + rank.addAllPermissions(); + } + + /** + * 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.CITY_CANNOT_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; + } + if (!CityRankCondition.canModifyRankPermissions(city, player, rank.getPriority())) { + return; + } + + rank.clearPermissions(); + } + @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/CityRankCondition.java b/src/main/java/fr/openmc/core/features/city/sub/rank/CityRankCondition.java index a267edc57..aec3f00e1 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 @@ -36,7 +36,7 @@ public static boolean canCreateRank(City city, Player player) { } if (!city.hasPermission(player.getUniqueId(), CityPermission.MANAGE_RANKS)) { - MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); return false; } if (city.getRanks().size() >= RankLimitRewards.getRankLimit(city.getLevel())) { @@ -71,7 +71,10 @@ public static boolean canRenameRank(City city, Player player, String oldRankName } if (!city.hasPermission(player.getUniqueId(), CityPermission.MANAGE_RANKS)) { - MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_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())) { @@ -90,14 +93,15 @@ public static boolean canRenameRank(City city, Player player, String oldRankName */ public static boolean canDeleteRank(City city, Player player, String rankName) { if (!FeaturesRewards.hasUnlockFeature(city, FeaturesRewards.Feature.RANK)) { - MessagesManager.sendMessage(player, Component.text("Vous n'avez pas débloqué cette Feature ! Veuillez Améliorer votre Ville au niveau " + FeaturesRewards.getFeatureUnlockLevel(FeaturesRewards.Feature.RANK) + "!"), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, Component.text("Vous n'avez pas débloqué cette feature ! Veuillez améliorer votre ville au niveau " + FeaturesRewards.getFeatureUnlockLevel(FeaturesRewards.Feature.RANK) + " !"), Prefix.CITY, MessageType.ERROR, false); return false; } if (!city.hasPermission(player.getUniqueId(), CityPermission.PERMS)) { - MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_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); @@ -105,10 +109,20 @@ public static boolean canDeleteRank(City city, Player player, String rankName) { } if (!city.hasPermission(player.getUniqueId(), CityPermission.MANAGE_RANKS)) { - MessagesManager.sendMessage(player, MessagesManager.Message.PLAYER_NO_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); + MessagesManager.sendMessage(player, MessagesManager.Message.CITY_CANNOT_ACCESS_PERMS.getMessage(), Prefix.CITY, MessageType.ERROR, false); 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/CityRankAssignMenu.java b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankAssignMenu.java index 64e7b4587..02dbc6439 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankAssignMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankAssignMenu.java @@ -8,6 +8,9 @@ import fr.openmc.core.features.city.models.DBCityRank; import fr.openmc.core.features.city.sub.rank.CityRankAction; 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 org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; @@ -63,7 +66,10 @@ public void onClose(InventoryCloseEvent event) { Component.text("§7Permissions : " + (rank.getPermissionsSet().isEmpty() ? "§cAucune" : "§a" + rank.getPermissionsSet().size() + " permission(s)")) )); }).setOnClick(event -> { - if (!city.hasPermission(getOwner().getUniqueId(), CityPermission.ASSIGN_RANKS)) return; + if (!city.hasPermission(getOwner().getUniqueId(), CityPermission.ASSIGN_RANKS)) { + MessagesManager.sendMessage(getOwner(), MessagesManager.Message.CITY_RANKS_CANNOT_ASSIGN.getMessage(), Prefix.CITY, MessageType.ERROR, false); + return; + } CityRankAction.assignRank(getOwner(), rank.getName(), CacheOfflinePlayer.getOfflinePlayer(playerUUID)); getOwner().closeInventory(); 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..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) { @@ -241,11 +249,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/CityRankMemberMenu.java b/src/main/java/fr/openmc/core/features/city/sub/rank/menus/CityRankMemberMenu.java index 40b68a966..6fcfb127b 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 @@ -6,6 +6,7 @@ import fr.openmc.api.menulib.utils.ItemBuilder; 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.SkullUtils; import fr.openmc.core.utils.cache.CacheOfflinePlayer; import fr.openmc.core.utils.messages.MessageType; @@ -49,7 +50,7 @@ public List getItems() { Set members = city.getMembers(); for (UUID uuid : members) { OfflinePlayer player = CacheOfflinePlayer.getOfflinePlayer(uuid); - if (player == null || !player.hasPlayedBefore()) { + if (player == null) { continue; } @@ -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.CITY_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); + MessagesManager.sendMessage(getOwner(), MessagesManager.Message.CITY_CANNOT_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 9267c815c..28532fda4 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(), MessagesManager.Message.CITY_RANKS_CANNOT_MODIFY_HIGHER.getMessage(), 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,21 @@ public Map getButtons() { }).setOnClick(inventoryClickEvent -> new CityRankPermsMenu(getOwner(), oldRank, newRank, canEdit, page + 1).open())); } + if (canEdit) { + map.put(53, new ItemBuilder(this, Material.GOLD_BLOCK, itemMeta -> { + itemMeta.displayName(Component.text("§6Gérer toutes les permissions du grade")); + itemMeta.lore(List.of( + Component.text("§cClique-gauche pour tout retirer"), + Component.text("§aClique-droit pour tout ajouter") + )); + }).setOnClick(inventoryClickEvent -> { + if (inventoryClickEvent.isLeftClick()) CityRankCommands.removeAllPermissions(getOwner(), newRank); + else if (inventoryClickEvent.isRightClick()) CityRankCommands.addAllPermissions(getOwner(), newRank); + + new CityRankPermsMenu(getOwner(), oldRank, newRank, true, page).open(); + })); + } + return map; } 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 54b9e5f7f..b97fbda99 100644 --- a/src/main/java/fr/openmc/core/utils/messages/MessagesManager.java +++ b/src/main/java/fr/openmc/core/utils/messages/MessagesManager.java @@ -133,32 +133,39 @@ public static String textToSmall(String text) { public enum Message { // Command messages NO_PERMISSION(Component.text("§cVous n'avez pas la permission d'exécuter cette commande.")), - NO_PERMISSION_2(Component.text("§cVous n'avez pas le droit de faire ceci")), + NO_PERMISSION_2(Component.text("§cVous n'avez pas le droit de faire ceci.")), MISSING_ARGUMENT(Component.text("§cVous devez spécifier un argument.")), // Player messages PLAYER_NOT_FOUND(Component.text("§cLe joueur n'a pas été trouvé.")), // General messages - PLAYER_MISSING_MONEY(Component.text("Tu n'as pas assez d'argent")), + PLAYER_MISSING_MONEY(Component.text("Tu n'as pas assez d'argent.")), // City messages - PLAYER_NO_CITY(Component.text("Tu n'es pas dans une ville")), - PLAYER_IN_CITY(Component.text("Tu es déjà dans une ville")), - CITY_NO_FREE_CLAIM(Component.text("Cette ville n'a pas de claims gratuits")), - - PLAYER_NO_ACCESS_PERMS(Component.text("Tu n'as pas la permission d'accéder aux permissions ou grades de cette ville")), - PLAYER_NO_CLAIM(Component.text("Tu n'as pas la permission d'agrandir ta ville")), - PLAYER_NO_OWNER(Component.text("Tu n'as pas la permission car tu n'es pas maire")), - PLAYER_NO_RENAME(Component.text("Tu n'as pas la permission de renommer ta ville")), - PLAYER_NO_MONEY_GIVE(Component.text("Tu n'as pas la permission de donner de l'argent à ta ville")), - PLAYER_NO_MONEY_TAKE(Component.text("Tu n'as pas la permission de prendre de l'argent à ta ville")), - PLAYER_IS_OWNER(Component.text("Le propriétaire a tous les pouvoirs.")), + PLAYER_NO_CITY(Component.text("Tu n'es pas dans une ville.")), + PLAYER_IN_CITY(Component.text("Tu es déjà dans une ville.")), + TARGET_IN_OTHER_CITY(Component.text("Ce joueur n'est pas dans ta ville.")), + TARGET_NO_CITY(Component.text("Ce joueur n'est pas dans une ville.")), + + CITY_NO_FREE_CLAIM(Component.text("Cette ville n'a pas de claims gratuits.")), + CITY_CANNOT_ACCESS_PERMS(Component.text("Tu n'as pas la permission d'accéder aux permissions de cette ville.")), + CITY_CANNOT_CLAIM(Component.text("Tu n'as pas la permission d'agrandir ta ville.")), + CITY_ISNT_OWNER(Component.text("Tu n'as pas la permission car tu n'es pas maire.")), + CITY_CANNOT_RENAME(Component.text("Tu n'as pas la permission de renommer ta ville.")), + CITY_CANNOT_DEPOSIT(Component.text("Tu n'as pas la permission de donner de l'argent à ta ville.")), + CITY_CANNOT_WITHDRAW(Component.text("Tu n'as pas la permission de prendre de l'argent à ta ville.")), + CITY_IS_OWNER(Component.text("Le propriétaire a tous les pouvoirs.")), + CITY_CANNOT_KICK(Component.text("Tu n'as pas la permission d'exclure ce membre.")), + CITY_CANNOT_KICK_HIMSELF(Component.text("Tu ne peux pas t'exclure toi même de la ville.")), + CITY_ONLY_OWNER(Component.text("Seul le propriétaire peut faire cela.")), CITY_RANKS_NOT_EXIST(Component.text("Ce grade n'existe pas.")), 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_RANKS_CANNOT_ASSIGN(Component.text("Tu n'as pas la permission d'assigner des grades.")), CITY_NOT_FOUND(Component.text("La ville n'existe pas")),