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));
+ }
+ }
+}