work out new command concept

This commit is contained in:
xGinko 2024-07-09 02:13:49 +02:00
parent 2cd6d0576a
commit 7c56dfdb17
13 changed files with 235 additions and 114 deletions

View File

@ -19,6 +19,7 @@ import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import space.arim.morepaperlib.MorePaperLib; import space.arim.morepaperlib.MorePaperLib;
import space.arim.morepaperlib.commands.CommandRegistration;
import space.arim.morepaperlib.scheduling.GracefulScheduling; import space.arim.morepaperlib.scheduling.GracefulScheduling;
import java.io.File; import java.io.File;
@ -41,6 +42,7 @@ public final class VillagerOptimizer extends JavaPlugin {
private static VillagerOptimizer instance; private static VillagerOptimizer instance;
private static VillagerCache villagerCache; private static VillagerCache villagerCache;
private static CommandRegistration commandRegistration;
private static GracefulScheduling scheduling; private static GracefulScheduling scheduling;
private static Map<String, LanguageCache> languageCacheMap; private static Map<String, LanguageCache> languageCacheMap;
private static Config config; private static Config config;
@ -58,7 +60,9 @@ public final class VillagerOptimizer extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
instance = this; instance = this;
scheduling = new MorePaperLib(this).scheduling(); MorePaperLib morePaperLib = new MorePaperLib(this);
commandRegistration = morePaperLib.commandRegistration();
scheduling = morePaperLib.scheduling();
audiences = BukkitAudiences.create(this); audiences = BukkitAudiences.create(this);
logger = ComponentLogger.logger(getLogger().getName()); logger = ComponentLogger.logger(getLogger().getName());
bStats = new Metrics(this, 19954); bStats = new Metrics(this, 19954);
@ -144,6 +148,9 @@ public final class VillagerOptimizer extends JavaPlugin {
public static @NotNull VillagerCache getCache() { public static @NotNull VillagerCache getCache() {
return villagerCache; return villagerCache;
} }
public static @NotNull CommandRegistration commandRegistration() {
return commandRegistration;
}
public static @NotNull GracefulScheduling scheduling() { public static @NotNull GracefulScheduling scheduling() {
return scheduling; return scheduling;
} }

View File

@ -1,11 +1,19 @@
package me.xginko.villageroptimizer.commands; package me.xginko.villageroptimizer.commands;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public abstract class SubCommand { public abstract class SubCommand {
public abstract String getLabel();
public abstract TextComponent getDescription(); public abstract @NotNull String label();
public abstract TextComponent getSyntax(); public abstract @NotNull TextComponent description();
public abstract void perform(CommandSender sender, String[] args); public abstract @NotNull TextComponent syntax();
public abstract @NotNull List<String> 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);
} }

View File

@ -1,37 +1,94 @@
package me.xginko.villageroptimizer.commands; package me.xginko.villageroptimizer.commands;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.commands.optimizevillagers.OptVillagersRadius; import me.xginko.villageroptimizer.utils.Disableable;
import me.xginko.villageroptimizer.commands.unoptimizevillagers.UnOptVillagersRadius; import me.xginko.villageroptimizer.utils.Enableable;
import me.xginko.villageroptimizer.commands.villageroptimizer.VillagerOptimizerCmd; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; 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.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.Arrays;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; 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<VillagerOptimizerCommand> COMMANDS = new HashSet<>();
public static final List<String> RADIUS_SUGGESTIONS = Arrays.asList("5", "10", "25", "50");
public static final Reflections COMMANDS_PACKAGE = new Reflections(VillagerOptimizerCommand.class.getPackage().getName());
List<String> NO_TABCOMPLETES = Collections.emptyList(); protected VillagerOptimizerCommand(
List<String> RADIUS_TABCOMPLETES = Arrays.asList("5", "10", "25", "50"); @NotNull String name, @NotNull String description, @NotNull String usageMessage, @NotNull List<String> aliases
) {
super(name, description, usageMessage, aliases);
}
HashSet<VillagerOptimizerCommand> 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<String> 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(); VillagerOptimizer plugin = VillagerOptimizer.getInstance();
CommandMap commandMap = plugin.getServer().getCommandMap(); VillagerOptimizer.commandRegistration().getServerCommandMap()
commands.forEach(command -> plugin.getCommand(command.label()).unregister(commandMap)); .register(plugin.getDescription().getName().toLowerCase(), this);
commands.clear(); plugin.getCommand(getName()).setExecutor(this);
plugin.getCommand(getName()).setTabCompleter(this);
}
commands.add(new VillagerOptimizerCmd()); @Override
commands.add(new OptVillagersRadius()); @SuppressWarnings("DataFlowIssue")
commands.add(new UnOptVillagersRadius()); public void disable() {
VillagerOptimizer.getInstance().getCommand(getName())
commands.forEach(command -> plugin.getCommand(command.label()).setExecutor(command)); .unregister(VillagerOptimizer.commandRegistration().getServerCommandMap());
} }
} }

