TabooLib v4.25

+ 新增 TConfiguration 工具,与 TConfigWatcher 联动创建能够自动重载的配置文件。(尚未测试)
+ 新增 TFunction 注解,自动执行载入与卸载方法。(变懒第一步,放弃注册步骤)
+ 调整 TLogger 工具,允许以自定义名称创建,并支持在 BungeeCord 下使用。
+ 调整 TListener 与 Instantiable 注解,不会再重复读取插件类了。
+ 调整 ReflectionUtils 工具,对部分语法进行了修改。
+ 调整 TabooLib 类下的 isSpigot 与 getVersion 算法。
+ 重做 AnvilContainerAPI 工具,现在可以正常使用了。(丢人玩意儿终于重写了)
+ InstanceHandler 类更名为 InstantiableLoader
+ MsgUtils 类被赋予尊贵的 @Deprecated
This commit is contained in:
坏黑 2018-09-08 18:06:43 +08:00
parent 6bb361d781
commit 4d59c7c3d6
19 changed files with 1098 additions and 797 deletions

View File

@ -6,7 +6,7 @@
<groupId>me.skymc</groupId> <groupId>me.skymc</groupId>
<artifactId>TabooLib</artifactId> <artifactId>TabooLib</artifactId>
<version>4.23</version> <version>4.25</version>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

View File

@ -1,9 +1,12 @@
package com.ilummc.tlib.logger; package com.ilummc.tlib.logger;
import com.ilummc.tlib.resources.TLocale;
import com.ilummc.tlib.util.Strings; import com.ilummc.tlib.util.Strings;
import me.skymc.taboolib.Main; import me.skymc.taboolib.Main;
import me.skymc.taboolib.TabooLib;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
public class TLogger { public class TLogger {
@ -12,7 +15,7 @@ public class TLogger {
private static TLogger globalLogger = new TLogger("§8[§3§lTabooLib§8][§r{1}§8] §f{2}", Main.getInst(), TLogger.FINE); private static TLogger globalLogger = new TLogger("§8[§3§lTabooLib§8][§r{1}§8] §f{2}", Main.getInst(), TLogger.FINE);
private final String pattern; private final String pattern;
private Plugin plugin; private String name;
private int level; private int level;
public static TLogger getGlobalLogger() { public static TLogger getGlobalLogger() {
@ -23,8 +26,8 @@ public class TLogger {
return pattern; return pattern;
} }
public Plugin getPlugin() { public String getName() {
return plugin; return name;
} }
public int getLevel() { public int getLevel() {
@ -37,49 +40,83 @@ public class TLogger {
public TLogger(String pattern, Plugin plugin, int level) { public TLogger(String pattern, Plugin plugin, int level) {
this.pattern = pattern; this.pattern = pattern;
this.plugin = plugin; this.name = plugin.getName();
this.level = level;
}
public TLogger(String pattern, String name, int level) {
this.pattern = pattern;
this.name = name;
this.level = level; this.level = level;
} }
public void verbose(String msg) { public void verbose(String msg) {
if (level <= VERBOSE) { if (level <= VERBOSE) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), "§f全部", ChatColor.translateAlternateColorCodes('&', msg))); if (TabooLib.isSpigot()) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, name, "§f全部", TLocale.Translate.setColored(msg)));
} else {
BungeeCord.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Strings.replaceWithOrder(pattern, name, "§f全部", TLocale.Translate.setColored(msg))));
}
} }
} }
public void finest(String msg) { public void finest(String msg) {
if (level <= FINEST) { if (level <= FINEST) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), "§e良好", ChatColor.translateAlternateColorCodes('&', msg))); if (TabooLib.isSpigot()) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, name, "§e良好", TLocale.Translate.setColored(msg)));
} else {
BungeeCord.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Strings.replaceWithOrder(pattern, name, "§e良好", TLocale.Translate.setColored(msg))));
}
} }
} }
public void fine(String msg) { public void fine(String msg) {
if (level <= FINE) { if (level <= FINE) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), "§a正常", ChatColor.translateAlternateColorCodes('&', msg))); if (TabooLib.isSpigot()) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, name, "§a正常", TLocale.Translate.setColored(msg)));
} else {
BungeeCord.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Strings.replaceWithOrder(pattern, name, "§a正常", TLocale.Translate.setColored(msg))));
}
} }
} }
public void info(String msg) { public void info(String msg) {
if (level <= INFO) { if (level <= INFO) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), "§b信息", ChatColor.translateAlternateColorCodes('&', msg))); if (TabooLib.isSpigot()) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, name, "§b信息", TLocale.Translate.setColored(msg)));
} else {
BungeeCord.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Strings.replaceWithOrder(pattern, name, "§b信息", TLocale.Translate.setColored(msg))));
}
} }
} }
public void warn(String msg) { public void warn(String msg) {
if (level <= WARN) { if (level <= WARN) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), "§6警告", "§6" + ChatColor.translateAlternateColorCodes('&', msg))); if (TabooLib.isSpigot()) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, name, "§6警告", "§6" + TLocale.Translate.setColored(msg)));
} else {
BungeeCord.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Strings.replaceWithOrder(pattern, name, "§6警告", "§6" + TLocale.Translate.setColored(msg))));
}
} }
} }
public void error(String msg) { public void error(String msg) {
if (level <= ERROR) { if (level <= ERROR) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), "§c错误", "§c" + ChatColor.translateAlternateColorCodes('&', msg))); if (TabooLib.isSpigot()) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, name, "§c错误", "§c" + TLocale.Translate.setColored(msg)));
} else {
BungeeCord.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Strings.replaceWithOrder(pattern, name, "§c错误", "§c" + TLocale.Translate.setColored(msg))));
}
} }
} }
public void fatal(String msg) { public void fatal(String msg) {
if (level <= FATAL) { if (level <= FATAL) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), "§4致命错误", "§4" + ChatColor.translateAlternateColorCodes('&', msg))); if (TabooLib.isSpigot()) {
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, name, "§4致命错误", "§4" + TLocale.Translate.setColored(msg)));
} else {
BungeeCord.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Strings.replaceWithOrder(pattern, name, "§4致命错误", "§4" + TLocale.Translate.setColored(msg))));
}
} }
} }
@ -87,4 +124,7 @@ public class TLogger {
return new TLogger("§8[§3§l{0}§8][§r{1}§8] §f{2}", plugin, TLogger.FINE); return new TLogger("§8[§3§l{0}§8][§r{1}§8] §f{2}", plugin, TLogger.FINE);
} }
public static TLogger getUnformatted(String name) {
return new TLogger("§8[§3§l{0}§8][§r{1}§8] §f{2}", name, TLogger.FINE);
}
} }

