From 9376d7d697474b22bcac7bf6038eb4722e9dcaa8 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 12 Oct 2020 15:04:34 +0100 Subject: [PATCH] Moved Tab Completion to modular system (And optimised imports) --- .../willfp/ecoenchants/v1_16_R1/Cooldown.java | 1 - .../ecoenchants/command/AbstractCommand.java | 22 +++++-- .../command/AbstractTabCompleter.java | 31 ++++++++++ .../command/EcoEnchantsTabCompleter.java | 60 ------------------- .../command/commands/CommandEnchantinfo.java | 4 +- .../TabCompleterEnchantinfo.java | 53 ++++++++++++++++ .../ecoenchants/config/UpdatingLang.java | 1 - .../config/configs/EnchantmentConfig.java | 1 - .../ecoenchants/config/configs/Lang.java | 1 - .../ecoenchants/curse/CallingCurse.java | 2 +- .../ecoenchants/curse/DecayCurse.java | 2 +- .../ecoenchants/normal/Forcefield.java | 8 +-- .../ecoenchants/normal/Kinetic.java | 1 - .../ecoenchants/normal/Magnetic.java | 2 +- .../ecoenchants/special/Repairing.java | 2 +- .../com/willfp/ecoenchants/loader/Loader.java | 6 +- .../willfp/ecoenchants/queue/DropQueue.java | 5 +- 17 files changed, 118 insertions(+), 84 deletions(-) create mode 100644 Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractTabCompleter.java delete mode 100644 Plugin/src/main/java/com/willfp/ecoenchants/command/EcoEnchantsTabCompleter.java create mode 100644 Plugin/src/main/java/com/willfp/ecoenchants/command/tabcompleters/TabCompleterEnchantinfo.java diff --git a/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/Cooldown.java b/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/Cooldown.java index f5e021ef..bbeed521 100644 --- a/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/Cooldown.java +++ b/NMS/v1_16_R1/src/main/java/com/willfp/ecoenchants/v1_16_R1/Cooldown.java @@ -1,7 +1,6 @@ package com.willfp.ecoenchants.v1_16_R1; import com.willfp.ecoenchants.API.CooldownWrapper; -import org.bukkit.craftbukkit.libs.org.apache.commons.io.FileUtils; import org.bukkit.entity.Player; public class Cooldown implements CooldownWrapper { diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractCommand.java b/Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractCommand.java index e6a64a53..ff93bb9a 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractCommand.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractCommand.java @@ -6,7 +6,6 @@ import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; -import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; import java.util.Arrays; @@ -16,6 +15,7 @@ public abstract class AbstractCommand implements CommandExecutor, Registerable { private final String name; private final String permission; private final boolean playersOnly; + private AbstractTabCompleter tabCompleter = null; protected AbstractCommand(String name, String permission, boolean playersOnly) { this.name = name; @@ -23,6 +23,19 @@ public abstract class AbstractCommand implements CommandExecutor, Registerable { this.playersOnly = playersOnly; } + public AbstractCommand setTab(AbstractTabCompleter tabCompleter) { + this.tabCompleter = tabCompleter; + return this; + } + + public String getPermission() { + return this.permission; + } + + public String getName() { + return this.name; + } + @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if(!command.getName().equalsIgnoreCase(name)) return false; @@ -44,9 +57,10 @@ public abstract class AbstractCommand implements CommandExecutor, Registerable { @Override public final void register() { - PluginCommand pluginCommand = Bukkit.getPluginCommand(name); - pluginCommand.setExecutor(this); - pluginCommand.setTabCompleter(new EcoEnchantsTabCompleter()); + Bukkit.getPluginCommand(name).setExecutor(this); + if(tabCompleter != null) { + Bukkit.getPluginCommand(name).setTabCompleter(tabCompleter); + } } public abstract void onExecute(CommandSender sender, List args); diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractTabCompleter.java b/Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractTabCompleter.java new file mode 100644 index 00000000..a0cfc161 --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractTabCompleter.java @@ -0,0 +1,31 @@ +package com.willfp.ecoenchants.command; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.List; + +public abstract class AbstractTabCompleter implements TabCompleter { + private final AbstractCommand command; + + public AbstractTabCompleter(AbstractCommand command) { + this.command = command; + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(!command.getName().equalsIgnoreCase(this.command.getName())) + return null; + + if(!sender.hasPermission(this.command.getPermission())) + return null; + + return onTab(sender, Arrays.asList(args)); + } + + public abstract List onTab(CommandSender sender, List args); +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/command/EcoEnchantsTabCompleter.java b/Plugin/src/main/java/com/willfp/ecoenchants/command/EcoEnchantsTabCompleter.java deleted file mode 100644 index 5791defd..00000000 --- a/Plugin/src/main/java/com/willfp/ecoenchants/command/EcoEnchantsTabCompleter.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.willfp.ecoenchants.command; - -import com.willfp.ecoenchants.enchantments.EcoEnchant; -import com.willfp.ecoenchants.enchantments.EcoEnchants; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.util.StringUtil; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - - -public class EcoEnchantsTabCompleter implements TabCompleter { - private final List enchantsNames; - - public EcoEnchantsTabCompleter() { - // Fetching the list of all enchants takes longer than anything inside onTabComplete, so caching is effective - enchantsNames = EcoEnchants.getAll().stream().map(EcoEnchant::getName).collect(Collectors.toList()); - } - - private static String removePrefix(String s, String prefix) { - if (s != null && prefix != null && s.startsWith(prefix)) { - return s.substring(prefix.length()); - } - return s; - } - - @Override - public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - try { - if (command.getLabel().equalsIgnoreCase("enchantinfo") && (sender.isOp() || sender.hasPermission("ecoenchants.enchantinfo"))) { - List completions = new ArrayList<>(); - - if (args.length == 0) { - // Currently, this case is not ever reached - return enchantsNames; - } - - StringUtil.copyPartialMatches(String.join(" ", args), enchantsNames, completions); - - if (args.length > 1) { // Remove all previous words from the candidate of completions - ArrayList finishedArgs = new ArrayList<>(Arrays.asList(args)); - finishedArgs.remove(args.length - 1); - - String prefix = String.join(" ", finishedArgs); - completions = completions.stream().map(enchantName -> removePrefix(enchantName, prefix).trim()).collect(Collectors.toList()); - } - - Collections.sort(completions); - return completions; - } - } catch (Exception ignored) {} - return null; - } -} \ No newline at end of file diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEnchantinfo.java b/Plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEnchantinfo.java index c1fd0694..cad5436b 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEnchantinfo.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEnchantinfo.java @@ -36,9 +36,7 @@ public final class CommandEnchantinfo extends AbstractCommand { EcoEnchant enchantment = EcoEnchants.getByName(searchName); - boolean notFound = enchantment == null; - - if(notFound) { + if(enchantment == null) { String message = ConfigManager.getLang().getMessage("not-found").replace("%name%", searchName); sender.sendMessage(message); return; diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/command/tabcompleters/TabCompleterEnchantinfo.java b/Plugin/src/main/java/com/willfp/ecoenchants/command/tabcompleters/TabCompleterEnchantinfo.java new file mode 100644 index 00000000..df28e192 --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/command/tabcompleters/TabCompleterEnchantinfo.java @@ -0,0 +1,53 @@ +package com.willfp.ecoenchants.command.tabcompleters; + +import com.willfp.ecoenchants.command.AbstractCommand; +import com.willfp.ecoenchants.command.AbstractTabCompleter; +import com.willfp.ecoenchants.enchantments.EcoEnchant; +import com.willfp.ecoenchants.enchantments.EcoEnchants; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.util.StringUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class TabCompleterEnchantinfo extends AbstractTabCompleter { + private final List enchantsNames; + + public TabCompleterEnchantinfo() { + super((AbstractCommand) Bukkit.getPluginCommand("enchantinfo").getExecutor()); + enchantsNames = EcoEnchants.getAll().stream().map(EcoEnchant::getName).collect(Collectors.toList()); + } + + private static String removePrefix(String s, String prefix) { + if (s != null && prefix != null && s.startsWith(prefix)) { + return s.substring(prefix.length()); + } + return s; + } + + @Override + public List onTab(CommandSender sender, List args) { + List completions = new ArrayList<>(); + + if (args.size() == 0) { + // Currently, this case is not ever reached + return enchantsNames; + } + + StringUtil.copyPartialMatches(String.join(" ", args), enchantsNames, completions); + + if (args.size() > 1) { // Remove all previous words from the candidate of completions + ArrayList finishedArgs = new ArrayList<>(args); + finishedArgs.remove(args.size() - 1); + + String prefix = String.join(" ", finishedArgs); + completions = completions.stream().map(enchantName -> removePrefix(enchantName, prefix).trim()).collect(Collectors.toList()); + } + + Collections.sort(completions); + return completions; + } +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/config/UpdatingLang.java b/Plugin/src/main/java/com/willfp/ecoenchants/config/UpdatingLang.java index 5ae844e3..1f6d50c4 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/config/UpdatingLang.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/config/UpdatingLang.java @@ -1,7 +1,6 @@ package com.willfp.ecoenchants.config; import com.willfp.ecoenchants.EcoEnchantsPlugin; -import org.bukkit.Bukkit; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/EnchantmentConfig.java b/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/EnchantmentConfig.java index db95fa0a..cce54dd2 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/EnchantmentConfig.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/EnchantmentConfig.java @@ -7,7 +7,6 @@ import com.willfp.ecoenchants.enchantments.EcoEnchants; import com.willfp.ecoenchants.enchantments.meta.EnchantmentRarity; import com.willfp.ecoenchants.enchantments.meta.EnchantmentTarget; import com.willfp.ecoenchants.util.Logger; -import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/Lang.java b/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/Lang.java index aa03fa13..2bfb7609 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/Lang.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/config/configs/Lang.java @@ -1,7 +1,6 @@ package com.willfp.ecoenchants.config.configs; import com.willfp.ecoenchants.config.UpdatingLang; -import com.willfp.ecoenchants.config.YamlConfig; import org.bukkit.ChatColor; import java.util.List; diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/CallingCurse.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/CallingCurse.java index 75f9653d..1e578be4 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/CallingCurse.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/CallingCurse.java @@ -6,8 +6,8 @@ import com.willfp.ecoenchants.enchantments.EcoEnchantBuilder; import com.willfp.ecoenchants.enchantments.EcoEnchants; import com.willfp.ecoenchants.enchantments.util.EnchantChecks; import com.willfp.ecoenchants.events.armorequip.ArmorEquipEvent; -import com.willfp.ecoenchants.util.interfaces.EcoRunnable; import com.willfp.ecoenchants.util.VectorUtils; +import com.willfp.ecoenchants.util.interfaces.EcoRunnable; import org.bukkit.entity.Entity; import org.bukkit.entity.Monster; import org.bukkit.entity.PigZombie; diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/DecayCurse.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/DecayCurse.java index 8c251b46..46516054 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/DecayCurse.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/curse/DecayCurse.java @@ -5,8 +5,8 @@ import com.willfp.ecoenchants.enchantments.EcoEnchant; import com.willfp.ecoenchants.enchantments.EcoEnchantBuilder; import com.willfp.ecoenchants.enchantments.EcoEnchants; import com.willfp.ecoenchants.enchantments.util.EnchantChecks; -import com.willfp.ecoenchants.util.interfaces.EcoRunnable; import com.willfp.ecoenchants.util.ItemDurability; +import com.willfp.ecoenchants.util.interfaces.EcoRunnable; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Repairable; diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Forcefield.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Forcefield.java index cb73dc7d..d9d445c7 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Forcefield.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Forcefield.java @@ -6,14 +6,14 @@ import com.willfp.ecoenchants.enchantments.EcoEnchantBuilder; import com.willfp.ecoenchants.enchantments.EcoEnchants; import com.willfp.ecoenchants.enchantments.util.EnchantChecks; import com.willfp.ecoenchants.events.armorequip.ArmorEquipEvent; -import com.willfp.ecoenchants.util.VectorUtils; -import com.willfp.ecoenchants.util.interfaces.EcoRunnable; import com.willfp.ecoenchants.util.NumberUtils; -import org.bukkit.entity.*; +import com.willfp.ecoenchants.util.interfaces.EcoRunnable; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Monster; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.util.Vector; import java.util.HashMap; diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Kinetic.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Kinetic.java index e726110c..8bda4ce9 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Kinetic.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Kinetic.java @@ -3,7 +3,6 @@ package com.willfp.ecoenchants.enchantments.ecoenchants.normal; import com.willfp.ecoenchants.enchantments.EcoEnchant; import com.willfp.ecoenchants.enchantments.EcoEnchantBuilder; import com.willfp.ecoenchants.enchantments.EcoEnchants; -import com.willfp.ecoenchants.util.Logger; import org.bukkit.entity.LivingEntity; import org.bukkit.event.entity.EntityDamageEvent; public final class Kinetic extends EcoEnchant { diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Magnetic.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Magnetic.java index fc4058a8..979d1ef3 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Magnetic.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Magnetic.java @@ -6,8 +6,8 @@ import com.willfp.ecoenchants.enchantments.EcoEnchantBuilder; import com.willfp.ecoenchants.enchantments.EcoEnchants; import com.willfp.ecoenchants.enchantments.util.EnchantChecks; import com.willfp.ecoenchants.events.armorequip.ArmorEquipEvent; -import com.willfp.ecoenchants.util.interfaces.EcoRunnable; import com.willfp.ecoenchants.util.VectorUtils; +import com.willfp.ecoenchants.util.interfaces.EcoRunnable; import org.bukkit.entity.Entity; import org.bukkit.entity.ExperienceOrb; import org.bukkit.entity.Item; diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Repairing.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Repairing.java index 39737699..c54b20e5 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Repairing.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/special/Repairing.java @@ -5,8 +5,8 @@ import com.willfp.ecoenchants.enchantments.EcoEnchant; import com.willfp.ecoenchants.enchantments.EcoEnchantBuilder; import com.willfp.ecoenchants.enchantments.EcoEnchants; import com.willfp.ecoenchants.enchantments.util.EnchantChecks; -import com.willfp.ecoenchants.util.interfaces.EcoRunnable; import com.willfp.ecoenchants.util.ItemDurability; +import com.willfp.ecoenchants.util.interfaces.EcoRunnable; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Repairable; diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java index cd15a967..f31933fd 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java @@ -5,7 +5,7 @@ import com.willfp.ecoenchants.EcoEnchantsPlugin; import com.willfp.ecoenchants.command.commands.CommandEcodebug; import com.willfp.ecoenchants.command.commands.CommandEcoreload; import com.willfp.ecoenchants.command.commands.CommandEnchantinfo; -import com.willfp.ecoenchants.command.EcoEnchantsTabCompleter; +import com.willfp.ecoenchants.command.tabcompleters.TabCompleterEnchantinfo; import com.willfp.ecoenchants.config.ConfigManager; import com.willfp.ecoenchants.display.EnchantDisplay; import com.willfp.ecoenchants.display.packets.PacketOpenWindowMerchant; @@ -41,9 +41,9 @@ import com.willfp.ecoenchants.listeners.PlayerJoinListener; import com.willfp.ecoenchants.nms.BlockBreak; import com.willfp.ecoenchants.nms.Cooldown; import com.willfp.ecoenchants.nms.TridentStack; -import com.willfp.ecoenchants.util.interfaces.EcoRunnable; import com.willfp.ecoenchants.util.Logger; import com.willfp.ecoenchants.util.UpdateChecker; +import com.willfp.ecoenchants.util.interfaces.EcoRunnable; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; @@ -283,7 +283,7 @@ public class Loader { Logger.info("Loading Commands..."); new CommandEcoreload().register(); new CommandEcodebug().register(); - new CommandEnchantinfo().register(); + new CommandEnchantinfo().setTab(new TabCompleterEnchantinfo()).register(); Logger.info(""); /* diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/queue/DropQueue.java b/Plugin/src/main/java/com/willfp/ecoenchants/queue/DropQueue.java index 2b291ad2..3736f7ec 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/queue/DropQueue.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/queue/DropQueue.java @@ -11,7 +11,10 @@ import org.bukkit.event.player.PlayerExpChangeEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; /** * All drops generated from enchantments should be sent through a {@link DropQueue}