View File

@ -2,34 +2,41 @@ package me.xginko.villageroptimizer.commands.optimizevillagers;
import me.xginko.villageroptimizer.VillagerCache; import me.xginko.villageroptimizer.VillagerCache;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand; import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand;
import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.config.Config;
import me.xginko.villageroptimizer.enums.OptimizationType; import me.xginko.villageroptimizer.enums.OptimizationType;
import me.xginko.villageroptimizer.enums.Permissions; import me.xginko.villageroptimizer.enums.Permissions;
import me.xginko.villageroptimizer.events.VillagerOptimizeEvent; import me.xginko.villageroptimizer.events.VillagerOptimizeEvent;
import me.xginko.villageroptimizer.utils.KyoriUtil; import me.xginko.villageroptimizer.utils.KyoriUtil;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextReplacementConfig; import net.kyori.adventure.text.TextReplacementConfig;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration; 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.command.CommandSender;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
public class OptVillagersRadius implements VillagerOptimizerCommand { public class OptVillagersRadius extends VillagerOptimizerCommand {
private final long cooldown; private final long cooldown;
private final int max_radius; private final int max_radius;
public OptVillagersRadius() { public OptVillagersRadius() {
super(
"optimizevillagers",
"Optmize villagers in a radius around you",
"/unoptimizevillagers <blockradius>",
Arrays.asList("optvils", "noai")
);
Config config = VillagerOptimizer.config(); Config config = VillagerOptimizer.config();
this.max_radius = config.getInt("optimization-methods.commands.optimizevillagers.max-block-radius", 100); this.max_radius = config.getInt("optimization-methods.commands.optimizevillagers.max-block-radius", 100);
this.cooldown = config.getInt("optimization-methods.commands.optimizevillagers.cooldown-seconds", 600, this.cooldown = config.getInt("optimization-methods.commands.optimizevillagers.cooldown-seconds", 600,
@ -38,17 +45,14 @@ public class OptVillagersRadius implements VillagerOptimizerCommand {
} }
@Override @Override
public String label() { public @NotNull List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args)
return "optimizevillagers"; throws CommandException, IllegalArgumentException
{
return args.length == 1 ? RADIUS_SUGGESTIONS : Collections.emptyList();
} }
@Override @Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @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) {
if (!sender.hasPermission(Permissions.Commands.OPTIMIZE_RADIUS.get())) { if (!sender.hasPermission(Permissions.Commands.OPTIMIZE_RADIUS.get())) {
KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission); KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission);
return true; return true;

View File

@ -2,48 +2,52 @@ package me.xginko.villageroptimizer.commands.unoptimizevillagers;
import me.xginko.villageroptimizer.VillagerCache; import me.xginko.villageroptimizer.VillagerCache;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand; import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand;
import me.xginko.villageroptimizer.enums.OptimizationType; import me.xginko.villageroptimizer.enums.OptimizationType;
import me.xginko.villageroptimizer.enums.Permissions; import me.xginko.villageroptimizer.enums.Permissions;
import me.xginko.villageroptimizer.events.VillagerUnoptimizeEvent; import me.xginko.villageroptimizer.events.VillagerUnoptimizeEvent;
import me.xginko.villageroptimizer.utils.KyoriUtil; import me.xginko.villageroptimizer.utils.KyoriUtil;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextReplacementConfig; import net.kyori.adventure.text.TextReplacementConfig;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration; 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.command.CommandSender;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Villager; import org.bukkit.entity.Villager;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
public class UnOptVillagersRadius implements VillagerOptimizerCommand { public class UnOptVillagersRadius extends VillagerOptimizerCommand {
private final int max_radius; private final int max_radius;
public UnOptVillagersRadius() { public UnOptVillagersRadius() {
super(
"unoptimizevillagers",
"Unoptmize villagers in a radius around you",
"/optimizevillagers <blockradius>",
Arrays.asList("unoptvils", "noaiundo")
);
this.max_radius = VillagerOptimizer.config() this.max_radius = VillagerOptimizer.config()
.getInt("optimization-methods.commands.unoptimizevillagers.max-block-radius", 100); .getInt("optimization-methods.commands.unoptimizevillagers.max-block-radius", 100);
} }
@Override @Override
public String label() { public @NotNull List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args)
return "unoptimizevillagers"; throws CommandException, IllegalArgumentException
{
return args.length == 1 ? RADIUS_SUGGESTIONS : Collections.emptyList();
} }
@Override @Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @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) {
if (!sender.hasPermission(Permissions.Commands.UNOPTIMIZE_RADIUS.get())) { if (!sender.hasPermission(Permissions.Commands.UNOPTIMIZE_RADIUS.get())) {
KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission); KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission);
return true; return true;

View File

@ -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.ReloadSubCmd;
import me.xginko.villageroptimizer.commands.villageroptimizer.subcommands.VersionSubCmd; import me.xginko.villageroptimizer.commands.villageroptimizer.subcommands.VersionSubCmd;
import me.xginko.villageroptimizer.enums.Permissions; import me.xginko.villageroptimizer.enums.Permissions;
import me.xginko.villageroptimizer.utils.Util;
import me.xginko.villageroptimizer.utils.KyoriUtil; import me.xginko.villageroptimizer.utils.KyoriUtil;
import me.xginko.villageroptimizer.utils.Util;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.Command; import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class VillagerOptimizerCmd implements VillagerOptimizerCommand { public class VillagerOptimizerCmd extends VillagerOptimizerCommand {
private final List<SubCommand> subCommands; private final List<SubCommand> subCommands;
private final List<String> tabCompleter; private final List<String> tabCompletes;
public VillagerOptimizerCmd() { public VillagerOptimizerCmd() {
super(
"villageroptimizer",
"VillagerOptimizer admin commands",
"/villageroptimizer [ reload, version, disable ]",
Arrays.asList("voptimizer", "vo")
);
subCommands = Arrays.asList(new ReloadSubCmd(), new VersionSubCmd(), new DisableSubCmd()); 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 @Override
public String label() { public @NotNull List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args)
return "villageroptimizer"; throws CommandException, IllegalArgumentException
} {
if (args.length == 1) {
@Override return tabCompletes;
public List<String> 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;
} }
for (final SubCommand subCommand : subCommands) { if (args.length >= 2) {
if (args[0].equalsIgnoreCase(subCommand.getLabel())) { for (SubCommand subCommand : subCommands) {
subCommand.perform(sender, args); if (args[0].equalsIgnoreCase(subCommand.label())) {
return true; 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; 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; 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("-----------------------------------------------------").color(NamedTextColor.GRAY));
KyoriUtil.sendMessage(sender, Component.text("VillagerOptimizer Commands").color(Util.PL_COLOR)); KyoriUtil.sendMessage(sender, Component.text("VillagerOptimizer Commands").color(Util.PL_COLOR));
KyoriUtil.sendMessage(sender, Component.text("-----------------------------------------------------").color(NamedTextColor.GRAY)); KyoriUtil.sendMessage(sender, Component.text("-----------------------------------------------------").color(NamedTextColor.GRAY));
subCommands.forEach(subCommand -> KyoriUtil.sendMessage(sender, 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, KyoriUtil.sendMessage(sender,
Component.text("/optimizevillagers <blockradius>").color(Util.PL_COLOR) Component.text("/optimizevillagers <blockradius>").color(Util.PL_COLOR)
.append(Component.text(" - ").color(NamedTextColor.DARK_GRAY)) .append(Component.text(" - ").color(NamedTextColor.DARK_GRAY))

View File

@ -9,30 +9,42 @@ import me.xginko.villageroptimizer.utils.KyoriUtil;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
public class DisableSubCmd extends SubCommand { public class DisableSubCmd extends SubCommand {
@Override @Override
public String getLabel() { public @NotNull String label() {
return "disable"; return "disable";
} }
@Override @Override
public TextComponent getDescription() { public @NotNull TextComponent description() {
return Component.text("Disable all plugin tasks and listeners.").color(NamedTextColor.GRAY); return Component.text("Disable all plugin tasks and listeners.").color(NamedTextColor.GRAY);
} }
@Override @Override
public TextComponent getSyntax() { public @NotNull TextComponent syntax() {
return Component.text("/villageroptimizer disable").color(Util.PL_COLOR); return Component.text("/villageroptimizer disable").color(Util.PL_COLOR);
} }
@Override @Override
public void perform(CommandSender sender, String[] args) { public @NotNull List<String> 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())) { if (!sender.hasPermission(Permissions.Commands.DISABLE.get())) {
KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission); KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission);
return; return true;
} }
KyoriUtil.sendMessage(sender, Component.text("Disabling VillagerOptimizer...").color(NamedTextColor.RED)); KyoriUtil.sendMessage(sender, Component.text("Disabling VillagerOptimizer...").color(NamedTextColor.RED));
@ -41,5 +53,6 @@ public class DisableSubCmd extends SubCommand {
VillagerOptimizer.getCache().cacheMap().clear(); VillagerOptimizer.getCache().cacheMap().clear();
KyoriUtil.sendMessage(sender, Component.text("Disabled all plugin listeners and tasks.").color(NamedTextColor.GREEN)); 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)); KyoriUtil.sendMessage(sender, Component.text("You can enable the plugin again using the reload command.").color(NamedTextColor.YELLOW));
return true;
} }
} }

View File

@ -8,30 +8,42 @@ import me.xginko.villageroptimizer.utils.KyoriUtil;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
public class ReloadSubCmd extends SubCommand { public class ReloadSubCmd extends SubCommand {
@Override @Override
public String getLabel() { public @NotNull String label() {
return "reload"; return "reload";
} }
@Override @Override
public TextComponent getDescription() { public @NotNull TextComponent description() {
return Component.text("Reload the plugin configuration.").color(NamedTextColor.GRAY); return Component.text("Reload the plugin configuration.").color(NamedTextColor.GRAY);
} }
@Override @Override
public TextComponent getSyntax() { public @NotNull TextComponent syntax() {
return Component.text("/villageroptimizer reload").color(Util.PL_COLOR); return Component.text("/villageroptimizer reload").color(Util.PL_COLOR);
} }
@Override @Override
public void perform(CommandSender sender, String[] args) { public @NotNull List<String> 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())) { if (!sender.hasPermission(Permissions.Commands.RELOAD.get())) {
KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission); KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission);
return; return true;
} }
KyoriUtil.sendMessage(sender, Component.text("Reloading VillagerOptimizer...").color(NamedTextColor.WHITE)); KyoriUtil.sendMessage(sender, Component.text("Reloading VillagerOptimizer...").color(NamedTextColor.WHITE));
@ -39,5 +51,6 @@ public class ReloadSubCmd extends SubCommand {
VillagerOptimizer.getInstance().reloadPlugin(); VillagerOptimizer.getInstance().reloadPlugin();
KyoriUtil.sendMessage(sender, Component.text("Reload complete.").color(NamedTextColor.GREEN)); KyoriUtil.sendMessage(sender, Component.text("Reload complete.").color(NamedTextColor.GREEN));
}); });
return true;
} }
} }

View File

@ -10,32 +10,43 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginDescriptionFile;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
public class VersionSubCmd extends SubCommand { public class VersionSubCmd extends SubCommand {
@Override @Override
public String getLabel() { public @NotNull String label() {
return "version"; return "version";
} }
@Override @Override
public TextComponent getDescription() { public @NotNull TextComponent description() {
return Component.text("Show the plugin version.").color(NamedTextColor.GRAY); return Component.text("Show the plugin version.").color(NamedTextColor.GRAY);
} }
@Override @Override
public TextComponent getSyntax() { public @NotNull TextComponent syntax() {
return Component.text("/villageroptimizer version").color(Util.PL_COLOR); return Component.text("/villageroptimizer version").color(Util.PL_COLOR);
} }
@Override @Override
@SuppressWarnings({"deprecation", "UnstableApiUsage"}) public @NotNull List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args)
public void perform(CommandSender sender, 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())) { if (!sender.hasPermission(Permissions.Commands.VERSION.get())) {
KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission); KyoriUtil.sendMessage(sender, VillagerOptimizer.getLang(sender).no_permission);
return; return true;
} }
String name, version, website, author; String name, version, website, author;
@ -68,5 +79,7 @@ public class VersionSubCmd extends SubCommand {
) )
.append(Component.newline()) .append(Component.newline())
); );
return true;
} }
} }