View File

@ -40,10 +40,8 @@ public abstract class ActionBar {
@Override @Override
public void send(Player player, String text) { public void send(Player player, String text) {
net.minecraft.server.v1_12_R1.ChatComponentText component = new net.minecraft.server.v1_12_R1.ChatComponentText(text); net.minecraft.server.v1_12_R1.ChatComponentText component = new net.minecraft.server.v1_12_R1.ChatComponentText(text);
net.minecraft.server.v1_12_R1.PacketPlayOutChat packet = new net.minecraft.server.v1_12_R1.PacketPlayOutChat(component, net.minecraft.server.v1_12_R1.PacketPlayOutChat packet = new net.minecraft.server.v1_12_R1.PacketPlayOutChat(component, net.minecraft.server.v1_12_R1.ChatMessageType.a((byte) 2));
net.minecraft.server.v1_12_R1.ChatMessageType.a((byte) 2));
((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
} }
} }
} }

View File

@ -13,16 +13,15 @@ import java.util.Map;
public class AsmClassTransformer extends ClassVisitor implements Opcodes { public class AsmClassTransformer extends ClassVisitor implements Opcodes {
private final Class<?> from; private final Class<?> from;
private final String fromVer;
private final String fromVer, toVer; private final String toVer;
private final ClassWriter writer; private final ClassWriter writer;
private String newClassName;
private String newClassName, prevName; private String prevName;
private AsmClassTransformer(Class<?> from, String fromVer, String toVer, ClassWriter classWriter) { private AsmClassTransformer(Class<?> from, String fromVer, String toVer, ClassWriter classWriter) {
super(Opcodes.ASM6, classWriter); super(Opcodes.ASM6, classWriter);
writer = classWriter; this.writer = classWriter;
this.from = from; this.from = from;
this.fromVer = fromVer; this.fromVer = fromVer;
this.toVer = toVer; this.toVer = toVer;
@ -67,9 +66,15 @@ public class AsmClassTransformer extends ClassVisitor implements Opcodes {
super.visitInnerClass(replace(name), outerName, replace(name).substring(outerName.length() + 1), access); super.visitInnerClass(replace(name), outerName, replace(name).substring(outerName.length() + 1), access);
} }
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
super.visit(version, access, newClassName.replace('.', '/'), replace(signature), replace(superName), replace(interfaces));
}
private String replace(String text) { private String replace(String text) {
if (text != null) { if (text != null) {
return text.replace("net/minecraft/server/" + fromVer, "net/minecraft/server/" + toVer) return text
.replace("net/minecraft/server/" + fromVer, "net/minecraft/server/" + toVer)
.replace("org/bukkit/craftbukkit/" + fromVer, "org/bukkit/craftbukkit/" + toVer) .replace("org/bukkit/craftbukkit/" + fromVer, "org/bukkit/craftbukkit/" + toVer)
.replace(prevName, newClassName.replace('.', '/')); .replace(prevName, newClassName.replace('.', '/'));
} else { } else {
@ -88,12 +93,6 @@ public class AsmClassTransformer extends ClassVisitor implements Opcodes {
} }
} }
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
super.visit(version, access, newClassName.replace('.', '/'), replace(signature),
replace(superName), replace(interfaces));
}
private class AsmMethodTransformer extends MethodVisitor { private class AsmMethodTransformer extends MethodVisitor {
AsmMethodTransformer(MethodVisitor visitor) { AsmMethodTransformer(MethodVisitor visitor) {

View File

@ -4,6 +4,7 @@ import com.ilummc.tlib.TLib;
import com.ilummc.tlib.resources.TLocale; import com.ilummc.tlib.resources.TLocale;
import com.ilummc.tlib.util.IO; import com.ilummc.tlib.util.IO;
import com.ilummc.tlib.util.Strings; import com.ilummc.tlib.util.Strings;
import me.skymc.taboolib.common.function.TFunctionLoader;
import me.skymc.taboolib.database.GlobalDataManager; import me.skymc.taboolib.database.GlobalDataManager;
import me.skymc.taboolib.database.PlayerDataManager; import me.skymc.taboolib.database.PlayerDataManager;
import me.skymc.taboolib.economy.EcoUtils; import me.skymc.taboolib.economy.EcoUtils;
@ -198,6 +199,8 @@ public class Main extends JavaPlugin {
HikariHandler.closeDataSourceForce(); HikariHandler.closeDataSourceForce();
// 注销监听器 // 注销监听器
TListenerHandler.cancelListeners(); TListenerHandler.cancelListeners();
// 注销子模块
TFunctionLoader.unloadFunction();
// 结束数据库储存方法 // 结束数据库储存方法
if (getStorageType() == StorageType.SQL) { if (getStorageType() == StorageType.SQL) {
GlobalDataManager.SQLMethod.cancelSQLMethod(); GlobalDataManager.SQLMethod.cancelSQLMethod();

View File

@ -18,7 +18,8 @@ public class TabooLib {
static { static {
try { try {
spigot = Bukkit.getConsoleSender() != null; Class.forName("org.bukkit.Bukkit");
spigot = true;
} catch (Exception ignored) { } catch (Exception ignored) {
} }
} }
@ -32,6 +33,16 @@ public class TabooLib {
return (Main) Main.getInst(); return (Main) Main.getInst();
} }
/**
* 插件是否为 TabooLib沙雕方法
*
* @param plugin 插件
* @return boolean
*/
public static boolean isTabooLib(Plugin plugin) {
return plugin.equals(instance()) || plugin.getName().equals("TabooLib");
}
/** /**
* 插件是否依赖于 TabooLib依赖或软兼容 * 插件是否依赖于 TabooLib依赖或软兼容
* *
@ -66,7 +77,7 @@ public class TabooLib {
* @return String * @return String
*/ */
public static String getVersion() { public static String getVersion() {
return Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; return Bukkit.getServer().getClass().getName().split("\\.")[3];
} }
/** /**

View File

@ -5,25 +5,45 @@ import com.ilummc.tlib.annotations.Dependency;
import com.ilummc.tlib.inject.TDependencyInjector; import com.ilummc.tlib.inject.TDependencyInjector;
import com.ilummc.tlib.resources.TLocale; import com.ilummc.tlib.resources.TLocale;
import me.skymc.taboolib.bstats.Metrics; import me.skymc.taboolib.bstats.Metrics;
import me.skymc.taboolib.commands.language.Language2Command;
import me.skymc.taboolib.fileutils.FileUtils; import me.skymc.taboolib.fileutils.FileUtils;
import me.skymc.taboolib.listener.TListener;
import me.skymc.taboolib.listener.TListenerHandler; import me.skymc.taboolib.listener.TListenerHandler;
import me.skymc.taboolib.playerdata.DataUtils; import me.skymc.taboolib.playerdata.DataUtils;
import me.skymc.tlm.command.TLMCommands;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.event.server.PluginEnableEvent;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* @Author sky * @Author sky
* @Since 2018-08-23 17:04 * @Since 2018-08-23 17:04
*/ */
class TabooLibLoader { @TListener
public class TabooLibLoader implements Listener {
static HashMap<String, List<Class>> pluginClasses = new HashMap<>();
@EventHandler (priority = EventPriority.LOWEST)
public void onEnable(PluginEnableEvent e) {
pluginClasses.remove(e.getPlugin().getName());
}
@EventHandler (priority = EventPriority.MONITOR)
public void onDisable(PluginDisableEvent e) {
setupClasses(e.getPlugin());
}
static void setup() { static void setup() {
testInternet(); testInternet();
@ -33,10 +53,21 @@ class TabooLibLoader {
} }
static void register() { static void register() {
setupClasses();
registerListener(); registerListener();
registerMetrics(); registerMetrics();
} }
/**
* 获取插件所有被读取到的类
*
* @param plugin 插件
* @return List
*/
public static Optional<List<Class>> getPluginClasses(Plugin plugin) {
return Optional.ofNullable(pluginClasses.get(plugin.getName()));
}
/** /**
* 初始化插件文件夹 * 初始化插件文件夹
*/ */
@ -45,6 +76,40 @@ class TabooLibLoader {
Main.setServerDataFolder(FileUtils.folder(Main.getInst().getConfig().getString("DATAURL.SERVER-DATA"))); Main.setServerDataFolder(FileUtils.folder(Main.getInst().getConfig().getString("DATAURL.SERVER-DATA")));
} }
/**
* 载入插件数据库
*/
static void setupDatabase() {
DataUtils.addPluginData("TabooLibrary", null);
// 检查是否启用数据库
Main.setStorageType(Main.getInst().getConfig().getBoolean("MYSQL.ENABLE") ? Main.StorageType.SQL : Main.StorageType.LOCAL);
// 初始化数据库
TabooLibDatabase.init();
}
/**
* 读取插件类
*/
static void setupClasses() {
Arrays.stream(Bukkit.getPluginManager().getPlugins()).forEach(TabooLibLoader::setupClasses);
}
/**
* 读取插件类
*/
static void setupClasses(Plugin plugin) {
if (!(TabooLib.isTabooLib(plugin) || TabooLib.isDependTabooLib(plugin))) {
return;
}
try {
long time = System.currentTimeMillis();
List<Class> classes = FileUtils.getClasses(plugin);
TLocale.Logger.info("DEPENDENCY.LOAD-CLASSES", plugin.getName(), String.valueOf(classes.size()), String.valueOf(System.currentTimeMillis() - time));
pluginClasses.put(plugin.getName(), classes);
} catch (Exception ignored) {
}
}
/** /**
* 初始化插件依赖库 * 初始化插件依赖库
*/ */
@ -84,17 +149,6 @@ class TabooLibLoader {
} }
} }
/**
* 载入插件数据库
*/
static void setupDatabase() {
DataUtils.addPluginData("TabooLibrary", null);
// 检查是否启用数据库
Main.setStorageType(Main.getInst().getConfig().getBoolean("MYSQL.ENABLE") ? Main.StorageType.SQL : Main.StorageType.LOCAL);
// 初始化数据库
TabooLibDatabase.init();
}
/** /**
* 载入插件监听 * 载入插件监听
*/ */
@ -113,5 +167,4 @@ class TabooLibLoader {
metrics.addCustomChart(new Metrics.SingleLineChart("plugins_using_taboolib", () -> Math.toIntExact(Arrays.stream(Bukkit.getPluginManager().getPlugins()).filter(plugin -> plugin.getDescription().getDepend().contains("TabooLib")).count()))); metrics.addCustomChart(new Metrics.SingleLineChart("plugins_using_taboolib", () -> Math.toIntExact(Arrays.stream(Bukkit.getPluginManager().getPlugins()).filter(plugin -> plugin.getDescription().getDepend().contains("TabooLib")).count())));
metrics.addCustomChart(new Metrics.AdvancedPie("plugins_using_taboolib_name", () -> Arrays.stream(Bukkit.getPluginManager().getPlugins()).filter(plugin -> plugin.getDescription().getDepend().contains("TabooLib")).collect(Collectors.toMap(Plugin::getName, plugin -> 1, (a, b) -> b)))); metrics.addCustomChart(new Metrics.AdvancedPie("plugins_using_taboolib_name", () -> Arrays.stream(Bukkit.getPluginManager().getPlugins()).filter(plugin -> plugin.getDescription().getDepend().contains("TabooLib")).collect(Collectors.toMap(Plugin::getName, plugin -> 1, (a, b) -> b))));
} }
} }

View File

@ -1,78 +1,29 @@
package me.skymc.taboolib.anvil; package me.skymc.taboolib.anvil;
import me.skymc.taboolib.nms.NMSUtils;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
/** /**
* @author sky * @Author sky
* @Since 2018-09-08 15:47
*/ */
public class AnvilContainer { public class AnvilContainer extends net.minecraft.server.v1_12_R1.ContainerAnvil {
// private static IAnvilContainer instance; public AnvilContainer(net.minecraft.server.v1_12_R1.EntityHuman player) {
super(player.inventory, player.world, new net.minecraft.server.v1_12_R1.BlockPosition(0, 0, 0), player);
}
private static Class<?> ChatMessage = NMSUtils.getNMSClass("ChatMessage"); @Override
private static Class<?> PacketPlayOutOpenWindow = NMSUtils.getNMSClass("PacketPlayOutOpenWindow"); public boolean a(net.minecraft.server.v1_12_R1.EntityHuman player) {
private static Class<?> IChatBaseComponent = NMSUtils.getNMSClass("IChatBaseComponent"); return true;
private static Class<?> Packet = NMSUtils.getNMSClass("Packet"); }
// public static IAnvilContainer getInstance() {
// return instance;
// }
//
// static {
// /*
// * 玩不懂玩不懂... 似乎不会更改父类的包名?
// */
// instance = (IAnvilContainer) AsmClassTransformer.builder()
// .from(AnvilContainerImpl.class)
// .fromVersion("v1_12_R1")
// .toVersion(Bukkit.getServer().getClass().getName().split("\\.")[3])
// .build()
// .transform();
// }
public static void openAnvil(Player p) { public static void openAnvil(Player p) {
try { net.minecraft.server.v1_12_R1.EntityPlayer player = ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer) p).getHandle();
Object player = p.getClass().getMethod("getHandle").invoke(p); AnvilContainer container = new AnvilContainer(player);
int c = (int) player.getClass().getMethod("nextContainerCounter").invoke(player); int c = player.nextContainerCounter();
Object chatMessage = ChatMessage.getConstructor(String.class, Object[].class).newInstance("Repairing", new Object[0]); player.playerConnection.sendPacket(new net.minecraft.server.v1_12_R1.PacketPlayOutOpenWindow(c, "minecraft:anvil", new net.minecraft.server.v1_12_R1.ChatMessage("Repairing"), 0));
Object packetPlayOutOpenWindow = PacketPlayOutOpenWindow.getConstructor(Integer.TYPE, String.class, IChatBaseComponent, Integer.TYPE).newInstance(c, "minecraft:anvil", chatMessage, 0); player.activeContainer = container;
Object playerConnection = player.getClass().getDeclaredField("playerConnection").get(player); player.activeContainer.windowId = c;
playerConnection.getClass().getMethod("sendPacket", Packet).invoke(playerConnection, packetPlayOutOpenWindow); player.activeContainer.addSlotListener(player);
} catch (Exception ignored) {
} }
} }
}
//interface IAnvilContainer {
//
// /**
// * 打开铁砧界面
// *
// * @param player 玩家
// */
// void openAnvil(Player player);
//}
//
//class AnvilContainerImpl extends net.minecraft.server.v1_12_R1.ContainerAnvil implements IAnvilContainer {
//
// public AnvilContainerImpl(net.minecraft.server.v1_12_R1.EntityHuman player) {
// super(player.inventory, player.world, new net.minecraft.server.v1_12_R1.BlockPosition(0, 0, 0), player);
// }
//
// @Override
// public void openAnvil(Player p) {
// net.minecraft.server.v1_12_R1.EntityPlayer player = ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer) p).getHandle();
// AnvilContainerImpl container = new AnvilContainerImpl(player);
// int c = player.nextContainerCounter();
// player.playerConnection.sendPacket(new net.minecraft.server.v1_12_R1.PacketPlayOutOpenWindow(c, "minecraft:anvil", new net.minecraft.server.v1_12_R1.ChatMessage("Repairing"), 0));
// player.activeContainer = container;
// player.activeContainer.windowId = c;
// player.activeContainer.addSlotListener(player);
// }
//
// @Override
// public boolean a(net.minecraft.server.v1_12_R1.EntityHuman player) {
// return true;
// }
//}

View File

@ -1,105 +1,42 @@
package me.skymc.taboolib.anvil; package me.skymc.taboolib.anvil;
import com.ilummc.tlib.resources.TLocale; import com.ilummc.tlib.util.asm.AsmClassLoader;
import me.skymc.taboolib.TabooLib;
import me.skymc.taboolib.listener.TListener; import me.skymc.taboolib.listener.TListener;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* @author sky
*/
@TListener @TListener
public class AnvilContainerAPI implements Listener { public class AnvilContainerAPI implements Listener {
public static List<String> list = new ArrayList<>(); private static Class<?> impl;
public static ItemStack item = new ItemStack(Material.NAME_TAG);
public static HashMap<String, String> isOpen = new HashMap<>();
public static AnvilContainerAPIEvent event;
public static void send(Player p, String type, String str, List<String> lorelist) { public AnvilContainerAPI() {
isOpen.put(p.getName(), type); try {
impl = AsmClassLoader.createNewClass("me.skymc.taboolib.anvil.AnvilContainer", AnvilContainerAsm.create(TabooLib.getVersion()));
AnvilContainer.openAnvil(p); } catch (Exception e) {
ItemMeta meta = item.getItemMeta(); e.printStackTrace();
list.clear();
if (lorelist == null) {
list.addAll(TLocale.asStringList("ANVIL-CONTAINER.LORE-NORMAL"));
} else {
list = lorelist;
}
meta.setLore(list);
meta.setDisplayName(str);
item.setItemMeta(meta);
p.getOpenInventory().getTopInventory().setItem(0, item);
p.playSound(p.getLocation(), Sound.BLOCK_ANVIL_PLACE, 1, 1);
}
@EventHandler
public void close(InventoryCloseEvent e) {
if (isOpen.containsKey(e.getPlayer().getName())) {
isOpen.remove(e.getPlayer().getName());
if (e.getInventory().getType() == InventoryType.ANVIL) {
e.getInventory().clear();
}
} }
} }
@EventHandler public static void openAnvil(Player player) {
public void click(InventoryClickEvent e) { try {
if (!isOpen.containsKey(e.getWhoClicked().getName())) { impl.getMethod("openAnvil", Player.class).invoke(impl, player);
return; } catch (Exception e) {
} e.printStackTrace();
if (e.getInventory().getType() != InventoryType.ANVIL) {
return;
}
e.setCancelled(true);
int slot = e.getRawSlot();
if (slot != 2) {
return;
}
Inventory inv = e.getInventory();
if (inv.getItem(2) == null) {
return;
}
if (inv.getItem(2).getItemMeta().hasDisplayName()) {
event = new AnvilContainerAPIEvent(e, isOpen.get(e.getWhoClicked().getName()), inv.getItem(2).getItemMeta().getDisplayName());
e.getWhoClicked().closeInventory();
Bukkit.getPluginManager().callEvent(event);
} }
} }
@EventHandler @EventHandler
public void example(PlayerCommandPreprocessEvent e) { public void example(PlayerCommandPreprocessEvent e) {
if ("/anvilexample".equals(e.getMessage())) { if (e.getMessage().equalsIgnoreCase("/anvilExample") && e.getPlayer().hasPermission("taboolib.admin")) {
if (e.getPlayer().hasPermission("taboolib.admin")) {
e.setCancelled(true); e.setCancelled(true);
AnvilContainerAPI.send(e.getPlayer(), "EXAMPLE", TLocale.asString("ANVIL-CONTAINER.NAME-EXAMPLE"), null); openAnvil(e.getPlayer());
}
}
}
@EventHandler
public void example2(AnvilContainerAPIEvent e) {
if ("EXAMPLE".equals(e.type)) {
e.event.getWhoClicked().sendMessage(e.string);
} }
} }
} }

View File

@ -1,28 +0,0 @@
package me.skymc.taboolib.anvil;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.inventory.InventoryClickEvent;
public class AnvilContainerAPIEvent extends Event {
public static final HandlerList handlers = new HandlerList();
public InventoryClickEvent event;
public String string;
public String type;
public AnvilContainerAPIEvent(InventoryClickEvent e, String t, String s) {
event = e;
string = s;
type = t;
}
public static HandlerList getHandlerList() {
return handlers;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
}

View File

@ -0,0 +1,145 @@
package me.skymc.taboolib.anvil;
import org.objectweb.asm.*;
/**
* @author sky
*/
public class AnvilContainerAsm {
public static byte[] create(String version) {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, "me/skymc/taboolib/anvil/AnvilContainer", null, "net/minecraft/server/" + version + "/ContainerAnvil", null);
cw.visitSource("AnvilContainer.java", null);
{
mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Lnet/minecraft/server/" + version + "/EntityHuman;)V", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(12, l0);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/server/" + version + "/EntityHuman", "inventory", "Lnet/minecraft/server/" + version + "/PlayerInventory;");
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/server/" + version + "/EntityHuman", "world", "Lnet/minecraft/server/" + version + "/World;");
mv.visitTypeInsn(Opcodes.NEW, "net/minecraft/server/" + version + "/BlockPosition");
mv.visitInsn(Opcodes.DUP);
mv.visitInsn(Opcodes.ICONST_0);
mv.visitInsn(Opcodes.ICONST_0);
mv.visitInsn(Opcodes.ICONST_0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "net/minecraft/server/" + version + "/BlockPosition", "<init>", "(III)V", false);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "net/minecraft/server/" + version + "/ContainerAnvil", "<init>", "(Lnet/minecraft/server/" + version + "/PlayerInventory;Lnet/minecraft/server/" + version + "/World;Lnet/minecraft/server/" + version + "/BlockPosition;Lnet/minecraft/server/" + version + "/EntityHuman;)V", false);
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLineNumber(13, l1);
mv.visitInsn(Opcodes.RETURN);
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLocalVariable("this", "Lme/skymc/taboolib/anvil/AnvilContainer;", null, l0, l2, 0);
mv.visitLocalVariable("player", "Lnet/minecraft/server/" + version + "/EntityHuman;", null, l0, l2, 1);
mv.visitMaxs(8, 2);
mv.visitEnd();
}
{
mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "a", "(Lnet/minecraft/server/" + version + "/EntityHuman;)Z", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(17, l0);
mv.visitInsn(Opcodes.ICONST_1);
mv.visitInsn(Opcodes.IRETURN);
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLocalVariable("this", "Lme/skymc/taboolib/anvil/AnvilContainer;", null, l0, l1, 0);
mv.visitLocalVariable("player", "Lnet/minecraft/server/" + version + "/EntityHuman;", null, l0, l1, 1);
mv.visitMaxs(1, 2);
mv.visitEnd();
}
{
mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "openAnvil", "(Lorg/bukkit/entity/Player;)V", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(21, l0);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitTypeInsn(Opcodes.CHECKCAST, "org/bukkit/craftbukkit/" + version + "/entity/CraftPlayer");
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/bukkit/craftbukkit/" + version + "/entity/CraftPlayer", "getHandle", "()Lnet/minecraft/server/" + version + "/EntityPlayer;", false);
mv.visitVarInsn(Opcodes.ASTORE, 1);
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLineNumber(22, l1);
mv.visitTypeInsn(Opcodes.NEW, "me/skymc/taboolib/anvil/AnvilContainer");
mv.visitInsn(Opcodes.DUP);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "me/skymc/taboolib/anvil/AnvilContainer", "<init>", "(Lnet/minecraft/server/" + version + "/EntityHuman;)V", false);
mv.visitVarInsn(Opcodes.ASTORE, 2);
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLineNumber(23, l2);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/" + version + "/EntityPlayer", "nextContainerCounter", "()I", false);
mv.visitVarInsn(Opcodes.ISTORE, 3);
Label l3 = new Label();
mv.visitLabel(l3);
mv.visitLineNumber(24, l3);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/server/" + version + "/EntityPlayer", "playerConnection", "Lnet/minecraft/server/" + version + "/PlayerConnection;");
mv.visitTypeInsn(Opcodes.NEW, "net/minecraft/server/" + version + "/PacketPlayOutOpenWindow");
mv.visitInsn(Opcodes.DUP);
mv.visitVarInsn(Opcodes.ILOAD, 3);
mv.visitLdcInsn("minecraft:anvil");
mv.visitTypeInsn(Opcodes.NEW, "net/minecraft/server/" + version + "/ChatMessage");
mv.visitInsn(Opcodes.DUP);
mv.visitLdcInsn("Repairing");
mv.visitInsn(Opcodes.ICONST_0);
mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "net/minecraft/server/" + version + "/ChatMessage", "<init>", "(Ljava/lang/String;[Ljava/lang/Object;)V", false);
mv.visitInsn(Opcodes.ICONST_0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "net/minecraft/server/" + version + "/PacketPlayOutOpenWindow", "<init>", "(ILjava/lang/String;Lnet/minecraft/server/" + version + "/IChatBaseComponent;I)V", false);
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/" + version + "/PlayerConnection", "sendPacket", "(Lnet/minecraft/server/" + version + "/Packet;)V", false);
Label l4 = new Label();
mv.visitLabel(l4);
mv.visitLineNumber(25, l4);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitVarInsn(Opcodes.ALOAD, 2);
mv.visitFieldInsn(Opcodes.PUTFIELD, "net/minecraft/server/" + version + "/EntityPlayer", "activeContainer", "Lnet/minecraft/server/" + version + "/Container;");
Label l5 = new Label();
mv.visitLabel(l5);
mv.visitLineNumber(26, l5);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/server/" + version + "/EntityPlayer", "activeContainer", "Lnet/minecraft/server/" + version + "/Container;");
mv.visitVarInsn(Opcodes.ILOAD, 3);
mv.visitFieldInsn(Opcodes.PUTFIELD, "net/minecraft/server/" + version + "/Container", "windowId", "I");
Label l6 = new Label();
mv.visitLabel(l6);
mv.visitLineNumber(27, l6);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitFieldInsn(Opcodes.GETFIELD, "net/minecraft/server/" + version + "/EntityPlayer", "activeContainer", "Lnet/minecraft/server/" + version + "/Container;");
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "net/minecraft/server/" + version + "/Container", "addSlotListener", "(Lnet/minecraft/server/" + version + "/ICrafting;)V", false);
Label l7 = new Label();
mv.visitLabel(l7);
mv.visitLineNumber(28, l7);
mv.visitInsn(Opcodes.RETURN);
Label l8 = new Label();
mv.visitLabel(l8);
mv.visitLocalVariable("p", "Lorg/bukkit/entity/Player;", null, l0, l8, 0);
mv.visitLocalVariable("player", "Lnet/minecraft/server/" + version + "/EntityPlayer;", null, l1, l8, 1);
mv.visitLocalVariable("container", "Lme/skymc/taboolib/anvil/AnvilContainer;", null, l2, l8, 2);
mv.visitLocalVariable("c", "I", null, l3, l8, 3);
mv.visitMaxs(9, 4);
mv.visitEnd();
}
cw.visitEnd();
return cw.toByteArray();
}
}

