From 8bc458c46891ab7faab612aca1ba4edcf37d8996 Mon Sep 17 00:00:00 2001 From: DaTTV <104141141+DrFreezyYT@users.noreply.github.com> Date: Sun, 16 Feb 2025 20:47:39 +0100 Subject: [PATCH] Added ClanCommand and implemented tabcompletor --- .idea/discord.xml | 7 + .../plugins/papermc/blazesmp/BlazeSMP.java | 4 + .../papermc/blazesmp/command/ClanCommand.java | 158 ++++++++++++++++++ .../blazesmp/command/util/SimpleCommand.java | 114 +++++++++++++ .../plugins/papermc/blazesmp/module/Clan.java | 12 ++ .../blazesmp/module/manager/Clans.java | 61 ++++++- .../blazesmp/module/manager/Homes.java | 3 +- .../module/manager/ProtectedBlocks.java | 6 +- 8 files changed, 351 insertions(+), 14 deletions(-) create mode 100644 .idea/discord.xml create mode 100644 src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java create mode 100644 src/main/java/me/freezy/plugins/papermc/blazesmp/command/util/SimpleCommand.java diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..30bab2a --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java index 7af748e..f073844 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java @@ -1,6 +1,7 @@ package me.freezy.plugins.papermc.blazesmp; import lombok.Getter; +import me.freezy.plugins.papermc.blazesmp.command.ClanCommand; import me.freezy.plugins.papermc.blazesmp.module.manager.Clans; import me.freezy.plugins.papermc.blazesmp.module.manager.Homes; import me.freezy.plugins.papermc.blazesmp.module.manager.ProtectedBlocks; @@ -46,6 +47,9 @@ public final class BlazeSMP extends JavaPlugin { public void onEnable() { BlazeSMP.instance=this; + this.log.info("Registering Commands..."); + new ClanCommand().register(); + this.log.info("Registered Commands!"); } @Override diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java new file mode 100644 index 0000000..dfb63f4 --- /dev/null +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java @@ -0,0 +1,158 @@ +package me.freezy.plugins.papermc.blazesmp.command; + +import me.freezy.plugins.papermc.blazesmp.BlazeSMP; +import me.freezy.plugins.papermc.blazesmp.command.util.SimpleCommand; +import me.freezy.plugins.papermc.blazesmp.module.Clan; +import me.freezy.plugins.papermc.blazesmp.module.manager.Clans; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ClanCommand extends SimpleCommand { + private final BlazeSMP plugin; + private final Clans clans; + + private final LinkedHashMap> clanInvites = new LinkedHashMap<>(); + private final LinkedHashMap> clanJoins = new LinkedHashMap<>(); + + public ClanCommand() { + super("clan"); + plugin = BlazeSMP.getInstance(); + clans = plugin.getClans(); + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String list, @NotNull String[] args) { + return false; + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String list, @NotNull String[] args) { + Player player = (Player) sender; + UUID playerUUID = player.getUniqueId(); + if (args.length == 1) { + if (clans.isLeader(playerUUID)) { + return Stream.of("info", "invite", "kick", "transfer", "promote", "demote", "disband", "leave", "accept", "deny", "modify") + .filter(s -> s.startsWith(args[0])) + .toList(); + } else if (clans.isVice(playerUUID)) { + return Stream.of("info", "invite", "kick", "demote", "leave", "accept", "deny") + .filter(s -> s.startsWith(args[0])) + .toList(); + } else if (clans.isMember(playerUUID)) { + return Stream.of("info","leave") + .filter(s -> s.startsWith(args[0])) + .toList(); + } else { + return Stream.of("create", "join", "accept", "deny") + .filter(s -> s.startsWith(args[0])) + .toList(); + } + } else if (args.length == 2) { + if (clans.isLeader(playerUUID)) { + if (args[0].equalsIgnoreCase("invite")) { + return Bukkit.getOnlinePlayers().stream() + .filter(p -> !clans.isMember(p.getUniqueId())) + .map(Player::getName) + .filter(name -> name.startsWith(args[1])) + .collect(Collectors.toList()); + } else if (args[0].equalsIgnoreCase("kick")) { + return clans.getClanByMember(playerUUID).getMembers().stream() + .map(UUID::toString) + .filter(s -> s.startsWith(args[1])) + .collect(Collectors.toList()); + } else if (args[0].equalsIgnoreCase("promote")) { + return clans.getClanByMember(playerUUID).getMembers().stream() + .map(UUID::toString) + .filter(s -> s.startsWith(args[1])) + .collect(Collectors.toList()); + } else if (args[0].equalsIgnoreCase("demote")) { + return Collections.singletonList(plugin.getServer().getOfflinePlayer(clans.getClanByMember(playerUUID).getViceUUID()).getName()); + } else if (args[0].equalsIgnoreCase("accept")) { + List joins = getClanJoinRequests(args, playerUUID); + if (joins != null) return joins; + } else if (args[0].equalsIgnoreCase("deny")) { + List joins = getClanJoinRequests(args, playerUUID); + if (joins != null) return joins; + } else if (args[0].equalsIgnoreCase("modify")) { + return Stream.of("name", "tag") + .filter(s -> s.startsWith(args[1])) + .toList(); + } + } else if (clans.isVice(playerUUID)) { + if (args[0].equalsIgnoreCase("invite")) { + return Bukkit.getOnlinePlayers().stream() + .filter(p -> !clans.isMember(p.getUniqueId())) + .map(Player::getName) + .filter(name -> name.startsWith(args[1])) + .collect(Collectors.toList()); + } else if (args[0].equalsIgnoreCase("kick")) { + return clans.getClanByMember(playerUUID).getMembers().stream() + .map(UUID::toString) + .filter(s -> s.startsWith(args[1])) + .collect(Collectors.toList()); + } else if (args[0].equalsIgnoreCase("accept")) { + List joins = getClanJoinRequests(args, playerUUID); + if (joins != null) return joins; + } else if (args[0].equalsIgnoreCase("deny")) { + List joins = getClanJoinRequests(args, playerUUID); + if (joins != null) return joins; + } else if (args[0].equalsIgnoreCase("demote")) { + return Collections.singletonList(plugin.getServer().getOfflinePlayer(clans.getClanByMember(playerUUID).getViceUUID()).getName()); + } + } else { + if (args[0].equalsIgnoreCase("accept")) { + return clanInvites.entrySet().stream() + .filter(entry -> entry.getValue().contains(playerUUID)) + .map(entry -> entry.getKey().getName()) + .collect(Collectors.toList()); + } else if (args[0].equalsIgnoreCase("deny")) { + return clanInvites.entrySet().stream() + .filter(entry -> entry.getValue().contains(playerUUID)) + .map(entry -> entry.getKey().getName()) + .collect(Collectors.toList()); + } else if (args[0].equalsIgnoreCase("join")) { + return clans.getClans().stream() + .map(Clan::getName) + .filter(s -> s.startsWith(args[1])) + .collect(Collectors.toList()); + } else if (args[0].equalsIgnoreCase("create")) { + return Collections.singletonList(""); + } + } + } else if (args.length == 3) { + if (clans.isLeader(playerUUID)) { + if (args[1].equalsIgnoreCase("name")) { + return Collections.singletonList(""); + } else if (args[1].equalsIgnoreCase("tag")) { + return Collections.singletonList(""); + } + } else { + if (args[0].equalsIgnoreCase("create")) { + return Collections.singletonList(""); + } + } + } + return List.of(); + } + + @Nullable + private List getClanJoinRequests(@NotNull String[] args, UUID playerUUID) { + LinkedList joins = clanJoins.get(clans.getClanByMember(playerUUID)); + if (joins != null) { + return joins.stream() + .map(uuid -> plugin.getServer().getOfflinePlayer(uuid).getName()) + .filter(Objects::nonNull) + .filter(s -> s.startsWith(args[1])) + .collect(Collectors.toList()); + } + return null; + } +} diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/util/SimpleCommand.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/util/SimpleCommand.java new file mode 100644 index 0000000..53e9057 --- /dev/null +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/util/SimpleCommand.java @@ -0,0 +1,114 @@ +package me.freezy.plugins.papermc.blazesmp.command.util; + +import me.freezy.plugins.papermc.blazesmp.BlazeSMP; +import org.bukkit.Bukkit; +import org.bukkit.command.*; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.logging.Logger; + +@SuppressWarnings("ALL") +public abstract class SimpleCommand implements CommandExecutor, TabExecutor { + protected static Logger logger = Logger.getLogger(BlazeSMP.class.getName()); + protected static CommandMap cmap; + protected final String command; + protected final String description; + protected final List alias; + protected final String usage; + protected final String permissionMessage; + protected final String permission; + + public SimpleCommand(String command) { + this(command, null, null, null, null, null); + } + + public SimpleCommand(String command, String usage) { + this(command, usage, null, null, null, null); + } + + public SimpleCommand(String command, String usage, String description) { + this(command, usage, description, null, null, null); + } + + public SimpleCommand(String command, String usage, String description, List alias) { + this(command, usage, description, null, null, alias); + } + + public SimpleCommand(String command, String usage, String description, String permissionMessage) { + this(command, usage, description, permissionMessage, null, null); + } + + public SimpleCommand(String command, String usage, String description, String permissionMessage, String permission) { + this(command, usage, description, permissionMessage, permission, null); + } + + public SimpleCommand(String command, String usage, String description, String permission, List alias) { + this(command, usage, description, null, permission, alias); + } + + public SimpleCommand(String command, String usage, String description, String permissionMessage, String permission, List alias) { + this.command = command; + this.description = description; + this.alias = alias; + this.usage = usage; + this.permissionMessage = permissionMessage; + this.permission = permission; + } + + public void register() { + ReflectCommand cmd = new ReflectCommand(this.command); + if (this.alias != null) cmd.setAliases(this.alias); + if (this.description != null) cmd.setDescription(this.description); + if (this.usage != null) cmd.setUsage(this.usage); + if (this.permissionMessage != null) cmd.setPermissionMessage(this.permissionMessage); + if (this.permission != null) cmd.setPermission(this.permission); + getCommandMap().register("blazesmp", cmd); + cmd.setExecutor(this); + } + + final CommandMap getCommandMap() { + if (cmap == null) { + try { + final Field f = Bukkit.getServer().getClass().getDeclaredField("commandMap"); + f.setAccessible(true); + cmap = (CommandMap) f.get(Bukkit.getServer()); + return getCommandMap(); + } catch (Exception e) { + logger.severe(String.valueOf(e)); + } + } else { + return cmap; + } + return getCommandMap(); + } + + private static final class ReflectCommand extends Command { + private SimpleCommand exe = null; + + private ReflectCommand(String command) { + super(command); + } + + public void setExecutor(SimpleCommand exe) { + this.exe = exe; + } + + @Override + public boolean execute(@NotNull CommandSender sender, @NotNull String label, String[] args) { + if (exe != null) { + return exe.onCommand(sender, this, label, args); + } + return false; + } + + @Override + public List tabComplete(@NotNull CommandSender sender, @NotNull String alias, String[] args) { + if (exe != null) { + return exe.onTabComplete(sender, this, alias, args); + } + return null; + } + } +} \ No newline at end of file diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/Clan.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/Clan.java index e16dbbf..d96171e 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/Clan.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/Clan.java @@ -187,6 +187,18 @@ public class Clan { } } + public boolean isLeader(UUID playerUUID) { + return this.leaderUUID.equals(playerUUID); + } + + public boolean isVice(UUID playerUUID) { + return this.viceUUID != null && this.viceUUID.equals(playerUUID); + } + + public boolean isMember(UUID playerUUID) { + return this.leaderUUID.equals(playerUUID) || (this.viceUUID != null && this.viceUUID.equals(playerUUID)) || this.members.contains(playerUUID); + } + // Helper classes to represent the JSON structure private static class ClanJson { diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Clans.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Clans.java index 1effa2e..85653bf 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Clans.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Clans.java @@ -1,5 +1,6 @@ package me.freezy.plugins.papermc.blazesmp.module.manager; +import lombok.Getter; import me.freezy.plugins.papermc.blazesmp.module.Clan; import java.io.File; @@ -7,25 +8,22 @@ import java.util.LinkedList; import java.util.UUID; import java.util.logging.Logger; +@Getter public class Clans { private static final Logger LOGGER = Logger.getLogger("ClanManager"); private static final String CLAN_STORAGE_PATH = "plugins/BlazeSMP/storage/clans/"; + /** + * -- GETTER -- + * Returns the list of loaded clans. + * + */ private final LinkedList clans; public Clans() { this.clans = new LinkedList<>(); } - /** - * Returns the list of loaded clans. - * - * @return LinkedList of Clan objects. - */ - public LinkedList getClans() { - return clans; - } - /** * Loads all clan files from the storage folder. */ @@ -124,4 +122,49 @@ public class Clans { } } } + + public boolean isLeader(UUID playerUUID) { + for (Clan clan : clans) { + if (clan.getLeaderUUID().equals(playerUUID)) { + return true; + } + } + return false; + } + + public boolean isVice(UUID playerUUID) { + for (Clan clan : clans) { + if (clan.getViceUUID() != null && clan.getViceUUID().equals(playerUUID)) { + return true; + } + } + return false; + } + + public boolean isMember(UUID playerUUID) { + for (Clan clan : clans) { + if (clan.getMembers().contains(playerUUID)) { + return true; + } + } + return false; + } + + public boolean isInClan(UUID playerUUID) { + for (Clan clan : clans) { + if (clan.getMembers().contains(playerUUID) || clan.getLeaderUUID().equals(playerUUID) || (clan.getViceUUID() != null && clan.getViceUUID().equals(playerUUID))) { + return true; + } + } + return false; + } + + public Clan getClanByMember(UUID playerUUID) { + for (Clan clan : clans) { + if (clan.getMembers().contains(playerUUID) || clan.getLeaderUUID().equals(playerUUID) || (clan.getViceUUID() != null && clan.getViceUUID().equals(playerUUID))) { + return clan; + } + } + return null; + } } diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Homes.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Homes.java index d43e63d..81d7b37 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Homes.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Homes.java @@ -18,13 +18,14 @@ import java.util.Map; import java.util.UUID; import java.util.logging.Logger; +@Getter public class Homes { private static final String FILE_PATH = "plugins/BlazeSMP/storage/homes.json"; private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private static final Logger LOGGER = Logger.getLogger("Homes"); // Mapping of player UUID to their home location - @Getter private final LinkedHashMap homes; + private final LinkedHashMap homes; public Homes() { this.homes = new LinkedHashMap<>(); diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/ProtectedBlocks.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/ProtectedBlocks.java index 4460fb7..e0d1675 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/ProtectedBlocks.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/ProtectedBlocks.java @@ -2,6 +2,7 @@ package me.freezy.plugins.papermc.blazesmp.module.manager; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import lombok.Getter; import me.freezy.plugins.papermc.blazesmp.module.ProtectedBlock; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -19,6 +20,7 @@ import java.util.logging.Logger; /** * Manager class for loading and saving protected blocks. */ +@Getter public class ProtectedBlocks { private static final String FILE_PATH = "plugins/BlazeSMP/storage/protected_blocks.json"; private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); @@ -31,10 +33,6 @@ public class ProtectedBlocks { this.blocks = new ArrayList<>(); } - public List getBlocks() { - return blocks; - } - /** * Loads protected blocks from the JSON file. */