更改依赖加载为 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;
@ -52,13 +51,28 @@ 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
@ -79,243 +93,233 @@ public class Main extends JavaPlugin implements Listener {
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() { public static String getTablePrefix() {
return inst.getConfig().getString("MYSQL.PREFIX"); 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;
}
} }
@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
registerListener(); public void reloadConfig() {
// 载入经济 File file = new File(getDataFolder(), "config.yml");
EcoUtils.setupEconomy(); if (!file.exists()) {
// 载入权限 saveResource("config.yml", true);
PermissionUtils.loadRegisteredServiceProvider(); }
// 物品名称 config = ConfigUtils.load(this, file);
ItemUtils.LoadLib(); }
// 低层工具
DabItemUtils.getInstance();
// 载入周期管理器
TimeCycleManager.load();
// 启动脚本
JavaShell.javaShellSetup();
// 载入语言文件
exampleLangauge2 = new Language2("Language2", this);
// 注册脚本
SkriptHandler.getInst();
// 启动数据库储存方法 @Override
if (getStorageType() == StorageType.SQL) { public void onLoad() {
GlobalDataManager.SQLMethod.startSQLMethod(); // 载入目录
} setupDataFolder();
// 注册配置
DataUtils.addPluginData("TabooLibrary", null);
// 载入完成 // 启用数据库
MsgUtils.send("§7插件载入完成!"); if (getConfig().getBoolean("MYSQL.ENABLE")) {
MsgUtils.send("§7插件版本: §f" + getDescription().getVersion()); // 连接数据库
MsgUtils.send("§7插件作者: §f" + getDescription().getAuthors()); 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);
MsgUtils.send("§7游戏版本: §f" + TabooLib.getVerint()); // 连接成功
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;
}
}
@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() { new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
new SupportPlaceholder(getInst(), "taboolib").hook(); new SupportPlaceholder(getInst(), "taboolib").hook();
} }
// 载入 SpecialItem 接口 // 载入 SpecialItem 接口
SpecialItem.getInst().loadItems(); SpecialItem.getInst().loadItems();
// 载入 TLM 接口 // 载入 TLM 接口
TLM.getInst(); TLM.getInst();
} }
}.runTask(this); }.runTask(this);
// 更新检测 // 更新检测
new UpdateTask(); new UpdateTask();
// 启动监控 // 启动监控
new Metrics(this); new Metrics(this);
// 启动 // 启动
started = true; started = true;
} }
@Override @Override
public void onDisable() { public void onDisable() {
disable = true; disable = true;
// 如果插件尚未启动完成 // 如果插件尚未启动完成
if (!started) { if (!started) {
MsgUtils.send("&c插件尚未启动完成, 已跳过卸载代码"); MsgUtils.send("&c插件尚未启动完成, 已跳过卸载代码");
MsgUtils.send("&c插件作者: &4坏黑"); MsgUtils.send("&c插件作者: &4坏黑");
return; return;
} }
// 保存数据 // 保存数据
Bukkit.getOnlinePlayers().forEach(x -> DataUtils.saveOnline(x.getName())); Bukkit.getOnlinePlayers().forEach(x -> DataUtils.saveOnline(x.getName()));
// 结束线程 // 结束线程
Bukkit.getScheduler().cancelTasks(this); Bukkit.getScheduler().cancelTasks(this);
// 保存插件数据 // 保存插件数据
DataUtils.saveAllCaches(); DataUtils.saveAllCaches();
// 保存玩家数据 // 保存玩家数据
PlayerDataManager.saveAllPlayers(false, true); PlayerDataManager.saveAllPlayers(false, true);
// 结束脚本 // 结束脚本
JavaShell.javaShellCancel(); JavaShell.javaShellCancel();
// 注销 SpecialItem 接口 // 注销 SpecialItem 接口
SpecialItem.getInst().unloadItems(); SpecialItem.getInst().unloadItems();
// 注销 TLM 接口 // 注销 TLM 接口
TabooLibraryModule.getInst().unloadModules(); TabooLibraryModule.getInst().unloadModules();
// 结束数据库储存方法 // 结束数据库储存方法
if (getStorageType() == StorageType.SQL) { if (getStorageType() == StorageType.SQL) {
GlobalDataManager.SQLMethod.cancelSQLMethod(); GlobalDataManager.SQLMethod.cancelSQLMethod();
} }
// 清理数据 // 清理数据
if (getStorageType() == StorageType.LOCAL && getConfig().getBoolean("DELETE-DATA")) { if (getStorageType() == StorageType.LOCAL && getConfig().getBoolean("DELETE-DATA")) {
getPlayerDataFolder().delete(); getPlayerDataFolder().delete();
} }
// 清理数据 // 清理数据
if (getStorageType() == StorageType.SQL && getConfig().getBoolean("DELETE-VARIABLE")) { if (getStorageType() == StorageType.SQL && getConfig().getBoolean("DELETE-VARIABLE")) {
GlobalDataManager.clearInvalidVariables(); GlobalDataManager.clearInvalidVariables();
} }
// 提示信息 // 提示信息
MsgUtils.send("&c插件已卸载, 感谢您使用&4禁忌书库"); MsgUtils.send("&c插件已卸载, 感谢您使用&4禁忌书库");
MsgUtils.send("&c插件作者: &4坏黑"); MsgUtils.send("&c插件作者: &4坏黑");
// 清理头衔 // 清理头衔
TagUtils.delete(); TagUtils.delete();
// 结束连接 // 结束连接
if (connection != null && connection.isConnection()) { if (connection != null && connection.isConnection()) {
connection.closeConnection(); connection.closeConnection();
} }
TLib.unload(); TLib.unload();
// 关闭服务器 // 关闭服务器
Bukkit.shutdown(); Bukkit.shutdown();
} }
private void setupDataFolder() { private void setupDataFolder() {
playerDataFolder = new File(getConfig().getString("DATAURL.PLAYER-DATA")); playerDataFolder = new File(getConfig().getString("DATAURL.PLAYER-DATA"));
if (!playerDataFolder.exists()) { if (!playerDataFolder.exists()) {
playerDataFolder.mkdirs(); playerDataFolder.mkdirs();
} }
serverDataFolder = new File(getConfig().getString("DATAURL.SERVER-DATA")); serverDataFolder = new File(getConfig().getString("DATAURL.SERVER-DATA"));
if (!serverDataFolder.exists()) { if (!serverDataFolder.exists()) {
serverDataFolder.mkdirs(); serverDataFolder.mkdirs();
} }
} }
private void registerListener() { private void registerListener() {
getServer().getPluginManager().registerEvents(this, this); getServer().getPluginManager().registerEvents(this, this);
getServer().getPluginManager().registerEvents(new ListenerPlayerCommand(), this); getServer().getPluginManager().registerEvents(new ListenerPlayerCommand(), this);
getServer().getPluginManager().registerEvents(new ListenerPlayerJump(), this); getServer().getPluginManager().registerEvents(new ListenerPlayerJump(), this);
getServer().getPluginManager().registerEvents(new ListenerPlayerQuit(), this); getServer().getPluginManager().registerEvents(new ListenerPlayerQuit(), this);
getServer().getPluginManager().registerEvents(new ChatCatcher(), this); getServer().getPluginManager().registerEvents(new ChatCatcher(), this);
getServer().getPluginManager().registerEvents(new DataUtils(), this); getServer().getPluginManager().registerEvents(new DataUtils(), this);
getServer().getPluginManager().registerEvents(new AnvilContainerAPI(), this); getServer().getPluginManager().registerEvents(new AnvilContainerAPI(), this);
getServer().getPluginManager().registerEvents(new ListenerPluginDisable(), this); getServer().getPluginManager().registerEvents(new ListenerPluginDisable(), this);
getServer().getPluginManager().registerEvents(new PlayerDataManager(), this); getServer().getPluginManager().registerEvents(new PlayerDataManager(), this);
getServer().getPluginManager().registerEvents(new ItemLibraryPatch(), this); getServer().getPluginManager().registerEvents(new ItemLibraryPatch(), this);
getServer().getPluginManager().registerEvents(new SoundsLibraryPatch(), this); getServer().getPluginManager().registerEvents(new SoundsLibraryPatch(), this);
if (TabooLib.getVerint() > 10700) { if (TabooLib.getVerint() > 10700) {
getServer().getPluginManager().registerEvents(new EntityUtils(), this); getServer().getPluginManager().registerEvents(new EntityUtils(), this);
getServer().getPluginManager().registerEvents(new SignUtils(), this); getServer().getPluginManager().registerEvents(new SignUtils(), this);
} }
// 如果 YUM 插件存在 // 如果 YUM 插件存在
if (Bukkit.getPluginManager().getPlugin("YUM") != null) { if (Bukkit.getPluginManager().getPlugin("YUM") != null) {
getServer().getPluginManager().registerEvents(new ListenerNetWork(), this); getServer().getPluginManager().registerEvents(new ListenerNetWork(), this);
} }
} }
public enum StorageType { public enum StorageType {
LOCAL, SQL LOCAL, SQL
} }
} }