View File

@ -0,0 +1,86 @@
package me.skymc.taboolib.common.configuration;
import com.ilummc.tlib.TLib;
import com.ilummc.tlib.logger.TLogger;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import java.io.File;
import java.io.IOException;
import java.util.Optional;
/**
* @Author sky
* @Since 2018-09-08 15:00
*/
public class TConfiguration extends YamlConfiguration {
private File file;
private Runnable runnable;
private TConfiguration(File file) {
this.file = file;
reload();
TLib.getTLib().getConfigWatcher().addSimpleListener(this.file, this::reload);
}
/**
* 释放文件监听
*/
public void release() {
TLib.getTLib().getConfigWatcher().removeListener(file);
}
/**
* 重新载入配置
*/
public void reload() {
try {
load(file);
Optional.ofNullable(runnable).ifPresent(Runnable::run);
} catch (IOException | InvalidConfigurationException e) {
TLogger.getGlobalLogger().warn("Cannot load configuration from stream: " + e.toString());
}
}
/**
* 创建配置文件
*
* @param file 文件
* @return {@link TConfiguration}
*/
public static TConfiguration create(File file) {
return new TConfiguration(file);
}
/**
* 从插件里释放文件并创建
*
* @param plugin 插件
* @param path 目录
* @return {@link TConfiguration}
*/
public static TConfiguration createInResource(Plugin plugin, String path) {
File file = new File(plugin.getDataFolder(), path);
if (!file.exists()) {
plugin.saveResource(path, true);
}
return create(file);
}
// *********************************
//
// Getter and Setter
//
// *********************************
public File getFile() {
return file;
}
public TConfiguration listener(Runnable runnable) {
this.runnable = runnable;
return this;
}
}