View File

@ -3,6 +3,8 @@ package me.xginko.villageroptimizer.modules;
import me.xginko.villageroptimizer.VillagerCache; import me.xginko.villageroptimizer.VillagerCache;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.config.Config; 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.Reflections;
import org.reflections.scanners.Scanners; import org.reflections.scanners.Scanners;
import space.arim.morepaperlib.scheduling.GracefulScheduling; import space.arim.morepaperlib.scheduling.GracefulScheduling;
@ -11,13 +13,11 @@ import java.lang.reflect.Modifier;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; 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()); private static final Reflections MODULES_PACKAGE = new Reflections(VillagerOptimizerModule.class.getPackage().getName());
public static final Set<VillagerOptimizerModule> ENABLED_MODULES = new HashSet<>(); public static final Set<VillagerOptimizerModule> ENABLED_MODULES = new HashSet<>();
public abstract void enable();
public abstract void disable();
public abstract boolean shouldEnable(); public abstract boolean shouldEnable();
protected final VillagerOptimizer plugin; protected final VillagerOptimizer plugin;

View File

@ -0,0 +1,5 @@
package me.xginko.villageroptimizer.utils;
public interface Disableable {
void disable();
}

View File

@ -0,0 +1,5 @@
package me.xginko.villageroptimizer.utils;
public interface Enableable {
void enable();
}

View File

@ -5,24 +5,4 @@ authors: [ xGinko ]
description: ${project.description} description: ${project.description}
website: ${project.url} website: ${project.url}
api-version: '1.16' api-version: '1.16'
folia-supported: true folia-supported: true
commands:
villageroptimizer:
usage: /villageroptimizer [ reload, version, disable ]
description: VillagerOptimizer admin commands
aliases:
- voptimizer
- vo
optimizevillagers:
usage: /optimizevillagers <blockradius>
description: Optmize villagers in a radius around you
aliases:
- optvils
- noai
unoptimizevillagers:
usage: /unoptimizevillagers <blockradius>
description: Unoptmize villagers in a radius around you
aliases:
- unoptvils
- noaiundo