package com.mengcraft.protect;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.server.PluginEnableEvent;
import org.bukkit.plugin.Plugin;
public class PluginKiller {
private final static PluginKiller KILLER = new PluginKiller();
private final Events events = new Events();
private final List<String> names = new ArrayList<>();
private final List<Plugin> markedPlugins = new ArrayList<>();
private PluginKiller(){
}
public static PluginKiller getKiller() {
return KILLER;
}
public Events getEvents() {
return events;
}
public void addName(String name) {
getNames().add(name);
}
public void runPluginKiller() {
for (String name : this.getNames()) {
Plugin plugin = Bukkit.getPluginManager().getPlugin(name);
if (plugin != null && plugin.isEnabled()) {
this.markedPlugins.add(plugin);
Bukkit.getPluginManager().disablePlugin(plugin);
}
if (plugin != null) {
this.markedPlugins.add(plugin);
Bukkit.getLogger().warning("已禁用功能重复的[" + plugin.getName() + "]插件");
}
}
unloadPlugins();
}
private List<String> getNames() {
return names;
}
private void unloadPlugins() {
List<Plugin> plugins = new ArrayList<>(Arrays.asList(Bukkit.getPluginManager().getPlugins()));
plugins.removeAll(this.markedPlugins);
Map<String, Plugin> lookupNames = new HashMap<>();
for (Plugin plugin : plugins) {
lookupNames.put(plugin.getName(), plugin);
}
try {
Field pluginsField = Bukkit.getPluginManager().getClass().getDeclaredField("plugins");
Field lookupNamesField = Bukkit.getPluginManager().getClass().getDeclaredField("lookupNames");
pluginsField.setAccessible(true);
lookupNamesField.setAccessible(true);
pluginsField.set(Bukkit.getPluginManager(), plugins);
lookupNamesField.set(Bukkit.getPluginManager(), lookupNames);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
private class Events implements Listener {
@EventHandler
public void onPluginEnable(PluginEnableEvent event) {
if (PluginKiller.getKiller().getNames().contains(event.getPlugin().getName())) {
event.getPlugin().getPluginLoader().disablePlugin(event.getPlugin());
}
}
}
}