View File

@ -0,0 +1,19 @@
package me.skymc.taboolib.common.function;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author sky
* @Since 2018-09-08 14:01
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TFunction {
String enable() default "onEnable";
String disable() default "onDisable";
}

View File

@ -0,0 +1,90 @@
package me.skymc.taboolib.common.function;
import me.skymc.taboolib.TabooLib;
import me.skymc.taboolib.TabooLibLoader;
import me.skymc.taboolib.listener.TListener;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.event.server.PluginEnableEvent;
import org.bukkit.plugin.Plugin;
import java.lang.reflect.Method;
import java.util.*;
/**
* @Author sky
* @Since 2018-09-08 14:00
*/
@TListener
public class TFunctionLoader implements Listener {
private static HashMap<String, List<Class>> pluginFunction = new HashMap<>();
TFunctionLoader() {
loadFunction();
}
public static void loadFunction() {
Arrays.stream(Bukkit.getPluginManager().getPlugins()).forEach(TFunctionLoader::loadFunction);
}
public static void loadFunction(Plugin plugin) {
if (!(TabooLib.isTabooLib(plugin) || TabooLib.isDependTabooLib(plugin))) {
return;
}
TabooLibLoader.getPluginClasses(plugin).ifPresent(classes -> {
for (Class pluginClass : classes) {
if (pluginClass.isAnnotationPresent(TFunction.class)) {
TFunction function = (TFunction) pluginClass.getAnnotation(TFunction.class);
try {
Method method = pluginClass.getDeclaredMethod(function.enable());
if (method == null) {
continue;
}
method.setAccessible(true);
method.invoke(pluginClass.newInstance());
pluginFunction.computeIfAbsent(plugin.getName(), name -> new ArrayList<>()).add(pluginClass);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
public static void unloadFunction() {
Arrays.stream(Bukkit.getPluginManager().getPlugins()).forEach(TFunctionLoader::unloadFunction);
}
public static void unloadFunction(Plugin plugin) {
Optional.ofNullable(pluginFunction.remove(plugin.getName())).ifPresent(classes -> {
for (Class pluginClass : classes) {
if (pluginClass.isAnnotationPresent(TFunction.class)) {
TFunction function = (TFunction) pluginClass.getAnnotation(TFunction.class);
try {
Method method = pluginClass.getDeclaredMethod(function.disable());
if (method == null) {
continue;
}
method.setAccessible(true);
method.invoke(pluginClass.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
@EventHandler
public void onEnable(PluginEnableEvent e) {
loadFunction(e.getPlugin());
}
@EventHandler
public void onDisable(PluginDisableEvent e) {
unloadFunction(e.getPlugin());
}
}

View File

@ -2,7 +2,9 @@ package me.skymc.taboolib.listener;
import com.ilummc.tlib.util.Strings; import com.ilummc.tlib.util.Strings;
import me.skymc.taboolib.TabooLib; import me.skymc.taboolib.TabooLib;
import me.skymc.taboolib.TabooLibLoader;
import me.skymc.taboolib.fileutils.FileUtils; import me.skymc.taboolib.fileutils.FileUtils;
import me.skymc.taboolib.methods.ReflectionUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
@ -43,10 +45,7 @@ public class TListenerHandler implements Listener {
* @param plugin 插件 * @param plugin 插件
*/ */
public static void setupListener(Plugin plugin) { public static void setupListener(Plugin plugin) {
if (!(plugin.equals(TabooLib.instance()) || TabooLib.isDependTabooLib(plugin))) { TabooLibLoader.getPluginClasses(plugin).ifPresent(classes -> {
return;
}
List<Class> classes = FileUtils.getClasses(plugin);
for (Class<?> pluginClass : classes) { for (Class<?> pluginClass : classes) {
if (Listener.class.isAssignableFrom(pluginClass) && pluginClass.isAnnotationPresent(TListener.class)) { if (Listener.class.isAssignableFrom(pluginClass) && pluginClass.isAnnotationPresent(TListener.class)) {
try { try {
@ -58,13 +57,14 @@ public class TListenerHandler implements Listener {
} }
} }
// 实例化监听器 // 实例化监听器
Listener listener = plugin.getClass().equals(pluginClass) ? (Listener) plugin : (Listener) pluginClass.newInstance(); Listener listener = plugin.getClass().equals(pluginClass) ? (Listener) plugin : (Listener) ReflectionUtils.instantiateObject(pluginClass);
listeners.computeIfAbsent(plugin.getName(), name -> new ArrayList<>()).add(listener); listeners.computeIfAbsent(plugin.getName(), name -> new ArrayList<>()).add(listener);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
});
} }
/** /**

View File

@ -5,6 +5,7 @@ import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
@Deprecated
public class MsgUtils { public class MsgUtils {
public static void send(CommandSender sender, String s) { public static void send(CommandSender sender, String s) {

View File

@ -19,7 +19,7 @@ import java.util.Map;
* <li>Don't claim this class as your own * <li>Don't claim this class as your own
* <li>Don't remove this disclaimer * <li>Don't remove this disclaimer
* </ul> * </ul>
* <p> *
* <i>It would be nice if you provide credit to me if you use this class in a published project</i> * <i>It would be nice if you provide credit to me if you use this class in a published project</i>
* *
* @author DarkBlade12 * @author DarkBlade12
@ -27,7 +27,8 @@ import java.util.Map;
*/ */
public final class ReflectionUtils { public final class ReflectionUtils {
// Prevent accidental construction // Prevent accidental construction
private ReflectionUtils() {} private ReflectionUtils() {
}
/** /**
* Returns the constructor of a given class with the given parameter types * Returns the constructor of a given class with the given parameter types
@ -42,10 +43,11 @@ public final class ReflectionUtils {
*/ */
public static Constructor<?> getConstructor(Class<?> clazz, Class<?>... parameterTypes) throws NoSuchMethodException { public static Constructor<?> getConstructor(Class<?> clazz, Class<?>... parameterTypes) throws NoSuchMethodException {
Class<?>[] primitiveTypes = DataType.getPrimitive(parameterTypes); Class<?>[] primitiveTypes = DataType.getPrimitive(parameterTypes);
for (Constructor<?> constructor : clazz.getConstructors()) { for (Constructor<?> constructor : clazz.getDeclaredConstructors()) {
if (!DataType.compare(DataType.getPrimitive(constructor.getParameterTypes()), primitiveTypes)) { if (!DataType.compare(DataType.getPrimitive(constructor.getParameterTypes()), primitiveTypes)) {
continue; continue;
} }
constructor.setAccessible(true);
return constructor; return constructor;
} }
throw new NoSuchMethodException("There is no such constructor in this class with the specified parameter types"); throw new NoSuchMethodException("There is no such constructor in this class with the specified parameter types");
@ -114,10 +116,11 @@ public final class ReflectionUtils {
*/ */
public static Method getMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes) throws NoSuchMethodException { public static Method getMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes) throws NoSuchMethodException {
Class<?>[] primitiveTypes = DataType.getPrimitive(parameterTypes); Class<?>[] primitiveTypes = DataType.getPrimitive(parameterTypes);
for (Method method : clazz.getMethods()) { for (Method method : clazz.getDeclaredMethods()) {
if (!method.getName().equals(methodName) || !DataType.compare(DataType.getPrimitive(method.getParameterTypes()), primitiveTypes)) { if (!method.getName().equals(methodName) || !DataType.compare(DataType.getPrimitive(method.getParameterTypes()), primitiveTypes)) {
continue; continue;
} }
method.setAccessible(true);
return method; return method;
} }
throw new NoSuchMethodException("There is no such method in this class with the specified name and parameter types"); throw new NoSuchMethodException("There is no such method in this class with the specified name and parameter types");

View File

@ -1,9 +1,9 @@
package me.skymc.taboolib.object; package me.skymc.taboolib.object;
import com.ilummc.tlib.util.Ref; import com.ilummc.tlib.util.Ref;
import me.skymc.taboolib.TabooLib; import me.skymc.taboolib.TabooLibLoader;
import me.skymc.taboolib.fileutils.FileUtils;
import me.skymc.taboolib.listener.TListener; import me.skymc.taboolib.listener.TListener;
import me.skymc.taboolib.methods.ReflectionUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -19,11 +19,11 @@ import java.util.concurrent.ConcurrentHashMap;
* @Since 2018-08-27 10:04 * @Since 2018-08-27 10:04
*/ */
@TListener @TListener
public class InstanceHandler implements Listener { public class InstantiableLoader implements Listener {
private static ConcurrentHashMap<String, Object> instance = new ConcurrentHashMap<>(); private static ConcurrentHashMap<String, Object> instance = new ConcurrentHashMap<>();
public InstanceHandler() { public InstantiableLoader() {
loadInstantiable(); loadInstantiable();
} }
@ -52,19 +52,18 @@ public class InstanceHandler implements Listener {
} }
public static void loadInstantiable(Plugin plugin) { public static void loadInstantiable(Plugin plugin) {
if (!(plugin.equals(TabooLib.instance()) || TabooLib.isDependTabooLib(plugin))) { TabooLibLoader.getPluginClasses(plugin).ifPresent(classes -> {
return; for (Class pluginClass : classes) {
}
for (Class pluginClass : FileUtils.getClasses(plugin)) {
if (pluginClass.isAnnotationPresent(Instantiable.class)) { if (pluginClass.isAnnotationPresent(Instantiable.class)) {
Instantiable instantiable = (Instantiable) pluginClass.getAnnotation(Instantiable.class); Instantiable instantiable = (Instantiable) pluginClass.getAnnotation(Instantiable.class);
try { try {
instance.put(instantiable.value(), pluginClass.newInstance()); instance.put(instantiable.value(), ReflectionUtils.instantiateObject(pluginClass));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
});
} }
// ********************************* // *********************************

View File

@ -28,6 +28,7 @@ DEPENDENCY:
LIBRARY-LOAD-SUCCESS: ' {0} 请求的库文件 {1} 加载成功' LIBRARY-LOAD-SUCCESS: ' {0} 请求的库文件 {1} 加载成功'
LIBRARY-LOAD-FAIL: ' {0} 请求的库文件 {1} 加载失败' LIBRARY-LOAD-FAIL: ' {0} 请求的库文件 {1} 加载失败'
LOAD-COMPLETE: '依赖加载完成' LOAD-COMPLETE: '依赖加载完成'
LOAD-CLASSES: '&7缓存 &f{0} &7插件的 &f{1} &7个类耗时&f {2} &7毫秒.'
CONFIG: CONFIG:
LOAD-FAIL-NO-ANNOTATION: '插件 {0} 的配置类 {1} 加载失败:没有 @Config 注解' LOAD-FAIL-NO-ANNOTATION: '插件 {0} 的配置类 {1} 加载失败:没有 @Config 注解'
@ -112,13 +113,6 @@ LANGUAGE2:
TIMECYCLE: TIMECYCLE:
FAIL-CYCLE-EXISTS: '注册周期管理器 &8{0}&c 失败, 原因: &4名称重复' FAIL-CYCLE-EXISTS: '注册周期管理器 &8{0}&c 失败, 原因: &4名称重复'
ANVIL-CONTAINER:
NAME-EXAMPLE: '在这里输入文本'
LORE-NORMAL:
- ''
- '&7在上方文本框内输入信息'
- '&7随后点击右侧输出物品'
UPDATETASK: UPDATETASK:
VERSION-FAIL: '&4更新记录获取失败, 请检查网络连接!' VERSION-FAIL: '&4更新记录获取失败, 请检查网络连接!'
VERSION-LATEST: '&7插件已是最新版, 无需更新!' VERSION-LATEST: '&7插件已是最新版, 无需更新!'