work out new command concept
This commit is contained in:
parent
2cd6d0576a
commit
7c56dfdb17
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
return tabCompletes;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length >= 2) {
|
||||||
|
for (SubCommand subCommand : subCommands) {
|
||||||
|
if (args[0].equalsIgnoreCase(subCommand.label())) {
|
||||||
|
return subCommand.tabComplete(sender, alias, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
|
public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) {
|
||||||
return args.length == 1 ? tabCompleter : NO_TABCOMPLETES;
|
if (args.length >= 1) {
|
||||||
|
for (SubCommand subCommand : subCommands) {
|
||||||
|
if (args[0].equalsIgnoreCase(subCommand.label())) {
|
||||||
|
return subCommand.execute(sender, commandLabel, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
overview(sender);
|
||||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
|
|
||||||
if (args.length == 0) {
|
|
||||||
sendCommandOverview(sender);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (final SubCommand subCommand : subCommands) {
|
private void overview(CommandSender sender) {
|
||||||
if (args[0].equalsIgnoreCase(subCommand.getLabel())) {
|
|
||||||
subCommand.perform(sender, args);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sendCommandOverview(sender);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendCommandOverview(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))
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
package me.xginko.villageroptimizer.utils;
|
||||||
|
|
||||||
|
public interface Disableable {
|
||||||
|
void disable();
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package me.xginko.villageroptimizer.utils;
|
||||||
|
|
||||||
|
public interface Enableable {
|
||||||
|
void enable();
|
||||||
|
}
|
@ -6,23 +6,3 @@ 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
|
|
Loading…
x
Reference in New Issue
Block a user