update 5.03

This commit is contained in:
坏黑
2019-08-18 00:38:45 +08:00
parent bf809208ae
commit a102bcaf7f
21 changed files with 2107 additions and 105 deletions

View File

@@ -81,6 +81,14 @@ public class TConfig extends YamlConfiguration {
}
}
public void saveToFile() {
try {
save(file);
} catch (Throwable t) {
t.printStackTrace();
}
}
// *********************************
//
// Getter and Setter
@@ -91,6 +99,10 @@ public class TConfig extends YamlConfiguration {
return file;
}
public Runnable getListener() {
return runnable;
}
public TConfig listener(Runnable runnable) {
this.runnable = runnable;
return this;

View File

@@ -14,8 +14,8 @@ import java.lang.reflect.Modifier;
public class LocalLoader implements TabooLibLoader.Loader {
@Override
public void preLoad(Plugin plugin, Class<?> loadClass) {
for (Field field : loadClass.getDeclaredFields()) {
public void preLoad(Plugin plugin, Class<?> pluginClass) {
for (Field field : pluginClass.getDeclaredFields()) {
LocalFile annotation = field.getAnnotation(LocalFile.class);
if (annotation == null) {
continue;
@@ -24,10 +24,10 @@ public class LocalLoader implements TabooLibLoader.Loader {
// 如果是非静态类型
if (!Modifier.isStatic(field.getModifiers())) {
// 是否为主类
if (loadClass.equals(plugin.getClass())) {
if (pluginClass.equals(plugin.getClass())) {
instance = plugin;
} else {
TLogger.getGlobalLogger().error(field.getName() + " is not a static field. (" + loadClass.getName() + ")");
TLogger.getGlobalLogger().error(field.getName() + " is not a static field. (" + pluginClass.getName() + ")");
continue;
}
}

View File

@@ -40,7 +40,7 @@ public class PlayerContainerLoader implements Listener, TabooLibLoader.Loader {
}
@Override
public void unload(Plugin plugin, Class<?> cancelClass) {
public void unload(Plugin plugin, Class<?> pluginClass) {
pluginContainer.remove(plugin.getName());
}

View File

@@ -0,0 +1,15 @@
package io.izzel.taboolib.module.inject;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author sky
* @Since 2018-08-22 13:41
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface THook {
}

View File

@@ -0,0 +1,22 @@
package io.izzel.taboolib.module.inject;
import io.izzel.taboolib.TabooLibAPI;
import io.izzel.taboolib.TabooLibLoader;
import org.bukkit.plugin.Plugin;
/**
* @Author sky
* @Since 2019-08-17 22:32
*/
public class THookLoader implements TabooLibLoader.Loader {
@Override
public void activeLoad(Plugin plugin, Class<?> pluginClass) {
if (pluginClass.isAnnotationPresent(THook.class)) {
// PlaceholderAPI
if (TabooLibAPI.getPluginBridge().placeholderHooked() && TabooLibAPI.getPluginBridge().isPlaceholderExpansion(pluginClass)) {
TabooLibAPI.getPluginBridge().registerExpansion(pluginClass);
}
}
}
}

View File

@@ -15,4 +15,22 @@ public @interface TInject {
String[] value() default {};
String asm() default "";
String load() default "";
String init() default "";
String active() default "";
String cancel() default "";
String reload() default "";
State state() default State.NONE;
enum State {
LOADING, STARTING, ACTIVATED, NONE
}
}

View File

@@ -0,0 +1,156 @@
package io.izzel.taboolib.module.inject;
import com.google.common.collect.Maps;
import io.izzel.taboolib.TabooLibLoader;
import io.izzel.taboolib.module.locale.logger.TLogger;
import io.izzel.taboolib.util.Reflection;
import org.bukkit.plugin.Plugin;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Map;
import java.util.Objects;
/**
* @Author sky
* @Since 2019-08-17 22:50
*/
public class TInjectCreator implements TabooLibLoader.Loader {
private static Map<ClassData, InstanceData> instanceMap = Maps.newHashMap();
@Override
public int priority() {
return 999;
}
@Override
public void preLoad(Plugin plugin, Class<?> pluginClass) {
instance(plugin, pluginClass, TInject.State.LOADING);
eval(pluginClass, TInjectHelper.State.PRE);
}
@Override
public void postLoad(Plugin plugin, Class<?> pluginClass) {
instance(plugin, pluginClass, TInject.State.STARTING);
eval(pluginClass, TInjectHelper.State.POST);
}
@Override
public void activeLoad(Plugin plugin, Class<?> pluginClass) {
instance(plugin, pluginClass, TInject.State.ACTIVATED);
eval(pluginClass, TInjectHelper.State.ACTIVE);
}
@Override
public void unload(Plugin plugin, Class<?> pluginClass) {
eval(pluginClass, TInjectHelper.State.CANCEL);
}
public void instance(Plugin plugin, Class<?> loadClass, TInject.State state) {
for (Field declaredField : loadClass.getDeclaredFields()) {
TInject annotation = declaredField.getAnnotation(TInject.class);
if (annotation == null || annotation.state() != state) {
continue;
}
ClassData classData = new ClassData(loadClass, declaredField.getType());
Object instance = null;
// 非静态类型
if (!Modifier.isStatic(declaredField.getModifiers())) {
// 在插件主类
if (loadClass.equals(plugin.getClass())) {
instance = plugin;
}
// 判断 pluginCLass 是否为 TInject 创建
else if (instanceMap.containsKey(classData)) {
instance = instanceMap.get(classData).getInstance();
} else {
TLogger.getGlobalLogger().error(declaredField.getName() + " is not a static field. (" + loadClass.getName() + ")");
continue;
}
}
declaredField.setAccessible(true);
try {
InstanceData instanceData = new InstanceData(declaredField.getType().newInstance(), annotation);
declaredField.set(instance, instanceData.getInstance());
instanceMap.put(classData, instanceData);
} catch (Throwable t) {
TLogger.getGlobalLogger().error(declaredField.getName() + " instantiation failed: " + t.getMessage());
}
}
}
public void eval(Class<?> loadClass, TInjectHelper.State state) {
for (Map.Entry<ClassData, InstanceData> entry : instanceMap.entrySet()) {
if (entry.getKey().getParent().equals(loadClass) && !TInjectHelper.fromState(entry.getValue().getInject(), state).isEmpty()) {
try {
Reflection.invokeMethod(entry.getValue().getInstance(), TInjectHelper.fromState(entry.getValue().getInject(), state));
} catch (Throwable t) {
t.printStackTrace();
}
}
}
}
public static Map<ClassData, InstanceData> getInstanceMap() {
return instanceMap;
}
/**
* 用于防止多个类使用同一个类型
*/
public class ClassData {
private Class parent;
private Class type;
public ClassData(Class parent, Class type) {
this.parent = parent;
this.type = type;
}
public Class getParent() {
return parent;
}
public Class getType() {
return type;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ClassData)) {
return false;
}
ClassData classData = (ClassData) o;
return Objects.equals(getParent(), classData.getParent()) && Objects.equals(getType(), classData.getType());
}
@Override
public int hashCode() {
return Objects.hash(getParent(), getType());
}
}
public class InstanceData {
private Object instance;
private TInject inject;
public InstanceData(Object instance, TInject inject) {
this.instance = instance;
this.inject = inject;
}
public Object getInstance() {
return instance;
}
public TInject getInject() {
return inject;
}
}
}

View File

@@ -0,0 +1,26 @@
package io.izzel.taboolib.module.inject;
/**
* @Author sky
* @Since 2019-08-17 23:22
*/
public class TInjectHelper {
enum State {
PRE, POST, ACTIVE, CANCEL
}
public static String fromState(TInject inject, State state) {
switch (state) {
case PRE:
return inject.load();
case POST:
return inject.init();
case ACTIVE:
return inject.active();
default:
return inject.cancel();
}
}
}

View File

@@ -13,6 +13,7 @@ import io.izzel.taboolib.util.lite.cooldown.Cooldowns;
import org.bukkit.plugin.Plugin;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Map;
@@ -26,7 +27,7 @@ public class TInjectLoader implements TabooLibLoader.Loader {
static {
// Instance Inject
injectTypes.put(Plugin.class, (plugin, field, args, instance) -> {
injectTypes.put(Plugin.class, (plugin, field, args, pluginClass, instance) -> {
try {
field.set(instance, plugin);
} catch (Exception e) {
@@ -34,15 +35,15 @@ public class TInjectLoader implements TabooLibLoader.Loader {
}
});
// TLogger Inject
injectTypes.put(TLogger.class, (plugin, field, args, instance) -> {
injectTypes.put(TLogger.class, (plugin, field, args, pluginClass, instance) -> {
try {
field.set(instance, args.length == 0 ? TLogger.getUnformatted(plugin) : TLogger.getUnformatted(args[0]));
field.set(instance, args.value().length == 0 ? TLogger.getUnformatted(plugin) : TLogger.getUnformatted(args.value()[0]));
} catch (Exception e) {
e.printStackTrace();
}
});
// TPacketListener Inject
injectTypes.put(TPacketListener.class, (plugin, field, args, instance) -> {
injectTypes.put(TPacketListener.class, (plugin, field, args, pluginClass, instance) -> {
try {
TPacketHandler.addListener(plugin, ((TPacketListener) field.get(instance)));
} catch (Exception e) {
@@ -50,20 +51,35 @@ public class TInjectLoader implements TabooLibLoader.Loader {
}
});
// TConfiguration Inject
injectTypes.put(TConfig.class, (plugin, field, args, instance) -> {
injectTypes.put(TConfig.class, (plugin, field, args, pluginClass, instance) -> {
try {
field.set(instance, TConfig.create(plugin, args.length == 0 ? "config.yml" : args[0]));
TConfig config = TConfig.create(plugin, args.value().length == 0 ? "config.yml" : args.value()[0]);
if (!args.reload().isEmpty()) {
try {
Method declaredMethod = pluginClass.getDeclaredMethod(args.reload());
declaredMethod.setAccessible(true);
config.listener(() -> {
try {
declaredMethod.invoke(null);
} catch (Throwable t) {
t.printStackTrace();
}
});
TabooLibLoader.runTask(config::runListener);
} catch (Throwable t) {
t.printStackTrace();
}
}
field.set(instance, config);
} catch (Exception e) {
e.printStackTrace();
}
});
// SimpleCommandBuilder Inject
injectTypes.put(CommandBuilder.class, (plugin, field, args, instance) -> {
injectTypes.put(CommandBuilder.class, (plugin, field, args, pluginClass, instance) -> {
try {
CommandBuilder builder = (CommandBuilder) field.get(instance);
if (builder.isBuild()) {
TLogger.getGlobalLogger().error("Command was registered. (" + field.getType().getName() + ")");
} else {
if (!builder.isBuild()) {
if (builder.getPlugin() == null) {
builder.plugin(plugin);
}
@@ -74,12 +90,12 @@ public class TInjectLoader implements TabooLibLoader.Loader {
}
});
// CooldownPack Inject
injectTypes.put(Cooldown.class, (plugin, field, args, instance) -> {
try {
Cooldowns.register((Cooldown) field.get(instance), plugin);
} catch (Throwable t) {
t.printStackTrace();
}
injectTypes.put(Cooldown.class, (plugin, field, args, pluginClass, instance) -> {
try {
Cooldowns.register((Cooldown) field.get(instance), plugin);
} catch (Throwable t) {
t.printStackTrace();
}
});
}
@@ -107,7 +123,7 @@ public class TInjectLoader implements TabooLibLoader.Loader {
continue;
}
}
inject(plugin, declaredField, instance, annotation, injectTypes.get(Plugin.class));
inject(plugin, declaredField, instance, annotation, injectTypes.get(Plugin.class), pluginClass);
}
}
@@ -131,17 +147,17 @@ public class TInjectLoader implements TabooLibLoader.Loader {
}
TInjectTask tInjectTask = injectTypes.get(declaredField.getType());
if (tInjectTask != null) {
inject(plugin, declaredField, instance, annotation, tInjectTask);
} else {
inject(plugin, declaredField, instance, annotation, tInjectTask, pluginClass);
} else if (annotation.state() == TInject.State.NONE) {
TLogger.getGlobalLogger().error(declaredField.getName() + " is an invalid inject type. (" + pluginClass.getName() + ")");
}
}
}
public void inject(Plugin plugin, Field field, Object instance, TInject annotation, TInjectTask injectTask) {
public void inject(Plugin plugin, Field field, Object instance, TInject annotation, TInjectTask injectTask, Class pluginClass) {
try {
field.setAccessible(true);
injectTask.run(plugin, field, annotation.value(), instance);
injectTask.run(plugin, field, annotation, pluginClass, instance);
TabooLibAPI.debug(field.getName() + " injected. (" + field.getType().getName() + ")");
} catch (Throwable e) {
TLogger.getGlobalLogger().error(field.getName() + " inject failed: " + e.getMessage() + " (" + field.getType().getName() + ")");

View File

@@ -10,6 +10,6 @@ import java.lang.reflect.Field;
*/
public interface TInjectTask {
void run(Plugin plugin, Field field, String[] args, Object instance);
void run(Plugin plugin, Field field, TInject inject, Class pluginClass, Object instance);
}

View File

@@ -37,13 +37,13 @@ public class TScheduleLoader implements TabooLibLoader.Loader {
}
@Override
public void postLoad(Plugin plugin, Class<?> loadClass) {
for (Method method : loadClass.getDeclaredMethods()) {
public void postLoad(Plugin plugin, Class<?> pluginClass) {
for (Method method : pluginClass.getDeclaredMethods()) {
TSchedule annotation = method.getAnnotation(TSchedule.class);
if (annotation == null) {
continue;
}
Object instance = loadClass.equals(plugin.getClass()) ? plugin : null;
Object instance = pluginClass.equals(plugin.getClass()) ? plugin : null;
// 如果是非静态类型
if (!Modifier.isStatic(method.getModifiers()) && instance == null) {
// 是否为主类

View File

@@ -14,6 +14,7 @@ import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -27,6 +28,10 @@ public class TLocale {
throw new AssertionError();
}
static String[] toArray(Object... obj) {
return Arrays.stream(obj).map(String::valueOf).toArray(String[]::new);
}
static void sendTo(String path, CommandSender sender, String[] args, Class<?> callerClass) {
TLocaleLoader.sendTo(Ref.getCallerPlugin(callerClass), path, sender, args);
}
@@ -39,18 +44,40 @@ public class TLocale {
return TLocaleLoader.asStringList(Ref.getCallerPlugin(callerClass), path, args);
}
public static void sendTo(CommandSender sender, String path, Object... args) {
Ref.getCallerClass(3).ifPresent(clazz -> sendTo(path, sender, toArray(args), clazz));
}
public static void sendTo(CommandSender sender, String path, String... args) {
Ref.getCallerClass(3).ifPresent(clazz -> sendTo(path, sender, args, clazz));
}
public static void sendToConsole(String path, Object... args) {
Ref.getCallerClass(3).ifPresent(clazz -> sendTo(path, Bukkit.getConsoleSender(), toArray(args), clazz));
}
public static void sendToConsole(String path, String... args) {
Ref.getCallerClass(3).ifPresent(clazz -> sendTo(path, Bukkit.getConsoleSender(), args, clazz));
}
public static void broadcast(String path, Object... args) {
Ref.getCallerClass(3).ifPresent(clazz -> Bukkit.getOnlinePlayers().forEach(player -> sendTo(path, player, toArray(args), clazz)));
}
public static void broadcast(String path, String... args) {
Ref.getCallerClass(3).ifPresent(clazz -> Bukkit.getOnlinePlayers().forEach(player -> sendTo(path, player, args, clazz)));
}
public static String asString(String path, Object... args) {
try {
return asString(path, Ref.getCallerClass(3).orElse(TabooLib.class), toArray(args));
} catch (Exception e) {
TabooLib.getLogger().error(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("FETCH-LOCALE-ERROR"), path));
TabooLib.getLogger().error(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("LOCALE-ERROR-REASON"), e.getMessage()));
return "§4<" + path + "§4>";
}
}
public static String asString(String path, String... args) {
try {
return asString(path, Ref.getCallerClass(3).orElse(TabooLib.class), args);
@@ -61,10 +88,21 @@ public class TLocale {
}
}
public static List<String> asStringList(String path, Object... args) {
try {
return asStringList(path, Ref.getCallerClass(3).orElse(TabooLib.class), toArray(args));
} catch (Exception e) {
TabooLib.getLogger().error(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("FETCH-LOCALE-ERROR"), path));
TabooLib.getLogger().error(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("LOCALE-ERROR-REASON"), e.getMessage()));
return Collections.singletonList("§4<" + path + "§4>");
}
}
public static List<String> asStringList(String path, String... args) {
try {
return asStringList(path, Ref.getCallerClass(3).orElse(TabooLib.class), args);
} catch (Exception e) {
TabooLib.getLogger().error(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("FETCH-LOCALE-ERROR"), path));
TabooLib.getLogger().error(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("LOCALE-ERROR-REASON"), e.getMessage()));
return Collections.singletonList("§4<" + path + "§4>");
}