From d867a3ecd67b02fa126bef3bdb2f691b64ce6f9e Mon Sep 17 00:00:00 2001 From: funkemunky Date: Thu, 17 Jun 2021 12:35:51 -0400 Subject: [PATCH] Implementing Bukkit shutdown cleanup so reloads work --- .../brighten/antivpn/bukkit/BukkitPlugin.java | 49 +++++++++++++++---- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java index 9ec3235..5da498d 100644 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java @@ -2,28 +2,38 @@ package dev.brighten.antivpn.bukkit; import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.command.Command; +import lombok.val; import net.md_5.bungee.api.ChatColor; +import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.command.SimpleCommandMap; +import org.bukkit.event.HandlerList; import org.bukkit.plugin.SimplePluginManager; import org.bukkit.plugin.java.JavaPlugin; import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; +import java.util.Map; public class BukkitPlugin extends JavaPlugin { public static BukkitPlugin pluginInstance; private SimpleCommandMap commandMap; + private List registeredCommands = new ArrayList<>(); public void onEnable() { pluginInstance = this; //Loading config + System.out.println("Loading config..."); saveDefaultConfig(); + System.out.println("Starting AntiVPN services..."); AntiVPN.start(new BukkitConfig(), new BukkitListener(), new BukkitPlayerExecutor()); + System.out.println("Setting up and registering commands..."); if (pluginInstance.getServer().getPluginManager() instanceof SimplePluginManager) { SimplePluginManager manager = (SimplePluginManager) pluginInstance.getServer().getPluginManager(); try { @@ -36,27 +46,48 @@ public class BukkitPlugin extends JavaPlugin { } for (Command command : AntiVPN.getInstance().getCommands()) { - commandMap.register("antivpn", new org.bukkit.command.Command(command.name(), + val newCommand = new org.bukkit.command.Command(command.name(), command.description(), command.usage(), Arrays.asList(command.aliases())) { @Override public boolean execute(CommandSender sender, String s, String[] args) { - if(!sender.hasPermission("antivpn.command.*") - && !sender.hasPermission(command.permission())) { - sender.sendMessage(ChatColor.RED + "No permission."); - return true; - } + if(!sender.hasPermission("antivpn.command.*") + && !sender.hasPermission(command.permission())) { + sender.sendMessage(ChatColor.RED + "No permission."); + return true; + } - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', - command.execute(new BukkitCommandExecutor(sender), args))); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', + command.execute(new BukkitCommandExecutor(sender), args))); return true; } - }); + }; + + registeredCommands.add(newCommand); + commandMap.register("antivpn", newCommand); } } @Override public void onDisable() { + System.out.println("Stopping plugin services..."); AntiVPN.getInstance().stop(); + + System.out.println("Unregistering commands..."); + try { + Map knownCommands = (Map) + SimpleCommandMap.class.getField("knownCommands").get(commandMap); + + knownCommands.values().removeAll(registeredCommands); + registeredCommands.clear(); + } catch (IllegalAccessException | NoSuchFieldException e) { + e.printStackTrace(); + } + + System.out.println("Unregistering listeners..."); + HandlerList.unregisterAll(this); + + System.out.println("Cancelling any running tasks..."); + Bukkit.getScheduler().cancelTasks(this); } }