diff --git a/.gradle/8.5/checksums/checksums.lock b/.gradle/8.5/checksums/checksums.lock new file mode 100644 index 0000000..e97c5cb Binary files /dev/null and b/.gradle/8.5/checksums/checksums.lock differ diff --git a/.gradle/8.5/checksums/md5-checksums.bin b/.gradle/8.5/checksums/md5-checksums.bin new file mode 100644 index 0000000..415fb83 Binary files /dev/null and b/.gradle/8.5/checksums/md5-checksums.bin differ diff --git a/.gradle/8.5/checksums/sha1-checksums.bin b/.gradle/8.5/checksums/sha1-checksums.bin new file mode 100644 index 0000000..39535be Binary files /dev/null and b/.gradle/8.5/checksums/sha1-checksums.bin differ diff --git a/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock b/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000..28674bb Binary files /dev/null and b/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock differ diff --git a/.gradle/8.5/dependencies-accessors/gc.properties b/.gradle/8.5/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/8.5/executionHistory/executionHistory.bin b/.gradle/8.5/executionHistory/executionHistory.bin new file mode 100644 index 0000000..6de985b Binary files /dev/null and b/.gradle/8.5/executionHistory/executionHistory.bin differ diff --git a/.gradle/8.5/executionHistory/executionHistory.lock b/.gradle/8.5/executionHistory/executionHistory.lock new file mode 100644 index 0000000..d9649a5 Binary files /dev/null and b/.gradle/8.5/executionHistory/executionHistory.lock differ diff --git a/.gradle/8.5/fileChanges/last-build.bin b/.gradle/8.5/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/.gradle/8.5/fileChanges/last-build.bin differ diff --git a/.gradle/8.5/fileHashes/fileHashes.bin b/.gradle/8.5/fileHashes/fileHashes.bin new file mode 100644 index 0000000..cb8ef94 Binary files /dev/null and b/.gradle/8.5/fileHashes/fileHashes.bin differ diff --git a/.gradle/8.5/fileHashes/fileHashes.lock b/.gradle/8.5/fileHashes/fileHashes.lock new file mode 100644 index 0000000..48559ca Binary files /dev/null and b/.gradle/8.5/fileHashes/fileHashes.lock differ diff --git a/.gradle/8.5/fileHashes/resourceHashesCache.bin b/.gradle/8.5/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000..ff46b9d Binary files /dev/null and b/.gradle/8.5/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/8.5/gc.properties b/.gradle/8.5/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..35e37b5 Binary files /dev/null and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..0ee271b --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Wed Apr 10 23:40:31 CDT 2024 +gradle.version=8.5 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000..fd2e4d4 Binary files /dev/null and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe new file mode 100644 index 0000000..1f2ab53 Binary files /dev/null and b/.gradle/file-system.probe differ diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..b77fd0e --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..bec3022 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..eb28ca3 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..3b1ee13 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/BetterGroups.main.iml b/.idea/modules/BetterGroups.main.iml new file mode 100644 index 0000000..bbeeb3e --- /dev/null +++ b/.idea/modules/BetterGroups.main.iml @@ -0,0 +1,14 @@ + + + + + + + PAPER + ADVENTURE + + 1 + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 254d995..f4bbde9 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { } group = 'dev.goldenn' -version = '1.1' +version = '2.0' repositories { mavenCentral() diff --git a/build/classes/java/main/dev/goldenn/bettergroups/BetterGroups.class b/build/classes/java/main/dev/goldenn/bettergroups/BetterGroups.class index 4b49c57..66e1de9 100644 Binary files a/build/classes/java/main/dev/goldenn/bettergroups/BetterGroups.class and b/build/classes/java/main/dev/goldenn/bettergroups/BetterGroups.class differ diff --git a/build/classes/java/main/dev/goldenn/bettergroups/CommandManager.class b/build/classes/java/main/dev/goldenn/bettergroups/CommandManager.class new file mode 100644 index 0000000..4c668a1 Binary files /dev/null and b/build/classes/java/main/dev/goldenn/bettergroups/CommandManager.class differ diff --git a/build/classes/java/main/dev/goldenn/bettergroups/GroupManager.class b/build/classes/java/main/dev/goldenn/bettergroups/GroupManager.class new file mode 100644 index 0000000..2de23b3 Binary files /dev/null and b/build/classes/java/main/dev/goldenn/bettergroups/GroupManager.class differ diff --git a/build/libs/BetterGroups-2.0.jar b/build/libs/BetterGroups-2.0.jar new file mode 100644 index 0000000..479d970 Binary files /dev/null and b/build/libs/BetterGroups-2.0.jar differ diff --git a/build/resources/main/plugin.yml b/build/resources/main/plugin.yml index 3188a42..e2afddf 100644 --- a/build/resources/main/plugin.yml +++ b/build/resources/main/plugin.yml @@ -1,5 +1,5 @@ name: BetterGroups -version: '1.1' +version: '2.0' main: dev.goldenn.bettergroups.BetterGroups api-version: '1.16' prefix: BetterGroups diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/BetterGroups$WarpRestriction.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/BetterGroups$WarpRestriction.class.uniqueId0 deleted file mode 100644 index 02ed64c..0000000 Binary files a/build/tmp/compileJava/compileTransaction/stash-dir/BetterGroups$WarpRestriction.class.uniqueId0 and /dev/null differ diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/BetterGroups.class.uniqueId1 b/build/tmp/compileJava/compileTransaction/stash-dir/BetterGroups.class.uniqueId0 similarity index 87% rename from build/tmp/compileJava/compileTransaction/stash-dir/BetterGroups.class.uniqueId1 rename to build/tmp/compileJava/compileTransaction/stash-dir/BetterGroups.class.uniqueId0 index e063ef1..4b49c57 100644 Binary files a/build/tmp/compileJava/compileTransaction/stash-dir/BetterGroups.class.uniqueId1 and b/build/tmp/compileJava/compileTransaction/stash-dir/BetterGroups.class.uniqueId0 differ diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index 6a2245b..b186f3f 100644 Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/src/main/java/dev/goldenn/bettergroups/BetterGroups.java b/src/main/java/dev/goldenn/bettergroups/BetterGroups.java index 8dc5fbd..b442e8b 100644 --- a/src/main/java/dev/goldenn/bettergroups/BetterGroups.java +++ b/src/main/java/dev/goldenn/bettergroups/BetterGroups.java @@ -1,227 +1,39 @@ package dev.goldenn.bettergroups; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.plugin.java.JavaPlugin; -import java.util.UUID; -import java.util.stream.Collectors; -import java.util.*; +public class BetterGroups extends JavaPlugin { -public class BetterGroups extends JavaPlugin implements CommandExecutor, Listener { - - - private Map> playerGroups = new HashMap<>(); - private Map groups = new HashMap<>(); - private Map groupHierarchy = new HashMap<>(); - private Map> groupUsers = new HashMap<>(); + private GroupManager groupManager; + private CommandManager commandManager; private String chatFormat; - @Override public void onEnable() { - // Load groups and group hierarchy from config - FileConfiguration config = getConfig(); - ConfigurationSection groupsConfig = config.getConfigurationSection("groups"); - if (groupsConfig != null) { - for (String groupName : groupsConfig.getKeys(false)) { - String prefix = groupsConfig.getString(groupName + ".prefix"); - int hierarchy = groupsConfig.getInt(groupName + ".hierarchy"); - groups.put(groupName, prefix); + // Initialize GroupManager + this.groupManager = new GroupManager(this); - // Load users as UUIDs from config - Set userStrings = new HashSet<>(groupsConfig.getStringList(groupName + ".users")); - Set users = userStrings.stream() - .map(UUID::fromString) - .collect(Collectors.toSet()); - groupUsers.put(groupName, users); - - groupHierarchy.put(groupName, hierarchy); - } - } + // Initialize CommandManager with GroupManager instance + this.commandManager = new CommandManager(this, groupManager); // Load chat format from config + FileConfiguration config = getConfig(); chatFormat = config.getString("chatFormat", "{TAG}&r {PLAYER}:&r {MESSAGE}"); - // Register commands and events - this.getCommand("addtogroup").setExecutor(this); - this.getCommand("removefromgroup").setExecutor(this); - this.getCommand("tagreload").setExecutor(this); - this.getCommand("creategroup").setExecutor(this); - Bukkit.getPluginManager().registerEvents(this, this); - } - - @Override - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { - if (cmd.getName().equalsIgnoreCase("creategroup")) { - if (args.length >= 2) { - String groupName = args[0]; - String prefix = args[1]; - - if (!groups.containsKey(groupName)) { - int hierarchy = args.length > 2 ? Integer.parseInt(args[2]) : 0; - - groups.put(groupName, prefix); - groupHierarchy.put(groupName, hierarchy); - - // Save to config - FileConfiguration config = getConfig(); - config.set("groups." + groupName + ".prefix", prefix); - config.set("groups." + groupName + ".hierarchy", hierarchy); - saveConfig(); - - sender.sendMessage(ChatColor.GREEN + "Group created successfully!"); - } else { - sender.sendMessage(ChatColor.RED + "Group already exists!"); - } - return true; - } - } else if (cmd.getName().equalsIgnoreCase("addtogroup")) { - if (args.length >= 2) { - String groupName = args[0]; - String playerName = args[1]; - - if (groups.containsKey(groupName)) { - Player player = Bukkit.getPlayer(playerName); - if (player != null) { - UUID playerUUID = player.getUniqueId(); - Set users = groupUsers.getOrDefault(groupName, new HashSet<>()); - if (!users.contains(playerUUID)) { - users.add(playerUUID); - groupUsers.put(groupName, users); - - // Save to config - FileConfiguration config = getConfig(); - config.set("groups." + groupName + ".users", new ArrayList<>(users.stream().map(UUID::toString).collect(Collectors.toList()))); - saveConfig(); - - sender.sendMessage(ChatColor.GREEN + "User added to group successfully!"); - } else { - sender.sendMessage(ChatColor.RED + "User is already in the group!"); - } - } else { - sender.sendMessage(ChatColor.RED + "Player not found!"); - } - } else { - sender.sendMessage(ChatColor.RED + "Group does not exist!"); - } - return true; - } - } else if (cmd.getName().equalsIgnoreCase("removefromgroup")) { - if (args.length == 2) { - String playerName = args[0]; - String groupName = args[1]; - - if (groups.containsKey(groupName)) { - Player player = Bukkit.getPlayer(playerName); - if (player != null) { - UUID playerUUID = player.getUniqueId(); - Set users = groupUsers.getOrDefault(groupName, new HashSet<>()); - if (users.contains(playerUUID)) { - users.remove(playerUUID); - groupUsers.put(groupName, users); - - // Save to config - FileConfiguration config = getConfig(); - config.set("groups." + groupName + ".users", new ArrayList<>(users.stream().map(UUID::toString).collect(Collectors.toList()))); - saveConfig(); - - sender.sendMessage(ChatColor.GREEN + "User removed from group successfully!"); - } else { - sender.sendMessage(ChatColor.RED + "User is not in the group!"); - } - } else { - sender.sendMessage(ChatColor.RED + "Player not found!"); - } - } else { - sender.sendMessage(ChatColor.RED + "Group does not exist!"); - } - return true; - } - } else if (cmd.getName().equalsIgnoreCase("tagreload")) { - reloadConfig(); - - // Reload groups, group hierarchy, and chat format from config - groups.clear(); - groupHierarchy.clear(); - - FileConfiguration config = getConfig(); - ConfigurationSection groupsConfig = config.getConfigurationSection("groups"); - if (groupsConfig != null) { - for (String groupName : groupsConfig.getKeys(false)) { - String prefix = groupsConfig.getString(groupName + ".prefix"); - int hierarchy = groupsConfig.getInt(groupName + ".hierarchy"); - groups.put(groupName, prefix); - groupHierarchy.put(groupName, hierarchy); - } - } - - // Reload chat format - chatFormat = config.getString("chatFormat", "{TAG}&r {PLAYER}:&r {MESSAGE}"); - - sender.sendMessage(ChatColor.GREEN + "Config reloaded!"); - return true; - } - return false; + // Register events + getServer().getPluginManager().registerEvents(groupManager, this); } - private void addGroup(UUID playerId, String groupName) { - List groups = playerGroups.computeIfAbsent(playerId, k -> new ArrayList<>()); - groups.add(groupName); - - // Sort groups by hierarchy - groups.sort(Comparator.comparingInt(group -> groupHierarchy.getOrDefault(group, 0))); - - // Remove duplicate groups - Set uniqueGroups = new LinkedHashSet<>(groups); - groups.clear(); - groups.addAll(uniqueGroups); + public GroupManager getGroupManager() { + return groupManager; } - private void removeGroup(UUID playerId, String groupName) { - List groups = playerGroups.get(playerId); - if (groups != null) { - groups.remove(groupName); - } + public CommandManager getCommandManager() { + return commandManager; } - @EventHandler - public void onPlayerChat(AsyncPlayerChatEvent event) { - Player player = event.getPlayer(); - String playerName = player.getName(); - String message = event.getMessage(); - - String playerGroup = null; - int highestHierarchy = Integer.MIN_VALUE; - - for (Map.Entry> entry : groupUsers.entrySet()) { - if (entry.getValue().contains(player.getUniqueId())) { - int hierarchy = groupHierarchy.get(entry.getKey()); - if (hierarchy > highestHierarchy) { - highestHierarchy = hierarchy; - playerGroup = entry.getKey(); - } - } - } - - if (playerGroup != null) { - String prefix = groups.get(playerGroup); - String formattedMessage = chatFormat - .replace("{TAG}", prefix) - .replace("{PLAYER}", playerName) - .replace("{MESSAGE}", message); - - event.setFormat(ChatColor.translateAlternateColorCodes('&', formattedMessage)); - } + public String getChatFormat() { + return chatFormat; } - } diff --git a/src/main/java/dev/goldenn/bettergroups/CommandManager.java b/src/main/java/dev/goldenn/bettergroups/CommandManager.java new file mode 100644 index 0000000..037794d --- /dev/null +++ b/src/main/java/dev/goldenn/bettergroups/CommandManager.java @@ -0,0 +1,82 @@ +package dev.goldenn.bettergroups; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class CommandManager implements CommandExecutor { + + private BetterGroups plugin; + private GroupManager groupManager; + + public CommandManager(BetterGroups plugin, GroupManager groupManager) { + this.plugin = plugin; + this.groupManager = groupManager; + plugin.getCommand("creategroup").setExecutor(this); + plugin.getCommand("addtogroup").setExecutor(this); + plugin.getCommand("removefromgroup").setExecutor(this); + plugin.getCommand("tagreload").setExecutor(this); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + if (cmd.getName().equalsIgnoreCase("creategroup")) { + if (args.length >= 2) { + String groupName = args[0]; + String prefix = args[1]; + int hierarchy = args.length > 2 ? Integer.parseInt(args[2]) : 0; + + boolean created = groupManager.addGroup(groupName, prefix, hierarchy); + if (created) { + sender.sendMessage(ChatColor.GREEN + "Group created successfully!"); + } else { + sender.sendMessage(ChatColor.RED + "Group already exists!"); + } + return true; + } + } else if (cmd.getName().equalsIgnoreCase("addtogroup")) { + if (args.length >= 2) { + String groupName = args[0]; + String playerName = args[1]; + + Player targetPlayer = plugin.getServer().getPlayer(playerName); + if (targetPlayer != null && targetPlayer.isOnline()) { + boolean added = groupManager.addUserToGroup(groupName, targetPlayer.getUniqueId()); + if (added) { + sender.sendMessage(ChatColor.GREEN + "User added to group successfully!"); + } else { + sender.sendMessage(ChatColor.RED + "User is already in the group!"); + } + } else { + sender.sendMessage(ChatColor.RED + "Player not found or offline!"); + } + return true; + } + } else if (cmd.getName().equalsIgnoreCase("removefromgroup")) { + if (args.length == 2) { + String playerName = args[0]; + String groupName = args[1]; + + Player targetPlayer = plugin.getServer().getPlayer(playerName); + if (targetPlayer != null && targetPlayer.isOnline()) { + boolean removed = groupManager.removeUserFromGroup(groupName, targetPlayer.getUniqueId()); + if (removed) { + sender.sendMessage(ChatColor.GREEN + "User removed from group successfully!"); + } else { + sender.sendMessage(ChatColor.RED + "User is not in the group!"); + } + } else { + sender.sendMessage(ChatColor.RED + "Player not found or offline!"); + } + return true; + } + } else if (cmd.getName().equalsIgnoreCase("tagreload")) { + plugin.reloadConfig(); + sender.sendMessage(ChatColor.GREEN + "Config reloaded!"); + return true; + } + return false; + } +} diff --git a/src/main/java/dev/goldenn/bettergroups/GroupManager.java b/src/main/java/dev/goldenn/bettergroups/GroupManager.java new file mode 100644 index 0000000..bf34423 --- /dev/null +++ b/src/main/java/dev/goldenn/bettergroups/GroupManager.java @@ -0,0 +1,129 @@ +package dev.goldenn.bettergroups; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +import java.util.*; + +public class GroupManager implements Listener { + + private BetterGroups plugin; + private Map groups; + private Map groupHierarchy; + private Map> groupUsers; + + public GroupManager(BetterGroups plugin) { + this.plugin = plugin; + this.groups = new HashMap<>(); + this.groupHierarchy = new HashMap<>(); + this.groupUsers = new HashMap<>(); + loadGroups(); + } + + private void loadGroups() { + FileConfiguration config = plugin.getConfig(); + if (config.contains("groups")) { + Set groupNames = config.getConfigurationSection("groups").getKeys(false); + for (String groupName : groupNames) { + String prefix = config.getString("groups." + groupName + ".prefix"); + int hierarchy = config.getInt("groups." + groupName + ".hierarchy"); + groups.put(groupName, prefix); + + List userUUIDStrings = config.getStringList("groups." + groupName + ".users"); + Set userUUIDs = new HashSet<>(); + for (String userUUIDString : userUUIDStrings) { + userUUIDs.add(UUID.fromString(userUUIDString)); + } + groupUsers.put(groupName, userUUIDs); + + groupHierarchy.put(groupName, hierarchy); + } + } + } + + public boolean addGroup(String groupName, String prefix, int hierarchy) { + if (!groups.containsKey(groupName)) { + groups.put(groupName, prefix); + groupHierarchy.put(groupName, hierarchy); + groupUsers.put(groupName, new HashSet<>()); + + // Save to config + FileConfiguration config = plugin.getConfig(); + config.set("groups." + groupName + ".prefix", prefix); + config.set("groups." + groupName + ".hierarchy", hierarchy); + config.set("groups." + groupName + ".users", new ArrayList<>(groupUsers.get(groupName))); + plugin.saveConfig(); + return true; + } + return false; + } + + public boolean addUserToGroup(String groupName, UUID userUUID) { + if (groups.containsKey(groupName)) { + Set users = groupUsers.get(groupName); + if (!users.contains(userUUID)) { + users.add(userUUID); + groupUsers.put(groupName, users); + + // Save to config + FileConfiguration config = plugin.getConfig(); + config.set("groups." + groupName + ".users", new ArrayList<>(groupUsers.get(groupName))); + plugin.saveConfig(); + return true; + } + } + return false; + } + + public boolean removeUserFromGroup(String groupName, UUID userUUID) { + if (groups.containsKey(groupName)) { + Set users = groupUsers.get(groupName); + if (users.contains(userUUID)) { + users.remove(userUUID); + groupUsers.put(groupName, users); + + // Save to config + FileConfiguration config = plugin.getConfig(); + config.set("groups." + groupName + ".users", new ArrayList<>(groupUsers.get(groupName))); + plugin.saveConfig(); + return true; + } + } + return false; + } + + @EventHandler + public void onPlayerChat(AsyncPlayerChatEvent event) { + Player player = event.getPlayer(); + String playerName = player.getName(); + String message = event.getMessage(); + + String playerGroup = null; + int highestHierarchy = Integer.MIN_VALUE; + + for (Map.Entry> entry : groupUsers.entrySet()) { + if (entry.getValue().contains(player.getUniqueId())) { + int hierarchy = groupHierarchy.get(entry.getKey()); + if (hierarchy > highestHierarchy) { + highestHierarchy = hierarchy; + playerGroup = entry.getKey(); + } + } + } + + if (playerGroup != null) { + String prefix = groups.get(playerGroup); + String formattedMessage = plugin.getChatFormat() + .replace("{TAG}", prefix) + .replace("{PLAYER}", playerName) + .replace("{MESSAGE}", message); + + event.setFormat(ChatColor.translateAlternateColorCodes('&', formattedMessage)); + } + } +}