更改依赖加载为 onLoad 前加载

//TODO 在插件启动之前加载依赖
This commit is contained in:
Izzel_Aliz 2018-04-13 13:38:54 +08:00
parent 4e7fc42167
commit b941cac63f
5 changed files with 266 additions and 250 deletions

6
.idea/encodings.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>

View File

@ -45,22 +45,27 @@ public class TLib {
return tLib; return tLib;
} }
public static void init() { public static void injectPluginManager() {
new File(Main.getInst().getDataFolder(), "/libs").mkdirs();
tLib = new TLib();
DependencyInjector.inject(Main.getInst(), tLib);
// 注入 PluginLoader 用于加载依赖 // 注入 PluginLoader 用于加载依赖
try { try {
Field field = Bukkit.getServer().getClass().getDeclaredField("pluginManager"); Field field = Bukkit.getServer().getClass().getDeclaredField("pluginManager");
field.setAccessible(true); field.setAccessible(true);
field.set(Bukkit.getServer(), new TLibPluginManager()); field.set(Bukkit.getServer(), new TLibPluginManager());
tLib.getLogger().info("注入成功");
} catch (NoSuchFieldException | IllegalAccessException e) { } catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace(); e.printStackTrace();
tLib.getLogger().fatal("注入失败");
} }
} }
public static void init() {
new File(Main.getInst().getDataFolder(), "/libs").mkdirs();
tLib = new TLib();
DependencyInjector.inject(Main.getInst(), tLib);
if (Bukkit.getPluginManager() instanceof TLibPluginManager)
tLib.getLogger().info("注入成功");
else
tLib.getLogger().fatal("注入失败");
}
public static void unload() { public static void unload() {
tLib.getConfigWatcher().unregisterAll(); tLib.getConfigWatcher().unregisterAll();
DependencyInjector.eject(Main.getInst(), tLib); DependencyInjector.eject(Main.getInst(), tLib);

View File

@ -43,7 +43,7 @@ public class DependencyInjector {
public static void eject(Plugin plugin, Object o) { public static void eject(Plugin plugin, Object o) {
try { try {
ejectConfig(plugin, o); ejectConfig(plugin, o);
} catch (NoClassDefFoundError ignored) { } catch (Throwable ignored) {
} }
} }

View File

@ -49,7 +49,9 @@ public class TLibPluginManager implements PluginManager {
@Override @Override
public Plugin loadPlugin(File file) throws InvalidPluginException, InvalidDescriptionException, UnknownDependencyException { public Plugin loadPlugin(File file) throws InvalidPluginException, InvalidDescriptionException, UnknownDependencyException {
return instance.loadPlugin(file); Plugin plugin = instance.loadPlugin(file);
DependencyInjector.injectOnEnable(plugin);
return plugin;
} }
@Override @Override
@ -92,7 +94,6 @@ public class TLibPluginManager implements PluginManager {
@Override @Override
public void enablePlugin(Plugin plugin) { public void enablePlugin(Plugin plugin) {
DependencyInjector.injectOnEnable(plugin);
instance.enablePlugin(plugin); instance.enablePlugin(plugin);
} }

View File

@ -1,7 +1,6 @@
package me.skymc.taboolib; package me.skymc.taboolib;
import com.ilummc.tlib.TLib; import com.ilummc.tlib.TLib;
import com.ilummc.tlib.annotations.Dependency;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import me.skymc.taboolib.anvil.AnvilContainerAPI; import me.skymc.taboolib.anvil.AnvilContainerAPI;
@ -51,14 +50,29 @@ import java.util.Random;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class Main extends JavaPlugin implements Listener { public class Main extends JavaPlugin implements Listener {
@Getter public Main() {
private static Plugin inst; super();
@Getter
private static String prefix = "§8[§3§lTabooLib§8] §7"; inst = this;
@Getter disable = false;
@Setter
private static Economy Economy; TLib.injectPluginManager();
// 载入配置
saveDefaultConfig();
// 加载依赖
TLib.init();
}
@Getter
private static Plugin inst;
@Getter
private static String prefix = "§8[§3§lTabooLib§8] §7";
@Getter
@Setter
private static Economy Economy;
@Getter @Getter
private static File playerDataFolder; private static File playerDataFolder;
@Getter @Getter
@ -77,245 +91,235 @@ public class Main extends JavaPlugin implements Listener {
private static Language2 exampleLangauge2; private static Language2 exampleLangauge2;
@Getter @Getter
private static boolean started; private static boolean started;
public static Random getRandom() { public static Random getRandom() {
return NumberUtils.getRand(); return NumberUtils.getRand();
}
public static String getTablePrefix() {
return inst.getConfig().getString("MYSQL.PREFIX");
}
@Override
public void saveDefaultConfig() {
reloadConfig();
}
@Override
public void reloadConfig() {
File file = new File(getDataFolder(), "config.yml");
if (!file.exists()) {
saveResource("config.yml", true);
}
config = ConfigUtils.load(this, file);
}
@Override
public void onLoad() {
inst = this; disable = false;
// 载入配置
saveDefaultConfig();
// 加载依赖
TLib.init();
// 载入目录
setupDataFolder();
// 注册配置
DataUtils.addPluginData("TabooLibrary", null);
// 启用数据库
if (getConfig().getBoolean("MYSQL.ENABLE")) {
// 连接数据库
connection = new MySQLConnection(getConfig().getString("MYSQL.HOST"), getConfig().getString("MYSQL.USER"), getConfig().getString("MYSQL.POST"), getConfig().getString("MYSQL.PASSWORD"), getConfig().getString("MYSQL.DATABASE"), 30, this);
// 连接成功
if (connection.isConnection()) {
// 创建表
connection.createTable(getTablePrefix() + "_playerdata", "username", "configuration");
connection.createTable(getTablePrefix() + "_plugindata", "name", "variable", "upgrade");
connection.createTable(getTablePrefix() + "_serveruuid", "uuid", "hash");
// 如果没有数据
if (!connection.isExists(getTablePrefix() + "_serveruuid", "uuid", TabooLib.getServerUID())) {
connection.intoValue(getTablePrefix() + "_serveruuid", TabooLib.getServerUID(), StringUtils.hashKeyForDisk(getDataFolder().getPath()));
}
else {
String hash = connection.getValue(getTablePrefix() + "_serveruuid", "uuid", TabooLib.getServerUID(), "hash").toString();
// 如果这个值和我的值不同
if (!hash.equals(StringUtils.hashKeyForDisk(getDataFolder().getPath()))) {
MsgUtils.warn("检测到本服序列号与其他服务器相同, 已重新生成!");
// 重新生成序列号
TabooLib.resetServerUID();
// 关服
Bukkit.shutdown();
}
}
}
else {
// 提示
MsgUtils.warn("数据库连接失败, 请检查配置是否正确!");
// 关服
Bukkit.shutdown();
}
// 储存方式
storageType = StorageType.SQL;
}
else {
// 储存方式
storageType = StorageType.LOCAL;
}
} }
public static String getTablePrefix() {
return inst.getConfig().getString("MYSQL.PREFIX");
}
@Override @Override
public void onEnable() { public void saveDefaultConfig() {
// 注册指令 reloadConfig();
getCommand("taboolib").setExecutor(new MainCommands()); }
getCommand("language2").setExecutor(new Language2Command());
getCommand("taboolibrarymodule").setExecutor(new TLMCommands()); @Override
public void reloadConfig() {
// 注册监听 File file = new File(getDataFolder(), "config.yml");
registerListener(); if (!file.exists()) {
// 载入经济 saveResource("config.yml", true);
EcoUtils.setupEconomy(); }
// 载入权限 config = ConfigUtils.load(this, file);
PermissionUtils.loadRegisteredServiceProvider(); }
// 物品名称
ItemUtils.LoadLib(); @Override
// 低层工具 public void onLoad() {
DabItemUtils.getInstance(); // 载入目录
// 载入周期管理器 setupDataFolder();
TimeCycleManager.load(); // 注册配置
// 启动脚本 DataUtils.addPluginData("TabooLibrary", null);
JavaShell.javaShellSetup();
// 载入语言文件 // 启用数据库
exampleLangauge2 = new Language2("Language2", this); if (getConfig().getBoolean("MYSQL.ENABLE")) {
// 注册脚本 // 连接数据库
SkriptHandler.getInst(); connection = new MySQLConnection(getConfig().getString("MYSQL.HOST"), getConfig().getString("MYSQL.USER"), getConfig().getString("MYSQL.POST"), getConfig().getString("MYSQL.PASSWORD"), getConfig().getString("MYSQL.DATABASE"), 30, this);
// 连接成功
// 启动数据库储存方法 if (connection.isConnection()) {
if (getStorageType() == StorageType.SQL) { // 创建表
GlobalDataManager.SQLMethod.startSQLMethod(); connection.createTable(getTablePrefix() + "_playerdata", "username", "configuration");
} connection.createTable(getTablePrefix() + "_plugindata", "name", "variable", "upgrade");
connection.createTable(getTablePrefix() + "_serveruuid", "uuid", "hash");
// 载入完成
MsgUtils.send("§7插件载入完成!"); // 如果没有数据
MsgUtils.send("§7插件版本: §f" + getDescription().getVersion()); if (!connection.isExists(getTablePrefix() + "_serveruuid", "uuid", TabooLib.getServerUID())) {
MsgUtils.send("§7插件作者: §f" + getDescription().getAuthors()); connection.intoValue(getTablePrefix() + "_serveruuid", TabooLib.getServerUID(), StringUtils.hashKeyForDisk(getDataFolder().getPath()));
MsgUtils.send("§7游戏版本: §f" + TabooLib.getVerint()); } else {
String hash = connection.getValue(getTablePrefix() + "_serveruuid", "uuid", TabooLib.getServerUID(), "hash").toString();
// 文件保存 // 如果这个值和我的值不同
if (!hash.equals(StringUtils.hashKeyForDisk(getDataFolder().getPath()))) {
MsgUtils.warn("检测到本服序列号与其他服务器相同, 已重新生成!");
// 重新生成序列号
TabooLib.resetServerUID();
// 关服
Bukkit.shutdown();
}
}
} else {
// 提示
MsgUtils.warn("数据库连接失败, 请检查配置是否正确!");
// 关服
Bukkit.shutdown();
}
// 储存方式
storageType = StorageType.SQL;
} else {
// 储存方式
storageType = StorageType.LOCAL;
}
}
@Override
public void onEnable() {
// 注册指令
getCommand("taboolib").setExecutor(new MainCommands());
getCommand("language2").setExecutor(new Language2Command());
getCommand("taboolibrarymodule").setExecutor(new TLMCommands());
// 注册监听
registerListener();
// 载入经济
EcoUtils.setupEconomy();
// 载入权限
PermissionUtils.loadRegisteredServiceProvider();
// 物品名称
ItemUtils.LoadLib();
// 低层工具
DabItemUtils.getInstance();
// 载入周期管理器
TimeCycleManager.load();
// 启动脚本
JavaShell.javaShellSetup();
// 载入语言文件
exampleLangauge2 = new Language2("Language2", this);
// 注册脚本
SkriptHandler.getInst();
// 启动数据库储存方法
if (getStorageType() == StorageType.SQL) {
GlobalDataManager.SQLMethod.startSQLMethod();
}
// 载入完成
MsgUtils.send("§7插件载入完成!");
MsgUtils.send("§7插件版本: §f" + getDescription().getVersion());
MsgUtils.send("§7插件作者: §f" + getDescription().getAuthors());
MsgUtils.send("§7游戏版本: §f" + TabooLib.getVerint());
// 文件保存
Bukkit.getScheduler().runTaskTimerAsynchronously(this, DataUtils::saveAllCaches, 20, 20 * 120); Bukkit.getScheduler().runTaskTimerAsynchronously(this, DataUtils::saveAllCaches, 20, 20 * 120);
Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> PlayerDataManager.saveAllCaches(true, false), 20, 20 * 60); Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> PlayerDataManager.saveAllCaches(true, false), 20, 20 * 60);
// 插件联动
new BukkitRunnable() {
@Override
public void run() {
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
new SupportPlaceholder(getInst(), "taboolib").hook();
}
// 载入 SpecialItem 接口
SpecialItem.getInst().loadItems();
// 载入 TLM 接口
TLM.getInst();
}
}.runTask(this);
// 更新检测
new UpdateTask();
// 启动监控
new Metrics(this);
// 启动
started = true;
}
@Override
public void onDisable() {
disable = true;
// 如果插件尚未启动完成
if (!started) {
MsgUtils.send("&c插件尚未启动完成, 已跳过卸载代码");
MsgUtils.send("&c插件作者: &4坏黑");
return;
}
// 保存数据
Bukkit.getOnlinePlayers().forEach(x -> DataUtils.saveOnline(x.getName()));
// 结束线程
Bukkit.getScheduler().cancelTasks(this);
// 保存插件数据
DataUtils.saveAllCaches();
// 保存玩家数据
PlayerDataManager.saveAllPlayers(false, true);
// 结束脚本
JavaShell.javaShellCancel();
// 注销 SpecialItem 接口
SpecialItem.getInst().unloadItems();
// 注销 TLM 接口
TabooLibraryModule.getInst().unloadModules();
// 结束数据库储存方法
if (getStorageType() == StorageType.SQL) {
GlobalDataManager.SQLMethod.cancelSQLMethod();
}
// 清理数据
if (getStorageType() == StorageType.LOCAL && getConfig().getBoolean("DELETE-DATA")) {
getPlayerDataFolder().delete();
}
// 清理数据
if (getStorageType() == StorageType.SQL && getConfig().getBoolean("DELETE-VARIABLE")) {
GlobalDataManager.clearInvalidVariables();
}
// 提示信息
MsgUtils.send("&c插件已卸载, 感谢您使用&4禁忌书库");
MsgUtils.send("&c插件作者: &4坏黑");
// 清理头衔
TagUtils.delete();
// 结束连接
if (connection != null && connection.isConnection()) {
connection.closeConnection();
}
TLib.unload(); // 插件联动
new BukkitRunnable() {
// 关闭服务器
Bukkit.shutdown();
}
private void setupDataFolder() {
playerDataFolder = new File(getConfig().getString("DATAURL.PLAYER-DATA"));
if (!playerDataFolder.exists()) {
playerDataFolder.mkdirs();
}
serverDataFolder = new File(getConfig().getString("DATAURL.SERVER-DATA"));
if (!serverDataFolder.exists()) {
serverDataFolder.mkdirs();
}
}
private void registerListener() {
getServer().getPluginManager().registerEvents(this, this);
getServer().getPluginManager().registerEvents(new ListenerPlayerCommand(), this);
getServer().getPluginManager().registerEvents(new ListenerPlayerJump(), this);
getServer().getPluginManager().registerEvents(new ListenerPlayerQuit(), this);
getServer().getPluginManager().registerEvents(new ChatCatcher(), this);
getServer().getPluginManager().registerEvents(new DataUtils(), this);
getServer().getPluginManager().registerEvents(new AnvilContainerAPI(), this);
getServer().getPluginManager().registerEvents(new ListenerPluginDisable(), this);
getServer().getPluginManager().registerEvents(new PlayerDataManager(), this);
getServer().getPluginManager().registerEvents(new ItemLibraryPatch(), this);
getServer().getPluginManager().registerEvents(new SoundsLibraryPatch(), this);
@Override
if (TabooLib.getVerint() > 10700) { public void run() {
getServer().getPluginManager().registerEvents(new EntityUtils(), this); if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
getServer().getPluginManager().registerEvents(new SignUtils(), this); new SupportPlaceholder(getInst(), "taboolib").hook();
} }
// 载入 SpecialItem 接口
// 如果 YUM 插件存在 SpecialItem.getInst().loadItems();
if (Bukkit.getPluginManager().getPlugin("YUM") != null) { // 载入 TLM 接口
getServer().getPluginManager().registerEvents(new ListenerNetWork(), this); TLM.getInst();
} }
} }.runTask(this);
// 更新检测
new UpdateTask();
// 启动监控
new Metrics(this);
// 启动
started = true;
}
@Override
public void onDisable() {
disable = true;
// 如果插件尚未启动完成
if (!started) {
MsgUtils.send("&c插件尚未启动完成, 已跳过卸载代码");
MsgUtils.send("&c插件作者: &4坏黑");
return;
}
// 保存数据
Bukkit.getOnlinePlayers().forEach(x -> DataUtils.saveOnline(x.getName()));
// 结束线程
Bukkit.getScheduler().cancelTasks(this);
// 保存插件数据
DataUtils.saveAllCaches();
// 保存玩家数据
PlayerDataManager.saveAllPlayers(false, true);
// 结束脚本
JavaShell.javaShellCancel();
// 注销 SpecialItem 接口
SpecialItem.getInst().unloadItems();
// 注销 TLM 接口
TabooLibraryModule.getInst().unloadModules();
// 结束数据库储存方法
if (getStorageType() == StorageType.SQL) {
GlobalDataManager.SQLMethod.cancelSQLMethod();
}
// 清理数据
if (getStorageType() == StorageType.LOCAL && getConfig().getBoolean("DELETE-DATA")) {
getPlayerDataFolder().delete();
}
// 清理数据
if (getStorageType() == StorageType.SQL && getConfig().getBoolean("DELETE-VARIABLE")) {
GlobalDataManager.clearInvalidVariables();
}
// 提示信息
MsgUtils.send("&c插件已卸载, 感谢您使用&4禁忌书库");
MsgUtils.send("&c插件作者: &4坏黑");
// 清理头衔
TagUtils.delete();
// 结束连接
if (connection != null && connection.isConnection()) {
connection.closeConnection();
}
TLib.unload();
// 关闭服务器
Bukkit.shutdown();
}
private void setupDataFolder() {
playerDataFolder = new File(getConfig().getString("DATAURL.PLAYER-DATA"));
if (!playerDataFolder.exists()) {
playerDataFolder.mkdirs();
}
serverDataFolder = new File(getConfig().getString("DATAURL.SERVER-DATA"));
if (!serverDataFolder.exists()) {
serverDataFolder.mkdirs();
}
}
private void registerListener() {
getServer().getPluginManager().registerEvents(this, this);
getServer().getPluginManager().registerEvents(new ListenerPlayerCommand(), this);
getServer().getPluginManager().registerEvents(new ListenerPlayerJump(), this);
getServer().getPluginManager().registerEvents(new ListenerPlayerQuit(), this);
getServer().getPluginManager().registerEvents(new ChatCatcher(), this);
getServer().getPluginManager().registerEvents(new DataUtils(), this);
getServer().getPluginManager().registerEvents(new AnvilContainerAPI(), this);
getServer().getPluginManager().registerEvents(new ListenerPluginDisable(), this);
getServer().getPluginManager().registerEvents(new PlayerDataManager(), this);
getServer().getPluginManager().registerEvents(new ItemLibraryPatch(), this);
getServer().getPluginManager().registerEvents(new SoundsLibraryPatch(), this);
if (TabooLib.getVerint() > 10700) {
getServer().getPluginManager().registerEvents(new EntityUtils(), this);
getServer().getPluginManager().registerEvents(new SignUtils(), this);
}
// 如果 YUM 插件存在
if (Bukkit.getPluginManager().getPlugin("YUM") != null) {
getServer().getPluginManager().registerEvents(new ListenerNetWork(), this);
}
}
public enum StorageType { public enum StorageType {
LOCAL, SQL LOCAL, SQL
} }
} }