diff --git a/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java b/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java index 7594c90..44f69e9 100644 --- a/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java +++ b/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java @@ -19,6 +19,7 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import space.arim.morepaperlib.MorePaperLib; +import space.arim.morepaperlib.commands.CommandRegistration; import space.arim.morepaperlib.scheduling.GracefulScheduling; import java.io.File; @@ -41,6 +42,7 @@ public final class VillagerOptimizer extends JavaPlugin { private static VillagerOptimizer instance; private static VillagerCache villagerCache; + private static CommandRegistration commandRegistration; private static GracefulScheduling scheduling; private static Map languageCacheMap; private static Config config; @@ -58,7 +60,9 @@ public final class VillagerOptimizer extends JavaPlugin { @Override public void onEnable() { instance = this; - scheduling = new MorePaperLib(this).scheduling(); + MorePaperLib morePaperLib = new MorePaperLib(this); + commandRegistration = morePaperLib.commandRegistration(); + scheduling = morePaperLib.scheduling(); audiences = BukkitAudiences.create(this); logger = ComponentLogger.logger(getLogger().getName()); bStats = new Metrics(this, 19954); @@ -144,6 +148,9 @@ public final class VillagerOptimizer extends JavaPlugin { public static @NotNull VillagerCache getCache() { return villagerCache; } + public static @NotNull CommandRegistration commandRegistration() { + return commandRegistration; + } public static @NotNull GracefulScheduling scheduling() { return scheduling; } diff --git a/src/main/java/me/xginko/villageroptimizer/commands/SubCommand.java b/src/main/java/me/xginko/villageroptimizer/commands/SubCommand.java index 4ce3d53..5ac9edb 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/SubCommand.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/SubCommand.java @@ -1,11 +1,19 @@ package me.xginko.villageroptimizer.commands; import net.kyori.adventure.text.TextComponent; +import org.bukkit.command.CommandException; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public abstract class SubCommand { - public abstract String getLabel(); - public abstract TextComponent getDescription(); - public abstract TextComponent getSyntax(); - public abstract void perform(CommandSender sender, String[] args); + + public abstract @NotNull String label(); + public abstract @NotNull TextComponent description(); + public abstract @NotNull TextComponent syntax(); + public abstract @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) + throws CommandException, IllegalArgumentException; + public abstract boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args); + } diff --git a/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java b/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java index f344075..cb95d91 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java @@ -1,37 +1,94 @@ package me.xginko.villageroptimizer.commands; import me.xginko.villageroptimizer.VillagerOptimizer; -import me.xginko.villageroptimizer.commands.optimizevillagers.OptVillagersRadius; -import me.xginko.villageroptimizer.commands.unoptimizevillagers.UnOptVillagersRadius; -import me.xginko.villageroptimizer.commands.villageroptimizer.VillagerOptimizerCmd; +import me.xginko.villageroptimizer.utils.Disableable; +import me.xginko.villageroptimizer.utils.Enableable; +import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandMap; +import org.bukkit.command.CommandSender; +import org.bukkit.command.PluginIdentifiableCommand; import org.bukkit.command.TabCompleter; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; +import java.lang.reflect.Modifier; import java.util.Arrays; -import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; -public interface VillagerOptimizerCommand extends CommandExecutor, TabCompleter { +public abstract class VillagerOptimizerCommand extends Command + implements Enableable, Disableable, PluginIdentifiableCommand, CommandExecutor, TabCompleter { - String label(); + public static final Set COMMANDS = new HashSet<>(); + public static final List RADIUS_SUGGESTIONS = Arrays.asList("5", "10", "25", "50"); + public static final Reflections COMMANDS_PACKAGE = new Reflections(VillagerOptimizerCommand.class.getPackage().getName()); - List NO_TABCOMPLETES = Collections.emptyList(); - List RADIUS_TABCOMPLETES = Arrays.asList("5", "10", "25", "50"); + protected VillagerOptimizerCommand( + @NotNull String name, @NotNull String description, @NotNull String usageMessage, @NotNull List aliases + ) { + super(name, description, usageMessage, aliases); + } - HashSet commands = new HashSet<>(); + public static void reloadCommands() { + COMMANDS.forEach(Disableable::disable); + COMMANDS.clear(); - static void reloadCommands() { + COMMANDS.addAll(COMMANDS_PACKAGE.get(Scanners.SubTypes.of(VillagerOptimizerCommand.class).asClass()) + .stream() + .filter(clazz -> !clazz.isInterface() && !Modifier.isAbstract(clazz.getModifiers())) + .map(clazz -> { + try { + return (VillagerOptimizerCommand) clazz.getDeclaredConstructor().newInstance(); + } catch (Throwable t) { + VillagerOptimizer.logger().warn("Failed initialising command '{}'. This should not happen.", clazz.getSimpleName()); + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toSet())); + + COMMANDS.forEach(Enableable::enable); + } + + @Override + public @Nullable List onTabComplete( + @NotNull CommandSender sender, @NotNull Command command, @NotNull String commandLabel, @NotNull String[] args + ) { + return tabComplete(sender, commandLabel, args); + } + + @Override + public boolean onCommand( + @NotNull CommandSender sender, @NotNull Command command, @NotNull String commandLabel, @NotNull String[] args + ) { + return execute(sender, commandLabel, args); + } + + @Override + public @NotNull Plugin getPlugin() { + return VillagerOptimizer.getInstance(); + } + + @Override + @SuppressWarnings({"deprecation", "DataFlowIssue"}) + public void enable() { VillagerOptimizer plugin = VillagerOptimizer.getInstance(); - CommandMap commandMap = plugin.getServer().getCommandMap(); - commands.forEach(command -> plugin.getCommand(command.label()).unregister(commandMap)); - commands.clear(); + VillagerOptimizer.commandRegistration().getServerCommandMap() + .register(plugin.getDescription().getName().toLowerCase(), this); + plugin.getCommand(getName()).setExecutor(this); + plugin.getCommand(getName()).setTabCompleter(this); + } - commands.add(new VillagerOptimizerCmd()); - commands.add(new OptVillagersRadius()); - commands.add(new UnOptVillagersRadius()); - - commands.forEach(command -> plugin.getCommand(command.label()).setExecutor(command)); + @Override + @SuppressWarnings("DataFlowIssue") + public void disable() { + VillagerOptimizer.getInstance().getCommand(getName()) + .unregister(VillagerOptimizer.commandRegistration().getServerCommandMap()); } } diff --git a/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java b/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java index 9212995..45e8b9d 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java @@ -2,34 +2,41 @@ package me.xginko.villageroptimizer.commands.optimizevillagers; import me.xginko.villageroptimizer.VillagerCache; import me.xginko.villageroptimizer.VillagerOptimizer; -import me.xginko.villageroptimizer.wrapper.WrappedVillager; import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand; import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.enums.OptimizationType; import me.xginko.villageroptimizer.enums.Permissions; import me.xginko.villageroptimizer.events.VillagerOptimizeEvent; import me.xginko.villageroptimizer.utils.KyoriUtil; +import me.xginko.villageroptimizer.wrapper.WrappedVillager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextReplacementConfig; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.command.Command; +import org.bukkit.command.CommandException; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Villager; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import java.util.Arrays; +import java.util.Collections; import java.util.List; -public class OptVillagersRadius implements VillagerOptimizerCommand { +public class OptVillagersRadius extends VillagerOptimizerCommand { private final long cooldown; private final int max_radius; public OptVillagersRadius() { + super( + "optimizevillagers", + "Optmize villagers in a radius around you", + "/unoptimizevillagers ", + Arrays.asList("optvils", "noai") + ); Config config = VillagerOptimizer.config(); this.max_radius = config.getInt("optimization-methods.commands.optimizevillagers.max-block-radius", 100); this.cooldown = config.getInt("optimization-methods.commands.optimizevillagers.cooldown-seconds", 600, @@ -38,17 +45,14 @@ public class OptVillagersRadius implements VillagerOptimizerCommand { } @Override - public String label() { - return "optimizevillagers"; + public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) + throws CommandException, IllegalArgumentException + { + return args.length == 1 ? RADIUS_SUGGESTIONS : Collections.emptyList(); } @Override - public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - return args.length == 1 ? RADIUS_TABCOMPLETES : NO_TABCOMPLETES; - } - - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) { if (!sender.hasPermission(Permissions.Commands.OPTIMIZE_RADIUS.get())) { KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission); return true; diff --git a/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java b/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java index ff9342d..0ab7e83 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java @@ -2,48 +2,52 @@ package me.xginko.villageroptimizer.commands.unoptimizevillagers; import me.xginko.villageroptimizer.VillagerCache; import me.xginko.villageroptimizer.VillagerOptimizer; -import me.xginko.villageroptimizer.wrapper.WrappedVillager; import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand; import me.xginko.villageroptimizer.enums.OptimizationType; import me.xginko.villageroptimizer.enums.Permissions; import me.xginko.villageroptimizer.events.VillagerUnoptimizeEvent; import me.xginko.villageroptimizer.utils.KyoriUtil; +import me.xginko.villageroptimizer.wrapper.WrappedVillager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextReplacementConfig; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.command.Command; +import org.bukkit.command.CommandException; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Villager; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import java.util.Arrays; +import java.util.Collections; import java.util.List; -public class UnOptVillagersRadius implements VillagerOptimizerCommand { +public class UnOptVillagersRadius extends VillagerOptimizerCommand { private final int max_radius; public UnOptVillagersRadius() { + super( + "unoptimizevillagers", + "Unoptmize villagers in a radius around you", + "/optimizevillagers ", + Arrays.asList("unoptvils", "noaiundo") + ); this.max_radius = VillagerOptimizer.config() .getInt("optimization-methods.commands.unoptimizevillagers.max-block-radius", 100); } @Override - public String label() { - return "unoptimizevillagers"; + public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) + throws CommandException, IllegalArgumentException + { + return args.length == 1 ? RADIUS_SUGGESTIONS : Collections.emptyList(); } @Override - public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - return args.length == 1 ? RADIUS_TABCOMPLETES : NO_TABCOMPLETES; - } - - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) { if (!sender.hasPermission(Permissions.Commands.UNOPTIMIZE_RADIUS.get())) { KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission); return true; diff --git a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java index b906156..4aa71f6 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java @@ -6,63 +6,75 @@ import me.xginko.villageroptimizer.commands.villageroptimizer.subcommands.Disabl import me.xginko.villageroptimizer.commands.villageroptimizer.subcommands.ReloadSubCmd; import me.xginko.villageroptimizer.commands.villageroptimizer.subcommands.VersionSubCmd; import me.xginko.villageroptimizer.enums.Permissions; -import me.xginko.villageroptimizer.utils.Util; import me.xginko.villageroptimizer.utils.KyoriUtil; +import me.xginko.villageroptimizer.utils.Util; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.command.Command; +import org.bukkit.command.CommandException; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -public class VillagerOptimizerCmd implements VillagerOptimizerCommand { +public class VillagerOptimizerCmd extends VillagerOptimizerCommand { private final List subCommands; - private final List tabCompleter; + private final List tabCompletes; public VillagerOptimizerCmd() { + super( + "villageroptimizer", + "VillagerOptimizer admin commands", + "/villageroptimizer [ reload, version, disable ]", + Arrays.asList("voptimizer", "vo") + ); subCommands = Arrays.asList(new ReloadSubCmd(), new VersionSubCmd(), new DisableSubCmd()); - tabCompleter = subCommands.stream().map(SubCommand::getLabel).collect(Collectors.toList()); + tabCompletes = subCommands.stream().map(SubCommand::label).collect(Collectors.toList()); } @Override - public String label() { - return "villageroptimizer"; - } - - @Override - public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { - return args.length == 1 ? tabCompleter : NO_TABCOMPLETES; - } - - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { - if (args.length == 0) { - sendCommandOverview(sender); - return true; + public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) + throws CommandException, IllegalArgumentException + { + if (args.length == 1) { + return tabCompletes; } - for (final SubCommand subCommand : subCommands) { - if (args[0].equalsIgnoreCase(subCommand.getLabel())) { - subCommand.perform(sender, args); - return true; + if (args.length >= 2) { + for (SubCommand subCommand : subCommands) { + if (args[0].equalsIgnoreCase(subCommand.label())) { + return subCommand.tabComplete(sender, alias, args); + } } } - sendCommandOverview(sender); + return Collections.emptyList(); + } + + @Override + public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) { + if (args.length >= 1) { + for (SubCommand subCommand : subCommands) { + if (args[0].equalsIgnoreCase(subCommand.label())) { + return subCommand.execute(sender, commandLabel, args); + } + } + } + + overview(sender); return true; } - private void sendCommandOverview(CommandSender sender) { + private void overview(CommandSender sender) { if (!sender.hasPermission(Permissions.Commands.RELOAD.get()) && !sender.hasPermission(Permissions.Commands.VERSION.get())) return; KyoriUtil.sendMessage(sender, Component.text("-----------------------------------------------------").color(NamedTextColor.GRAY)); KyoriUtil.sendMessage(sender, Component.text("VillagerOptimizer Commands").color(Util.PL_COLOR)); KyoriUtil.sendMessage(sender, Component.text("-----------------------------------------------------").color(NamedTextColor.GRAY)); subCommands.forEach(subCommand -> KyoriUtil.sendMessage(sender, - subCommand.getSyntax().append(Component.text(" - ").color(NamedTextColor.DARK_GRAY)).append(subCommand.getDescription()))); + subCommand.syntax().append(Component.text(" - ").color(NamedTextColor.DARK_GRAY)).append(subCommand.description()))); KyoriUtil.sendMessage(sender, Component.text("/optimizevillagers ").color(Util.PL_COLOR) .append(Component.text(" - ").color(NamedTextColor.DARK_GRAY)) diff --git a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/DisableSubCmd.java b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/DisableSubCmd.java index da9e419..f2259ff 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/DisableSubCmd.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/DisableSubCmd.java @@ -9,30 +9,42 @@ import me.xginko.villageroptimizer.utils.KyoriUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.CommandException; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; public class DisableSubCmd extends SubCommand { @Override - public String getLabel() { + public @NotNull String label() { return "disable"; } @Override - public TextComponent getDescription() { + public @NotNull TextComponent description() { return Component.text("Disable all plugin tasks and listeners.").color(NamedTextColor.GRAY); } @Override - public TextComponent getSyntax() { + public @NotNull TextComponent syntax() { return Component.text("/villageroptimizer disable").color(Util.PL_COLOR); } @Override - public void perform(CommandSender sender, String[] args) { + public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) + throws CommandException, IllegalArgumentException + { + return Collections.emptyList(); + } + + @Override + public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) { if (!sender.hasPermission(Permissions.Commands.DISABLE.get())) { KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission); - return; + return true; } KyoriUtil.sendMessage(sender, Component.text("Disabling VillagerOptimizer...").color(NamedTextColor.RED)); @@ -41,5 +53,6 @@ public class DisableSubCmd extends SubCommand { VillagerOptimizer.getCache().cacheMap().clear(); KyoriUtil.sendMessage(sender, Component.text("Disabled all plugin listeners and tasks.").color(NamedTextColor.GREEN)); KyoriUtil.sendMessage(sender, Component.text("You can enable the plugin again using the reload command.").color(NamedTextColor.YELLOW)); + return true; } } \ No newline at end of file diff --git a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java index 266569a..110e4e0 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java @@ -8,30 +8,42 @@ import me.xginko.villageroptimizer.utils.KyoriUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.CommandException; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; public class ReloadSubCmd extends SubCommand { @Override - public String getLabel() { + public @NotNull String label() { return "reload"; } @Override - public TextComponent getDescription() { + public @NotNull TextComponent description() { return Component.text("Reload the plugin configuration.").color(NamedTextColor.GRAY); } @Override - public TextComponent getSyntax() { + public @NotNull TextComponent syntax() { return Component.text("/villageroptimizer reload").color(Util.PL_COLOR); } @Override - public void perform(CommandSender sender, String[] args) { + public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) + throws CommandException, IllegalArgumentException + { + return Collections.emptyList(); + } + + @Override + public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) { if (!sender.hasPermission(Permissions.Commands.RELOAD.get())) { KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission); - return; + return true; } KyoriUtil.sendMessage(sender, Component.text("Reloading VillagerOptimizer...").color(NamedTextColor.WHITE)); @@ -39,5 +51,6 @@ public class ReloadSubCmd extends SubCommand { VillagerOptimizer.getInstance().reloadPlugin(); KyoriUtil.sendMessage(sender, Component.text("Reload complete.").color(NamedTextColor.GREEN)); }); + return true; } } \ No newline at end of file diff --git a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java index 55c6fa9..fa4a317 100644 --- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java +++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java @@ -10,32 +10,43 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.CommandException; import org.bukkit.command.CommandSender; import org.bukkit.plugin.PluginDescriptionFile; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; public class VersionSubCmd extends SubCommand { @Override - public String getLabel() { + public @NotNull String label() { return "version"; } @Override - public TextComponent getDescription() { + public @NotNull TextComponent description() { return Component.text("Show the plugin version.").color(NamedTextColor.GRAY); } @Override - public TextComponent getSyntax() { + public @NotNull TextComponent syntax() { return Component.text("/villageroptimizer version").color(Util.PL_COLOR); } @Override - @SuppressWarnings({"deprecation", "UnstableApiUsage"}) - public void perform(CommandSender sender, String[] args) { + public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) + throws CommandException, IllegalArgumentException + { + return Collections.emptyList(); + } + + @Override + public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) { if (!sender.hasPermission(Permissions.Commands.VERSION.get())) { KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission); - return; + return true; } String name, version, website, author; @@ -68,5 +79,7 @@ public class VersionSubCmd extends SubCommand { ) .append(Component.newline()) ); + + return true; } } \ No newline at end of file diff --git a/src/main/java/me/xginko/villageroptimizer/modules/VillagerOptimizerModule.java b/src/main/java/me/xginko/villageroptimizer/modules/VillagerOptimizerModule.java index 6b4ca29..eec4db8 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/VillagerOptimizerModule.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/VillagerOptimizerModule.java @@ -3,6 +3,8 @@ package me.xginko.villageroptimizer.modules; import me.xginko.villageroptimizer.VillagerCache; import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.config.Config; +import me.xginko.villageroptimizer.utils.Disableable; +import me.xginko.villageroptimizer.utils.Enableable; import org.reflections.Reflections; import org.reflections.scanners.Scanners; import space.arim.morepaperlib.scheduling.GracefulScheduling; @@ -11,13 +13,11 @@ import java.lang.reflect.Modifier; import java.util.HashSet; import java.util.Set; -public abstract class VillagerOptimizerModule { +public abstract class VillagerOptimizerModule implements Enableable, Disableable { private static final Reflections MODULES_PACKAGE = new Reflections(VillagerOptimizerModule.class.getPackage().getName()); public static final Set ENABLED_MODULES = new HashSet<>(); - public abstract void enable(); - public abstract void disable(); public abstract boolean shouldEnable(); protected final VillagerOptimizer plugin; diff --git a/src/main/java/me/xginko/villageroptimizer/utils/Disableable.java b/src/main/java/me/xginko/villageroptimizer/utils/Disableable.java new file mode 100644 index 0000000..e2ad4a2 --- /dev/null +++ b/src/main/java/me/xginko/villageroptimizer/utils/Disableable.java @@ -0,0 +1,5 @@ +package me.xginko.villageroptimizer.utils; + +public interface Disableable { + void disable(); +} diff --git a/src/main/java/me/xginko/villageroptimizer/utils/Enableable.java b/src/main/java/me/xginko/villageroptimizer/utils/Enableable.java new file mode 100644 index 0000000..736fd4a --- /dev/null +++ b/src/main/java/me/xginko/villageroptimizer/utils/Enableable.java @@ -0,0 +1,5 @@ +package me.xginko.villageroptimizer.utils; + +public interface Enableable { + void enable(); +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6382929..4d09a77 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,24 +5,4 @@ authors: [ xGinko ] description: ${project.description} website: ${project.url} api-version: '1.16' -folia-supported: true - -commands: - villageroptimizer: - usage: /villageroptimizer [ reload, version, disable ] - description: VillagerOptimizer admin commands - aliases: - - voptimizer - - vo - optimizevillagers: - usage: /optimizevillagers - description: Optmize villagers in a radius around you - aliases: - - optvils - - noai - unoptimizevillagers: - usage: /unoptimizevillagers - description: Unoptmize villagers in a radius around you - aliases: - - unoptvils - - noaiundo \ No newline at end of file +folia-supported: true \ No newline at end of file