Taboolib 5.0 fully refactored & Not a plugin now.
This commit is contained in:
@@ -1,114 +0,0 @@
|
||||
package com.ilummc.tlib;
|
||||
|
||||
import com.ilummc.tlib.annotations.TConfig;
|
||||
import com.ilummc.tlib.bean.Property;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.lang.management.GarbageCollectorMXBean;
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.MemoryMXBean;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@TConfig(name = "cfg.yml", charset = "GBK")
|
||||
public class ExampleMain extends JavaPlugin {
|
||||
|
||||
private Property<Boolean> update = Property.of(false);
|
||||
|
||||
public static void main(String[] args) {
|
||||
MemoryMXBean bean = ManagementFactory.getMemoryMXBean();
|
||||
System.out.println(bean.getHeapMemoryUsage().toString());
|
||||
System.out.println(bean.getNonHeapMemoryUsage().toString());
|
||||
for (int i = 0; i < 10; i++) {
|
||||
for (GarbageCollectorMXBean mxBean : ManagementFactory.getGarbageCollectorMXBeans()) {
|
||||
System.out.println(mxBean.getName());
|
||||
System.out.println(mxBean.getCollectionCount());
|
||||
System.out.println(mxBean.getCollectionTime());
|
||||
for (String s : mxBean.getMemoryPoolNames()) {
|
||||
System.out.println(s);
|
||||
}
|
||||
System.out.println(mxBean.getObjectName().toString());
|
||||
}
|
||||
System.gc();
|
||||
}
|
||||
for (String s : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
update.addListener(((oldVal, newVal) -> {
|
||||
Bukkit.getLogger().info("配置项 enableUpdate 的值由 " + oldVal + " 变为了 " + newVal);
|
||||
if (newVal) {
|
||||
Updater.start();
|
||||
} else {
|
||||
Updater.stop();
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
private static class Updater {
|
||||
public static void start() {
|
||||
|
||||
}
|
||||
|
||||
public static void stop() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private static class CD {
|
||||
|
||||
final long start, period;
|
||||
final TimeUnit unit;
|
||||
final Runnable onStart, onFinish, onTimer;
|
||||
|
||||
CD(long start, long period, TimeUnit unit, Runnable onStart, Runnable onFinish, Runnable onTimer) {
|
||||
this.start = start;
|
||||
this.period = period;
|
||||
this.unit = unit;
|
||||
this.onStart = onStart;
|
||||
this.onFinish = onFinish;
|
||||
this.onTimer = onTimer;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
CD.builder().setOnStart(() -> {
|
||||
}).setOnFinish(() -> {
|
||||
}).setOnTimer(1000, TimeUnit.MILLISECONDS, () -> {
|
||||
}).build();
|
||||
}
|
||||
|
||||
public static CdBuilder builder() {
|
||||
return new CdBuilder();
|
||||
}
|
||||
|
||||
private static class CdBuilder {
|
||||
private long start, period;
|
||||
private TimeUnit unit;
|
||||
private Runnable onStart, onFinish, onTimer;
|
||||
|
||||
public CdBuilder setOnStart(Runnable runnable) {
|
||||
this.onStart = runnable;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CdBuilder setOnFinish(Runnable runnable) {
|
||||
this.onFinish = runnable;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CdBuilder setOnTimer(long period, TimeUnit timeUnit, Runnable runnable) {
|
||||
this.period = period;
|
||||
this.unit = timeUnit;
|
||||
this.onTimer = runnable;
|
||||
return this;
|
||||
}
|
||||
|
||||
public CD build() {
|
||||
return new CD(start, period, unit, onStart, onFinish, onTimer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,137 +0,0 @@
|
||||
package com.ilummc.tlib;
|
||||
|
||||
import com.ilummc.tlib.annotations.Dependency;
|
||||
import com.ilummc.tlib.compat.PlaceholderHook;
|
||||
import com.ilummc.tlib.config.TLibConfig;
|
||||
import com.ilummc.tlib.db.Pool;
|
||||
import com.ilummc.tlib.inject.TConfigWatcher;
|
||||
import com.ilummc.tlib.inject.TDependencyInjector;
|
||||
import com.ilummc.tlib.inject.TPluginManager;
|
||||
import com.ilummc.tlib.logger.TLogger;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import com.ilummc.tlib.resources.TLocaleLoader;
|
||||
import com.ilummc.tlib.util.IO;
|
||||
import me.skymc.taboolib.Main;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import me.skymc.taboolib.fileutils.FileUtils;
|
||||
import me.skymc.taboolib.plugin.PluginUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.InvalidConfigurationException;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Arrays;
|
||||
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "com.zaxxer:HikariCP:3.1.0")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "org.slf4j:slf4j-api:1.7.25")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "org.javalite:activejdbc:2.0")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "org.javalite:javalite-common:2.0")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "org.javalite:app-config:2.0")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "org.codehaus.jackson:jackson-mapper-asl:1.9.13")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "org.codehaus.jackson:jackson-core-asl:1.9.13")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "jaxen:jaxen:1.1.6")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "dom4j:dom4j:1.6.1")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "xml-apis:xml-apis:1.0.b2")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "org.ehcache:ehcache:3.5.2")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "com.h2database:h2:1.4.197")
|
||||
public class TLib {
|
||||
|
||||
private static TLib tLib;
|
||||
private static YamlConfiguration internalLanguage;
|
||||
private TLogger logger = new TLogger("§8[§3§lTabooLib§8][§r{1}§8] §f{2}", Main.getInst(), TLogger.FINE);
|
||||
private TLibConfig config;
|
||||
private TConfigWatcher configWatcher = new TConfigWatcher();
|
||||
private File libsFolder;
|
||||
|
||||
private TLib() {
|
||||
libsFolder = new File(Main.getInst().getDataFolder(), "/libs");
|
||||
if (!libsFolder.exists()) {
|
||||
libsFolder.mkdirs();
|
||||
}
|
||||
try {
|
||||
String yamlText = new String(IO.readFully(FileUtils.getResource("lang/internal.yml")), Charset.forName("utf-8"));
|
||||
internalLanguage = new YamlConfiguration();
|
||||
internalLanguage.loadFromString(yamlText);
|
||||
} catch (IOException | InvalidConfigurationException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
tLib = new TLib();
|
||||
|
||||
TLocaleLoader.init();
|
||||
PlaceholderHook.init();
|
||||
TLocaleLoader.load(Main.getInst(), false);
|
||||
}
|
||||
|
||||
public static void initPost() {
|
||||
TDependencyInjector.inject(Main.getInst(), TLib.getTLib());
|
||||
try {
|
||||
Pool.init();
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
public static void unload() {
|
||||
try {
|
||||
Pool.unload();
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
tLib.getConfigWatcher().unregisterAll();
|
||||
TDependencyInjector.eject(Main.getInst(), tLib);
|
||||
|
||||
}
|
||||
|
||||
public static void injectPluginManager() {
|
||||
if (!tLib.isInjectEnabled() || tLib.isBlackListPluginExists()) {
|
||||
TLocale.Logger.warn("TLIB.INJECTION-DISABLED");
|
||||
Arrays.stream(Bukkit.getPluginManager().getPlugins()).filter(plugin -> plugin != Main.getInst()).forEach(plugin -> TDependencyInjector.inject(plugin, plugin));
|
||||
return;
|
||||
}
|
||||
try {
|
||||
Field field = Bukkit.getServer().getClass().getDeclaredField("pluginManager");
|
||||
field.setAccessible(true);
|
||||
field.set(Bukkit.getServer(), new TPluginManager());
|
||||
TLocale.Logger.info("TLIB.INJECTION-SUCCESS");
|
||||
} catch (NoSuchFieldException | IllegalAccessException | IllegalArgumentException ignored) {
|
||||
TLocale.Logger.error("TLIB.INJECTION-FAILED");
|
||||
Arrays.stream(Bukkit.getPluginManager().getPlugins()).filter(plugin -> !TabooLib.isTabooLib(plugin)).forEach(plugin -> TDependencyInjector.inject(plugin, plugin));
|
||||
}
|
||||
}
|
||||
|
||||
public static TLib getTLib() {
|
||||
return tLib;
|
||||
}
|
||||
|
||||
public static YamlConfiguration getInternalLanguage() {
|
||||
return internalLanguage;
|
||||
}
|
||||
|
||||
public TLogger getLogger() {
|
||||
return logger;
|
||||
}
|
||||
|
||||
public TLibConfig getConfig() {
|
||||
return config;
|
||||
}
|
||||
|
||||
public TConfigWatcher getConfigWatcher() {
|
||||
return configWatcher;
|
||||
}
|
||||
|
||||
public File getLibsFolder() {
|
||||
return libsFolder;
|
||||
}
|
||||
|
||||
public boolean isInjectEnabled() {
|
||||
return Main.getInst().getConfig().getBoolean("PLUGIN-INJECTOR.ENABLE", true);
|
||||
}
|
||||
|
||||
public boolean isBlackListPluginExists() {
|
||||
return Main.getInst().getConfig().getStringList("PLUGIN-INJECTOR.DISABLE-ON-PLUGIN-EXISTS").stream().anyMatch(PluginUtils::isPluginExists);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package com.ilummc.tlib.annotations;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Target(ElementType.FIELD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface Logger {
|
||||
|
||||
String value() default "[{0}|{1}§f] {2}";
|
||||
|
||||
int level() default com.ilummc.tlib.logger.TLogger.INFO;
|
||||
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package com.ilummc.tlib.annotations;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Target(ElementType.FIELD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface PluginInstance {
|
||||
|
||||
String value();
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
package com.ilummc.tlib.annotations;
|
||||
|
||||
import com.ilummc.tlib.util.Ref;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface TConfig {
|
||||
|
||||
String name() default "config.yml";
|
||||
|
||||
boolean fromJar() default false;
|
||||
|
||||
boolean saveOnExit() default false;
|
||||
|
||||
boolean readOnly() default true;
|
||||
|
||||
String charset() default "UTF-8";
|
||||
|
||||
boolean listenChanges() default false;
|
||||
|
||||
int excludeModifiers() default Modifier.STATIC | Modifier.TRANSIENT | Ref.ACC_SYNTHETIC | Ref.ACC_BRIDGE;
|
||||
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.ilummc.tlib.annotations;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface TLocalePlugin {
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package com.ilummc.tlib.annotations.clr;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Repeatable(CommandHandlers.class)
|
||||
public @interface CommandHandler {
|
||||
|
||||
/**
|
||||
* Name of the command
|
||||
*
|
||||
* @return Name of the command
|
||||
*/
|
||||
String value();
|
||||
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package com.ilummc.tlib.annotations.clr;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface CommandHandlers {
|
||||
|
||||
CommandHandler[] value();
|
||||
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package com.ilummc.tlib.annotations.clr;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Target(ElementType.METHOD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface Sub {
|
||||
|
||||
String value();
|
||||
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.ilummc.tlib.annotations.db;
|
||||
|
||||
public @interface Database {
|
||||
|
||||
boolean sharedPool() default true;
|
||||
|
||||
int poolSize() default 8;
|
||||
|
||||
Class<?> configClass();
|
||||
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
package com.ilummc.tlib.annotations.db;
|
||||
|
||||
public @interface DatabasePassword {
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
package com.ilummc.tlib.annotations.db;
|
||||
|
||||
public @interface DatabaseType {
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
package com.ilummc.tlib.annotations.db;
|
||||
|
||||
public @interface DatabaseUrl {
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
package com.ilummc.tlib.annotations.db;
|
||||
|
||||
public @interface DatabaseUser {
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package com.ilummc.tlib.annotations.db;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface SQLTable {
|
||||
|
||||
String value();
|
||||
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
package com.ilummc.tlib.bean;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
public class Property<T> {
|
||||
|
||||
private Property(T value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
private List<BiConsumer<T, T>> consumers;
|
||||
|
||||
private T value;
|
||||
|
||||
public void set(T value) {
|
||||
if (value != this.value) {
|
||||
if (consumers != null) {
|
||||
for (BiConsumer<T, T> consumer : consumers) {
|
||||
consumer.accept(this.value, value);
|
||||
}
|
||||
}
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
|
||||
public T get() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void addListener(BiConsumer<T, T> consumer) {
|
||||
if (consumers == null) {
|
||||
consumers = new ArrayList<>();
|
||||
}
|
||||
consumers.add(consumer);
|
||||
}
|
||||
|
||||
public static <T> Property<T> of(T value) {
|
||||
return new Property<>(value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package com.ilummc.tlib.bean;
|
||||
|
||||
import com.google.gson.JsonDeserializationContext;
|
||||
import com.google.gson.JsonDeserializer;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParseException;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
public class PropertyTypeAdaptor implements JsonDeserializer<Property> {
|
||||
|
||||
@Override
|
||||
public Property deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
package com.ilummc.tlib.clr;
|
||||
|
||||
public class CommandLineResolver {
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
package com.ilummc.tlib.config;
|
||||
|
||||
import com.ilummc.tlib.annotations.TConfig;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author sky
|
||||
* @since 2018-04-22 14:31:11
|
||||
*/
|
||||
@TConfig(name = "tlib.yml")
|
||||
public class TLibConfig {
|
||||
|
||||
private String dataSourceClassName;
|
||||
|
||||
private String jdbcUrl = "jdbc:h2:file:~/plugins/TabooLib/h2";
|
||||
|
||||
private String driverClassName;
|
||||
|
||||
private String username = "";
|
||||
|
||||
private String password = "";
|
||||
|
||||
private int maximumPoolSize = 4;
|
||||
|
||||
private Map<String, Object> settings = new HashMap<String, Object>() {{
|
||||
put("cachePrepStmts", true);
|
||||
put("useServerPrepStmts", true);
|
||||
}};
|
||||
|
||||
public String getDataSourceClassName() {
|
||||
return dataSourceClassName;
|
||||
}
|
||||
|
||||
public String getJdbcUrl() {
|
||||
return jdbcUrl;
|
||||
}
|
||||
|
||||
public String getDriverClassName() {
|
||||
return driverClassName;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public int getMaximumPoolSize() {
|
||||
return maximumPoolSize;
|
||||
}
|
||||
|
||||
public Map<String, Object> getSettings() {
|
||||
return settings;
|
||||
}
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
package com.ilummc.tlib.db;
|
||||
|
||||
import com.ilummc.tlib.TLib;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import org.javalite.activejdbc.Base;
|
||||
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public final class Pool extends ThreadPoolExecutor {
|
||||
|
||||
private static final AtomicInteger number = new AtomicInteger(1);
|
||||
|
||||
private static final Pool singleton = new Pool();
|
||||
|
||||
private final TLibDataSource dataSource;
|
||||
|
||||
private Pool() {
|
||||
super(TLib.getTLib().getConfig().getMaximumPoolSize(),
|
||||
TLib.getTLib().getConfig().getMaximumPoolSize(),
|
||||
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
|
||||
try {
|
||||
dataSource = new TLibDataSource();
|
||||
this.setThreadFactory(r -> new Thread(() -> {
|
||||
Base.open(dataSource.getDataSource());
|
||||
r.run();
|
||||
}, "TabooLib-DbPool-" + number.getAndIncrement()));
|
||||
prestartAllCoreThreads();
|
||||
TLocale.sendToConsole("DATABASE.CONNECTION-ESTABLISHED", dataSource.getDataSource().getConnection().getMetaData().getDatabaseProductName(),
|
||||
String.valueOf(TLib.getTLib().getConfig().getMaximumPoolSize()));
|
||||
} catch (Exception e) {
|
||||
TLocale.sendToConsole("DATABASE.CONNECTION-ERROR", e.toString());
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
public static void run(Runnable runnable) {
|
||||
instance().execute(runnable);
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
|
||||
}
|
||||
|
||||
public static void unload() {
|
||||
instance().dataSource.disconnect();
|
||||
instance().shutdown();
|
||||
}
|
||||
|
||||
public static Pool instance() {
|
||||
return singleton;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void afterExecute(Runnable r, Throwable t) {
|
||||
if (t != null) {
|
||||
Base.close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
package com.ilummc.tlib.db;
|
||||
|
||||
import com.ilummc.tlib.TLib;
|
||||
import com.zaxxer.hikari.HikariConfig;
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import org.javalite.activejdbc.Base;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.util.Properties;
|
||||
|
||||
public class TLibDataSource {
|
||||
|
||||
private final HikariDataSource dataSource;
|
||||
|
||||
TLibDataSource() {
|
||||
Properties properties = new Properties();
|
||||
properties.put("jdbcUrl", TLib.getTLib().getConfig().getJdbcUrl());
|
||||
properties.put("username", TLib.getTLib().getConfig().getUsername());
|
||||
properties.put("password", TLib.getTLib().getConfig().getPassword());
|
||||
properties.put("dataSourceClassName", TLib.getTLib().getConfig().getDataSourceClassName());
|
||||
properties.put("driverClassName", TLib.getTLib().getConfig().getDriverClassName());
|
||||
TLib.getTLib().getConfig().getSettings().forEach((k, v) -> properties.put("dataSource." + k, v));
|
||||
dataSource = new HikariDataSource(new HikariConfig(properties));
|
||||
Base.open(dataSource);
|
||||
}
|
||||
|
||||
public DataSource getDataSource() {
|
||||
return dataSource;
|
||||
}
|
||||
|
||||
public void disconnect() {
|
||||
Base.close();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
package com.ilummc.tlib.dependency;
|
||||
|
||||
import com.ilummc.eagletdl.EagletTask;
|
||||
import com.ilummc.eagletdl.ProgressEvent;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import me.skymc.taboolib.Main;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public class TDependency {
|
||||
|
||||
// 阿里 http://maven.aliyun.com/nexus/content/groups/public
|
||||
// Maven Central
|
||||
public static final String MAVEN_REPO = "http://repo1.maven.org/maven2";
|
||||
|
||||
/**
|
||||
* 请求一个插件作为依赖,这个插件将会在所有已经添加的 Jenkins 仓库、Maven 仓库寻找
|
||||
* <p>
|
||||
* 阻塞线程进行下载/加载
|
||||
*
|
||||
* @param args 插件名称,下载地址(可选)
|
||||
* @return 是否成功加载了依赖
|
||||
*/
|
||||
public static boolean requestPlugin(String... args) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求一个库作为依赖,这个库将会在 Maven Central、oss.sonatype 以及自定义的 Maven 仓库寻找
|
||||
* <p>
|
||||
* 阻塞线程进行下载/加载
|
||||
*
|
||||
* @param type 依赖名,格式为 groupId:artifactId:version
|
||||
* @return 是否成功加载库,如果加载成功,插件将可以任意调用使用的类
|
||||
*/
|
||||
public static boolean requestLib(String type, String repo, String url) {
|
||||
if (type.matches(".*:.*:.*")) {
|
||||
String[] arr = type.split(":");
|
||||
File file = new File(Main.getInst().getDataFolder(), "/libs/" + String.join("-", arr) + ".jar");
|
||||
if (file.exists()) {
|
||||
TDependencyLoader.addToPath(Main.getInst(), file);
|
||||
return true;
|
||||
} else {
|
||||
if (downloadMaven(repo, arr[0], arr[1], arr[2], file, url)) {
|
||||
TDependencyLoader.addToPath(Main.getInst(), file);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean downloadMaven(String url, String groupId, String artifactId, String version, File target, String dl) {
|
||||
if (Main.isOfflineVersion()) {
|
||||
TLocale.Logger.warn("DEPENDENCY.DOWNLOAD-OFFLINE");
|
||||
return false;
|
||||
}
|
||||
AtomicBoolean failed = new AtomicBoolean(false);
|
||||
String link = dl.length() == 0 ? url + "/" + groupId.replace('.', '/') + "/" + artifactId + "/" + version + "/" + artifactId + "-" + version + ".jar" : dl;
|
||||
new EagletTask()
|
||||
.url(link)
|
||||
.file(target)
|
||||
.setThreads(1)
|
||||
.setOnError(event -> event.getException().printStackTrace())
|
||||
.setOnConnected(event -> TLocale.Logger.info("DEPENDENCY.DOWNLOAD-CONNECTED", String.join(":", new String[] {groupId, artifactId, version}), ProgressEvent.format(event.getContentLength())))
|
||||
.setOnProgress(event -> TLocale.Logger.info("DEPENDENCY.DOWNLOAD-PROGRESS", event.getSpeedFormatted(), event.getPercentageFormatted()))
|
||||
.setOnComplete(event -> {
|
||||
if (event.isSuccess()) {
|
||||
TLocale.Logger.info("DEPENDENCY.DOWNLOAD-SUCCESS", String.join(":", new String[] {groupId, artifactId, version}));
|
||||
} else {
|
||||
failed.set(true);
|
||||
TLocale.Logger.error("DEPENDENCY.DOWNLOAD-FAILED", String.join(":", new String[] {groupId, artifactId, version}), link, target.getName());
|
||||
}
|
||||
}).start().waitUntil();
|
||||
return !failed.get();
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
package com.ilummc.tlib.dependency;
|
||||
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
|
||||
public class TDependencyLoader {
|
||||
|
||||
public static synchronized void addToPath(Plugin plugin, URL url) {
|
||||
try {
|
||||
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
|
||||
method.setAccessible(true);
|
||||
method.invoke(plugin.getClass().getClassLoader(), url);
|
||||
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static synchronized void addToPath(Plugin plugin, File file) {
|
||||
try {
|
||||
addToPath(plugin, file.toURI().toURL());
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
package com.ilummc.tlib.filter;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.ilummc.tlib.filter.impl.FilterConfiguration;
|
||||
import com.ilummc.tlib.filter.impl.FilterInvalidPluginLoader;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Filter;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* @author Bkm016
|
||||
* @since 2018-04-22
|
||||
*/
|
||||
public class TLoggerFilter implements Filter {
|
||||
|
||||
private Filter filter;
|
||||
private Logger logger;
|
||||
private static List<TLoggerFilterHandler> handlers = Lists.newLinkedList();
|
||||
private static Map<String, TLoggerFilter> pluginFilter = Maps.newHashMap();
|
||||
private static TLoggerFilter globalFilter;
|
||||
private static String playerConnectionName;
|
||||
|
||||
static {
|
||||
handlers.add(new FilterConfiguration());
|
||||
handlers.add(new FilterInvalidPluginLoader());
|
||||
// handlers.add(new FilterExceptionMirror());
|
||||
}
|
||||
|
||||
public static void preInit() {
|
||||
inject(new TLoggerFilter(), Bukkit.getLogger());
|
||||
inject(new TLoggerFilter(), TabooLib.instance().getLogger());
|
||||
try {
|
||||
playerConnectionName = Class.forName("net.minecraft.server." + TabooLib.getVersion() + ".PlayerConnection").getName();
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
public static void postInit() {
|
||||
Arrays.stream(Bukkit.getPluginManager().getPlugins()).filter(TabooLib::isDependTabooLib).forEach(plugin -> inject(new TLoggerFilter(), plugin.getLogger()));
|
||||
}
|
||||
|
||||
public static void inject0() {
|
||||
inject(new TLoggerFilter(), Logger.getLogger(playerConnectionName));
|
||||
}
|
||||
|
||||
public static void inject(TLoggerFilter filter, Logger logger) {
|
||||
if (!(logger.getFilter() instanceof TLoggerFilter)) {
|
||||
try {
|
||||
filter.filter = logger.getFilter();
|
||||
filter.logger = logger;
|
||||
logger.setFilter(filter);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void eject(Plugin plugin) {
|
||||
try {
|
||||
if (plugin.getLogger().getFilter() instanceof TLoggerFilter) {
|
||||
((TLoggerFilter) plugin.getLogger().getFilter()).filter = null;
|
||||
((TLoggerFilter) plugin.getLogger().getFilter()).logger = null;
|
||||
plugin.getLogger().setFilter(null);
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static TLoggerFilter getGlobalFilter() {
|
||||
return globalFilter;
|
||||
}
|
||||
|
||||
public static Map<String, TLoggerFilter> getPluginFilter() {
|
||||
return pluginFilter;
|
||||
}
|
||||
|
||||
public static List<TLoggerFilterHandler> getHandlers() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public Filter getFilter() {
|
||||
return filter;
|
||||
}
|
||||
|
||||
public Logger getLogger() {
|
||||
return logger;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLoggable(LogRecord e) {
|
||||
return handlers.stream().allMatch(filter -> filter.isLoggable(e)) && (filter == null || filter.isLoggable(e));
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package com.ilummc.tlib.filter;
|
||||
|
||||
import java.util.logging.LogRecord;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2018-11-29 11:42
|
||||
*/
|
||||
public abstract class TLoggerFilterHandler {
|
||||
|
||||
abstract public boolean isLoggable(LogRecord e);
|
||||
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
package com.ilummc.tlib.filter.impl;
|
||||
|
||||
import com.ilummc.tlib.filter.TLoggerFilterHandler;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.logging.LogRecord;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2018-11-29 11:47
|
||||
*/
|
||||
public class FilterConfiguration extends TLoggerFilterHandler {
|
||||
|
||||
@Override
|
||||
public boolean isLoggable(LogRecord e) {
|
||||
if (String.valueOf(e.getMessage()).contains("Cannot load configuration from stream")) {
|
||||
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
|
||||
for (StackTraceElement element : elements) {
|
||||
if (element.getClassName().contains("ConfigUtils")) {
|
||||
// Bukkit 拦截异常?我再扔一个
|
||||
System.out.println(Arrays.asList(e.getParameters()));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,119 +0,0 @@
|
||||
package com.ilummc.tlib.filter.impl;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.ilummc.tlib.filter.TLoggerFilterHandler;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import me.skymc.taboolib.Main;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import org.bukkit.command.CommandException;
|
||||
import org.bukkit.event.EventException;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2018-11-29 11:42
|
||||
*/
|
||||
public class FilterExceptionMirror extends TLoggerFilterHandler {
|
||||
|
||||
interface ArgumentsCallback {
|
||||
|
||||
String[] run();
|
||||
}
|
||||
|
||||
private static Pattern patternEvent = Pattern.compile("Could not pass event (.+?) to (.+?)");
|
||||
private static Pattern patternCommand = Pattern.compile("Unhandled exception executing command '(.+?)' in plugin (.+?)");
|
||||
|
||||
/**
|
||||
* 判断是否为调度器异常
|
||||
*/
|
||||
public boolean isScheduleException(LogRecord log) {
|
||||
return String.valueOf(log.getMessage()).contains("generated an exception");
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否为可捕捉异常
|
||||
*/
|
||||
public boolean isValidException(Throwable throwable) {
|
||||
return throwable.getCause() != null && throwable.getCause().getStackTrace() != null && throwable.getCause().getStackTrace().length > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 向控制台打印捕捉到的异常
|
||||
*
|
||||
* @param stackTraceElements 堆栈
|
||||
* @param message 信息类型
|
||||
* @param args 信息参数
|
||||
* @return 是否成功捕捉并打印
|
||||
*/
|
||||
public boolean printException(AtomicReference<Plugin> plugin, StackTraceElement[] stackTraceElements, String message, ArgumentsCallback args) {
|
||||
Set<Plugin> plugins = Sets.newHashSet();
|
||||
List<StackTraceElement> stackTraces = Lists.newLinkedList();
|
||||
for (StackTraceElement stack : stackTraceElements) {
|
||||
try {
|
||||
plugins.add(JavaPlugin.getProvidingPlugin(Class.forName(stack.getClassName())));
|
||||
stackTraces.add(stack);
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
if (!plugins.isEmpty() && plugins.stream().allMatch(p -> TabooLib.isTabooLib(p) || TabooLib.isDependTabooLib(p))) {
|
||||
plugin.set(plugins.iterator().next());
|
||||
TLocale.Logger.error("TFILTER.EXCEPTION-MIRROR." + message + ".HEAD", args.run());
|
||||
for (int i = 0; i < stackTraces.size(); i++) {
|
||||
StackTraceElement stack = stackTraces.get(i);
|
||||
TLocale.Logger.error("TFILTER.EXCEPTION-MIRROR." + message + ".STACK-TRACE", String.valueOf(i), stack.toString());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLoggable(LogRecord e) {
|
||||
if (!Main.getInst().getConfig().getBoolean("EXCEPTION-MIRROR", true) || e.getThrown() == null) {
|
||||
return true;
|
||||
}
|
||||
// 是否为调度器异常
|
||||
if (isScheduleException(e)) {
|
||||
long time = System.currentTimeMillis();
|
||||
AtomicReference<Plugin> plugin = new AtomicReference<>();
|
||||
return !printException(plugin, e.getThrown().getStackTrace(), "SCHEDULE", () -> new String[] {plugin.get().getName(), String.valueOf(System.currentTimeMillis() - time), e.getThrown().getClass().getSimpleName(), String.valueOf(e.getThrown().getMessage())});
|
||||
}
|
||||
// 是否为其他可捕捉异常
|
||||
else if (isValidException(e.getThrown())) {
|
||||
// 事件异常
|
||||
if (e.getThrown() instanceof EventException) {
|
||||
Matcher matcher = patternEvent.matcher(e.getMessage());
|
||||
if (matcher.find()) {
|
||||
long time = System.currentTimeMillis();
|
||||
AtomicReference<Plugin> plugin = new AtomicReference<>();
|
||||
return !printException(plugin, e.getThrown().getCause().getStackTrace(), "EVENT", () -> new String[] {plugin.get().getName(), String.valueOf(System.currentTimeMillis() - time), matcher.group(1), e.getThrown().getCause().getClass().getSimpleName(), String.valueOf(e.getThrown().getCause().getMessage())});
|
||||
}
|
||||
}
|
||||
// 命令异常
|
||||
else if (e.getThrown() instanceof CommandException) {
|
||||
Matcher matcher = patternCommand.matcher(e.getThrown().getMessage());
|
||||
if (matcher.find()) {
|
||||
long time = System.currentTimeMillis();
|
||||
AtomicReference<Plugin> plugin = new AtomicReference<>();
|
||||
return !printException(plugin, e.getThrown().getCause().getStackTrace(), "COMMAND", () -> new String[] {plugin.get().getName(), String.valueOf(System.currentTimeMillis() - time), matcher.group(1), e.getThrown().getCause().getClass().getSimpleName(), String.valueOf(e.getThrown().getCause().getMessage())});
|
||||
}
|
||||
}
|
||||
// 其他异常
|
||||
else {
|
||||
long time = System.currentTimeMillis();
|
||||
AtomicReference<Plugin> plugin = new AtomicReference<>();
|
||||
return !printException(plugin, e.getThrown().getCause().getStackTrace(), "OTHER", () -> new String[] {plugin.get().getName(), String.valueOf(System.currentTimeMillis() - time), e.getThrown().getCause().getClass().getSimpleName(), String.valueOf(e.getThrown().getCause().getMessage())});
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package com.ilummc.tlib.filter.impl;
|
||||
|
||||
import com.ilummc.tlib.filter.TLoggerFilterHandler;
|
||||
|
||||
import java.util.logging.LogRecord;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2018-11-29 11:47
|
||||
*/
|
||||
public class FilterInvalidPluginLoader extends TLoggerFilterHandler {
|
||||
|
||||
@Override
|
||||
public boolean isLoggable(LogRecord e) {
|
||||
// 屏蔽插件加载器注入导致的警告信息
|
||||
return !String.valueOf(e.getMessage()).contains("Enabled plugin with unregistered PluginClassLoader");
|
||||
}
|
||||
}
|
||||
@@ -1,143 +0,0 @@
|
||||
package com.ilummc.tlib.inject;
|
||||
|
||||
import com.google.common.io.Files;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.ilummc.tlib.annotations.TConfig;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import me.skymc.taboolib.fileutils.ConfigUtils;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.yaml.snakeyaml.DumperOptions;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class TConfigInjector {
|
||||
|
||||
public static void fixUnicode(YamlConfiguration configuration) {
|
||||
try {
|
||||
Field field = YamlConfiguration.class.getDeclaredField("yamlOptions");
|
||||
field.setAccessible(true);
|
||||
field.set(configuration, NoUnicodeDumperOption.INSTANCE);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static final class NoUnicodeDumperOption extends DumperOptions {
|
||||
|
||||
private static final NoUnicodeDumperOption INSTANCE = new NoUnicodeDumperOption();
|
||||
|
||||
@Override
|
||||
public void setAllowUnicode(boolean allowUnicode) {
|
||||
super.setAllowUnicode(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAllowUnicode() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLineBreak(LineBreak lineBreak) {
|
||||
super.setLineBreak(LineBreak.getPlatformLineBreak());
|
||||
}
|
||||
}
|
||||
|
||||
public static Object loadConfig(Plugin plugin, Class<?> clazz) {
|
||||
try {
|
||||
TConfig config = clazz.getAnnotation(TConfig.class);
|
||||
Validate.notNull(config);
|
||||
File file = new File(plugin.getDataFolder(), config.name());
|
||||
if (!file.exists()) {
|
||||
if (config.fromJar()) {
|
||||
plugin.saveResource(config.name(), true);
|
||||
} else {
|
||||
saveConfig(plugin, clazz.newInstance());
|
||||
}
|
||||
}
|
||||
Object obj = unserialize(plugin, clazz);
|
||||
if (config.readOnly()) {
|
||||
saveConfig(plugin, obj);
|
||||
}
|
||||
return obj;
|
||||
} catch (NullPointerException e) {
|
||||
TLocale.Logger.warn("CONFIG.LOAD-FAIL-NO-ANNOTATION", plugin.toString(), clazz.getSimpleName());
|
||||
} catch (Exception e) {
|
||||
TLocale.Logger.warn("CONFIG.LOAD-FAIL", plugin.toString(), clazz.getSimpleName());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void reloadConfig(Plugin plugin, Object object) {
|
||||
try {
|
||||
TConfig config = object.getClass().getAnnotation(TConfig.class);
|
||||
Validate.notNull(config);
|
||||
File file = new File(plugin.getDataFolder(), config.name());
|
||||
Map<String, Object> map = ConfigUtils.confToMap(ConfigUtils.loadYaml(plugin, file));
|
||||
Object obj = ConfigUtils.mapToObj(map, object);
|
||||
if (config.readOnly()) {
|
||||
saveConfig(plugin, obj);
|
||||
}
|
||||
} catch (NullPointerException e) {
|
||||
TLocale.Logger.warn("CONFIG.LOAD-FAIL-NO-ANNOTATION", plugin.toString(), object.getClass().getSimpleName());
|
||||
} catch (Exception e) {
|
||||
TLocale.Logger.warn("CONFIG.LOAD-FAIL", plugin.toString(), object.getClass().getSimpleName());
|
||||
}
|
||||
}
|
||||
|
||||
public static Object unserialize(Plugin plugin, Class<?> clazz) {
|
||||
try {
|
||||
TConfig config = clazz.getAnnotation(TConfig.class);
|
||||
Validate.notNull(config);
|
||||
return ConfigUtils.confToObj(
|
||||
ConfigUtils.mapToConf(
|
||||
ConfigUtils.yamlToMap(
|
||||
Files.toString(new File(plugin.getDataFolder(), config.name()), Charset.forName(config.charset())))), clazz);
|
||||
} catch (NullPointerException e) {
|
||||
TLocale.Logger.warn("CONFIG.LOAD-FAIL-NO-FILE", plugin.toString(), clazz.getSimpleName());
|
||||
return null;
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
return clazz.newInstance();
|
||||
} catch (InstantiationException | IllegalAccessException e1) {
|
||||
TLocale.Logger.warn("CONFIG.LOAD-FAIL", plugin.toString(), clazz.getSimpleName());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static Map<String, Object> serialize(Plugin plugin, Object object) {
|
||||
try {
|
||||
TConfig config = object.getClass().getAnnotation(TConfig.class);
|
||||
Validate.notNull(config);
|
||||
return ConfigUtils.objToMap(ConfigUtils.objToConf(object).getValues(false), config.excludeModifiers());
|
||||
} catch (NullPointerException e) {
|
||||
TLocale.Logger.warn("CONFIG.SAVE-FAIL-NO-ANNOTATION", plugin.toString(), object.getClass().getSimpleName());
|
||||
} catch (Exception e) {
|
||||
TLocale.Logger.warn("CONFIG.SAVE-FAIL", plugin.toString(), object.getClass().getSimpleName());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void saveConfig(Plugin plugin, Object object) throws IOException, NullPointerException {
|
||||
TConfig config = object.getClass().getAnnotation(TConfig.class);
|
||||
Validate.notNull(config);
|
||||
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
|
||||
Map map = gson.fromJson(gson.toJson(object), HashMap.class);
|
||||
YamlConfiguration configuration = (YamlConfiguration) ConfigUtils.mapToConf(map);
|
||||
File target = new File(plugin.getDataFolder(), config.name());
|
||||
if (!target.exists()) {
|
||||
target.createNewFile();
|
||||
}
|
||||
byte[] arr = configuration.saveToString().getBytes(config.charset());
|
||||
Files.write(arr, target);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,188 +0,0 @@
|
||||
package com.ilummc.tlib.inject;
|
||||
|
||||
import com.ilummc.tlib.TLib;
|
||||
import com.ilummc.tlib.annotations.*;
|
||||
import com.ilummc.tlib.dependency.TDependency;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import com.ilummc.tlib.resources.TLocaleLoader;
|
||||
import com.ilummc.tlib.util.Ref;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Izzel_Aliz
|
||||
*/
|
||||
public class TDependencyInjector {
|
||||
|
||||
private static List<String> injected = new ArrayList<>();
|
||||
|
||||
static void injectOnEnable(Plugin plugin) {
|
||||
inject(plugin, plugin);
|
||||
}
|
||||
|
||||
static void ejectOnDisable(Plugin plugin) {
|
||||
eject(plugin, plugin);
|
||||
}
|
||||
|
||||
public static boolean injected(Plugin plugin) {
|
||||
return injected.contains(plugin.getName());
|
||||
}
|
||||
|
||||
public static void inject(Plugin plugin, Object o) {
|
||||
if (!injected.contains(plugin.getName())) {
|
||||
injected.add(plugin.getName());
|
||||
TLocaleLoader.load(plugin, true);
|
||||
injectDependencies(plugin, o);
|
||||
injectLogger(plugin, o);
|
||||
injectConfig(plugin, o);
|
||||
injectPluginInstance(plugin, o);
|
||||
}
|
||||
}
|
||||
|
||||
public static void eject(Plugin plugin, Object o) {
|
||||
try {
|
||||
injected.remove(plugin.getName());
|
||||
ejectConfig(plugin, o);
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
public static Dependency[] getDependencies(Object o) {
|
||||
Dependency[] dependencies = new Dependency[0];
|
||||
Dependencies d = o.getClass().getAnnotation(Dependencies.class);
|
||||
if (d != null) {
|
||||
dependencies = d.value();
|
||||
}
|
||||
Dependency d2 = o.getClass().getAnnotation(Dependency.class);
|
||||
if (d2 != null) {
|
||||
dependencies = new Dependency[] {d2};
|
||||
}
|
||||
return dependencies;
|
||||
}
|
||||
|
||||
private static void ejectConfig(Plugin plugin, Object o) {
|
||||
for (Field field : Ref.getDeclaredFields(o.getClass())) {
|
||||
TConfig config;
|
||||
if ((config = field.getType().getAnnotation(TConfig.class)) != null && config.saveOnExit()) {
|
||||
try {
|
||||
field.setAccessible(true);
|
||||
TConfigInjector.saveConfig(plugin, field.get(o));
|
||||
TLocale.Logger.info("CONFIG.SAVE-SUCCESS", plugin.toString(), config.name());
|
||||
} catch (Exception e) {
|
||||
TLocale.Logger.warn("CONFIG.SAVE-FAIL", plugin.toString(), config.name());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void injectConfig(Plugin plugin, Object o) {
|
||||
for (Field field : Ref.getDeclaredFields(o.getClass())) {
|
||||
try {
|
||||
TConfig config;
|
||||
if ((config = field.getType().getAnnotation(TConfig.class)) != null) {
|
||||
field.setAccessible(true);
|
||||
Object obj = TConfigInjector.loadConfig(plugin, field.getType());
|
||||
if (obj != null) {
|
||||
TLocale.Logger.info("CONFIG.LOAD-SUCCESS", plugin.toString(), config.name());
|
||||
field.set(o, obj);
|
||||
if (config.listenChanges()) {
|
||||
TLocale.Logger.info("CONFIG.LISTEN-START", plugin.toString(), config.name());
|
||||
TLib.getTLib().getConfigWatcher().addOnListen(
|
||||
new File(plugin.getDataFolder(), config.name()),
|
||||
obj,
|
||||
object -> {
|
||||
try {
|
||||
TConfigInjector.reloadConfig(plugin, object);
|
||||
TLocale.Logger.info("CONFIG.RELOAD-SUCCESS", plugin.toString(), config.name());
|
||||
} catch (Exception ignored) {
|
||||
TLocale.Logger.warn("CONFIG.RELOAD-FAIL", plugin.toString(), config.name());
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void injectLogger(Plugin plugin, Object o) {
|
||||
for (Field field : Ref.getDeclaredFields(o.getClass())) {
|
||||
try {
|
||||
Logger logger;
|
||||
if ((logger = field.getAnnotation(Logger.class)) != null) {
|
||||
field.getType().asSubclass(com.ilummc.tlib.logger.TLogger.class);
|
||||
com.ilummc.tlib.logger.TLogger tLogger = new com.ilummc.tlib.logger.TLogger(logger.value(), plugin, logger.level());
|
||||
if (!field.isAccessible()) {
|
||||
field.setAccessible(true);
|
||||
}
|
||||
field.set(o, tLogger);
|
||||
TLoggerManager.setDefaultLogger(plugin, tLogger);
|
||||
}
|
||||
} catch (Exception ignored2) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void injectPluginInstance(Plugin plugin, Object o) {
|
||||
for (Field field : Ref.getDeclaredFields(o.getClass())) {
|
||||
try {
|
||||
PluginInstance instance;
|
||||
if ((instance = field.getAnnotation(PluginInstance.class)) != null) {
|
||||
if (!field.isAccessible()) {
|
||||
field.setAccessible(true);
|
||||
}
|
||||
field.getType().asSubclass(JavaPlugin.class);
|
||||
Plugin pl;
|
||||
if ((pl = Bukkit.getPluginManager().getPlugin(instance.value())) == null) {
|
||||
if (!TDependency.requestPlugin(instance.value())) {
|
||||
TLocale.Logger.warn("PLUGIN-AUTOLOAD-FAIL", plugin.getName(), instance.value());
|
||||
return;
|
||||
} else {
|
||||
pl = Bukkit.getPluginManager().getPlugin(instance.value());
|
||||
}
|
||||
}
|
||||
if (pl != null) {
|
||||
field.set(o, pl);
|
||||
}
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void injectDependencies(Plugin plugin, Object o) {
|
||||
Dependency[] dependencies = getDependencies(o);
|
||||
if (dependencies.length != 0) {
|
||||
TLocale.Logger.info("DEPENDENCY.LOADING-START", plugin.getName());
|
||||
for (Dependency dependency : dependencies) {
|
||||
if (dependency.type() == Dependency.Type.PLUGIN) {
|
||||
if (TDependency.requestPlugin(dependency.plugin())) {
|
||||
TabooLib.debug(" Loaded " + dependency.plugin() + " (" + plugin.getName() + ")");
|
||||
// TLocale.Logger.info("DEPENDENCY.PLUGIN-LOAD-SUCCESS", plugin.getName(), dependency.plugin());
|
||||
} else {
|
||||
TLocale.Logger.warn("DEPENDENCY.PLUGIN-LOAD-FAIL", plugin.getName(), dependency.plugin());
|
||||
}
|
||||
}
|
||||
if (dependency.type() == Dependency.Type.LIBRARY) {
|
||||
if (TDependency.requestLib(dependency.maven(), dependency.mavenRepo(), dependency.url())) {
|
||||
TabooLib.debug(" Loaded " + String.join(":", dependency.maven()) + " (" + plugin.getName() + ")");
|
||||
// TLocale.Logger.info("DEPENDENCY.LIBRARY-LOAD-SUCCESS", plugin.getName(), String.join(":", dependency.maven()));
|
||||
} else {
|
||||
TLocale.Logger.warn("DEPENDENCY.LIBRARY-LOAD-FAIL", plugin.getName(), String.join(":", dependency.maven()));
|
||||
}
|
||||
}
|
||||
}
|
||||
TLocale.Logger.info("DEPENDENCY.LOAD-COMPLETE");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,231 +0,0 @@
|
||||
package com.ilummc.tlib.inject;
|
||||
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import me.skymc.taboolib.Main;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.command.SimpleCommandMap;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.permissions.Permissible;
|
||||
import org.bukkit.permissions.Permission;
|
||||
import org.bukkit.plugin.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class TPluginManager implements PluginManager {
|
||||
|
||||
private static TPluginManager singleton;
|
||||
private final PluginManager instance;
|
||||
private final Main main = (Main) Main.getInst();
|
||||
private static File updateDirectory = null;
|
||||
private Server server;
|
||||
private Map<Pattern, PluginLoader> fileAssociations = new HashMap<>();
|
||||
private List<Plugin> plugins = new ArrayList<>();
|
||||
private Map<String, Plugin> lookupNames = new HashMap<>();
|
||||
private SimpleCommandMap commandMap;
|
||||
private Map<String, Permission> permissions = new HashMap<>();
|
||||
private Map<Boolean, Set<Permission>> defaultPerms = new LinkedHashMap<>();
|
||||
private Map<String, Map<Permissible, Boolean>> permSubs = new HashMap<>();
|
||||
private Map<Boolean, Map<Permissible, Boolean>> defSubs = new HashMap<>();
|
||||
private boolean useTimings = false;
|
||||
private List<Plugin> delayedDisable = new ArrayList<>();
|
||||
|
||||
public static void delayDisable(Plugin plugin) {
|
||||
if (!singleton.delayedDisable.contains(plugin)) {
|
||||
singleton.delayedDisable.add(plugin);
|
||||
}
|
||||
}
|
||||
|
||||
public TPluginManager() {
|
||||
instance = Bukkit.getPluginManager();
|
||||
// clone all Field in SimplePluginManager
|
||||
cloneField("updateDirectory");
|
||||
cloneField("server");
|
||||
cloneField("fileAssociations");
|
||||
cloneField("plugins");
|
||||
cloneField("lookupNames");
|
||||
cloneField("commandMap");
|
||||
cloneField("permissions");
|
||||
cloneField("defaultPerms");
|
||||
cloneField("permSubs");
|
||||
cloneField("defSubs");
|
||||
cloneField("useTimings");
|
||||
singleton = this;
|
||||
}
|
||||
|
||||
private void cloneField(String bukkitName) {
|
||||
try {
|
||||
Field bukkitField = instance.getClass().getDeclaredField(bukkitName);
|
||||
Field thisFiled = this.getClass().getDeclaredField(bukkitName);
|
||||
if (bukkitField == null || thisFiled == null) {
|
||||
TLocale.Logger.warn("MISC.FIELD-COPY-FAILED", bukkitName);
|
||||
return;
|
||||
}
|
||||
bukkitField.setAccessible(true);
|
||||
thisFiled.setAccessible(true);
|
||||
thisFiled.set(this, bukkitField.get(instance));
|
||||
} catch (Exception e) {
|
||||
TLocale.Logger.error("MISC.FIELD-COPY-ERROR", bukkitName, e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerInterface(Class<? extends PluginLoader> aClass) throws IllegalArgumentException {
|
||||
instance.registerInterface(aClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Plugin getPlugin(String s) {
|
||||
return instance.getPlugin(s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Plugin[] getPlugins() {
|
||||
return instance.getPlugins();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPluginEnabled(String s) {
|
||||
return instance.isPluginEnabled(s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPluginEnabled(Plugin plugin) {
|
||||
return instance.isPluginEnabled(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Plugin loadPlugin(File file) throws InvalidPluginException, InvalidDescriptionException, UnknownDependencyException {
|
||||
return instance.loadPlugin(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Plugin[] loadPlugins(File file) {
|
||||
return instance.loadPlugins(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disablePlugins() {
|
||||
for (Plugin plugin : getPlugins()) {
|
||||
if (plugin != main && !delayedDisable.contains(plugin)) {
|
||||
disablePlugin(plugin);
|
||||
}
|
||||
}
|
||||
Collections.reverse(delayedDisable);
|
||||
delayedDisable.forEach(singleton::disablePlugin);
|
||||
disablePlugin(main);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearPlugins() {
|
||||
instance.clearPlugins();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void callEvent(Event event) throws IllegalStateException {
|
||||
instance.callEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerEvents(Listener listener, Plugin plugin) {
|
||||
instance.registerEvents(listener, plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerEvent(Class<? extends Event> aClass, Listener listener, EventPriority eventPriority, EventExecutor eventExecutor, Plugin plugin) {
|
||||
instance.registerEvent(aClass, listener, eventPriority, eventExecutor, plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerEvent(Class<? extends Event> aClass, Listener listener, EventPriority eventPriority, EventExecutor eventExecutor, Plugin plugin, boolean b) {
|
||||
instance.registerEvent(aClass, listener, eventPriority, eventExecutor, plugin, b);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enablePlugin(Plugin plugin) {
|
||||
TDependencyInjector.injectOnEnable(plugin);
|
||||
instance.enablePlugin(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disablePlugin(Plugin plugin) {
|
||||
TDependencyInjector.ejectOnDisable(plugin);
|
||||
instance.disablePlugin(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Permission getPermission(String s) {
|
||||
return instance.getPermission(s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addPermission(Permission permission) {
|
||||
instance.addPermission(permission);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removePermission(Permission permission) {
|
||||
instance.removePermission(permission);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removePermission(String s) {
|
||||
instance.removePermission(s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Permission> getDefaultPermissions(boolean b) {
|
||||
return instance.getDefaultPermissions(b);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void recalculatePermissionDefaults(Permission permission) {
|
||||
instance.recalculatePermissionDefaults(permission);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void subscribeToPermission(String s, Permissible permissible) {
|
||||
instance.subscribeToPermission(s, permissible);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unsubscribeFromPermission(String s, Permissible permissible) {
|
||||
instance.unsubscribeFromPermission(s, permissible);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Permissible> getPermissionSubscriptions(String s) {
|
||||
return instance.getPermissionSubscriptions(s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void subscribeToDefaultPerms(boolean b, Permissible permissible) {
|
||||
instance.subscribeToDefaultPerms(b, permissible);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unsubscribeFromDefaultPerms(boolean b, Permissible permissible) {
|
||||
instance.unsubscribeFromDefaultPerms(b, permissible);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Permissible> getDefaultPermSubscriptions(boolean b) {
|
||||
return instance.getDefaultPermSubscriptions(b);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Permission> getPermissions() {
|
||||
return instance.getPermissions();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useTimings() {
|
||||
return instance.useTimings();
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
package com.ilummc.tlib.nms;
|
||||
|
||||
import com.ilummc.tlib.util.asm.AsmClassTransformer;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public abstract class ActionBar {
|
||||
|
||||
private static ActionBar instance;
|
||||
|
||||
static {
|
||||
if (TabooLib.getVerint() > 11100) {
|
||||
instance = (ActionBar) AsmClassTransformer.builder().from(Impl_1_12.class).fromVersion("v1_12_R1")
|
||||
.toVersion(Bukkit.getServer().getClass().getName().split("\\.")[3]).build().transform();
|
||||
} else {
|
||||
instance = (ActionBar) AsmClassTransformer.builder().from(Impl_1_8.class).fromVersion("v1_8_R3")
|
||||
.toVersion(Bukkit.getServer().getClass().getName().split("\\.")[3]).build().transform();
|
||||
}
|
||||
}
|
||||
|
||||
public static void sendActionBar(Player player, String text) {
|
||||
instance.send(player, text);
|
||||
}
|
||||
|
||||
public abstract void send(Player player, String text);
|
||||
|
||||
public static class Impl_1_8 extends ActionBar {
|
||||
|
||||
@Override
|
||||
public void send(Player player, String text) {
|
||||
net.minecraft.server.v1_8_R3.ChatComponentText component = new net.minecraft.server.v1_8_R3.ChatComponentText(text);
|
||||
net.minecraft.server.v1_8_R3.PacketPlayOutChat packet = new net.minecraft.server.v1_8_R3.PacketPlayOutChat(component, (byte) 2);
|
||||
((org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
|
||||
public static class Impl_1_12 extends ActionBar {
|
||||
|
||||
@Override
|
||||
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.PacketPlayOutChat packet = new net.minecraft.server.v1_12_R1.PacketPlayOutChat(component, net.minecraft.server.v1_12_R1.ChatMessageType.a((byte) 2));
|
||||
((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,169 +0,0 @@
|
||||
package com.ilummc.tlib.resources;
|
||||
|
||||
import com.ilummc.tlib.TLib;
|
||||
import com.ilummc.tlib.annotations.TLocalePlugin;
|
||||
import com.ilummc.tlib.logger.TLogger;
|
||||
import com.ilummc.tlib.resources.type.*;
|
||||
import com.ilummc.tlib.util.IO;
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import me.skymc.taboocode.TabooCodeLang;
|
||||
import me.skymc.taboolib.Main;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import me.skymc.taboolib.fileutils.ConfigUtils;
|
||||
import me.skymc.taboolib.fileutils.FileUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.configuration.serialization.ConfigurationSerialization;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class TLocaleLoader {
|
||||
|
||||
private static final Map<String, TLocaleInstance> map = new ConcurrentHashMap<>();
|
||||
|
||||
public static void init() {
|
||||
ConfigurationSerialization.registerClass(TLocaleText.class, "TEXT");
|
||||
ConfigurationSerialization.registerClass(TLocaleJson.class, "JSON");
|
||||
ConfigurationSerialization.registerClass(TLocaleBook.class, "BOOK");
|
||||
ConfigurationSerialization.registerClass(TLocaleSound.class, "SOUND");
|
||||
ConfigurationSerialization.registerClass(TLocaleTitle.class, "TITLE");
|
||||
ConfigurationSerialization.registerClass(TLocaleBossBar.class, "BAR");
|
||||
ConfigurationSerialization.registerClass(TLocaleActionBar.class, "ACTION");
|
||||
}
|
||||
|
||||
public static void sendTo(Plugin plugin, String path, CommandSender sender, String... args) {
|
||||
TabooLib.debug(plugin, "TLocaleLoader.sendTo: " + plugin + ", path: " + path + ", sender: " + sender + ", args: " + Arrays.asList(args));
|
||||
if (Bukkit.isPrimaryThread()) {
|
||||
Optional.ofNullable(map.get(plugin.getName())).ifPresent(localeInstance -> localeInstance.sendTo(path, sender, args));
|
||||
} else {
|
||||
synchronized (TLocaleLoader.class) {
|
||||
Optional.ofNullable(map.get(plugin.getName())).ifPresent(localeInstance -> localeInstance.sendTo(path, sender, args));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static String asString(Plugin plugin, String path, String... args) {
|
||||
TabooLib.debug(plugin, "TLocaleLoader.asString: " + plugin.getName() + ", path: " + path + ", args: " + Arrays.asList(args));
|
||||
TLocaleInstance tLocaleInstance = map.get(plugin.getName());
|
||||
if (tLocaleInstance != null) {
|
||||
return tLocaleInstance.asString(path, args);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public static List<String> asStringList(Plugin plugin, String path, String... args) {
|
||||
TabooLib.debug(plugin, "TLocaleLoader.asStringList: " + plugin + ", path: " + path + ", args: " + Arrays.asList(args));
|
||||
TLocaleInstance tLocaleInstance = map.get(plugin.getName());
|
||||
if (tLocaleInstance != null) {
|
||||
return tLocaleInstance.asStringList(path, args);
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 载入语言文件
|
||||
*
|
||||
* @param plugin 载入插件
|
||||
* @param isCover 是否覆盖
|
||||
*/
|
||||
public static void load(Plugin plugin, boolean isCover) {
|
||||
try {
|
||||
if (isLoadLocale(plugin, isCover)) {
|
||||
// 获取文件
|
||||
File localeFile = getLocaleFile(plugin);
|
||||
if (localeFile == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 加载文件
|
||||
infoLogger("TRY-LOADING-LANG", plugin.getName(), localeFile.getName());
|
||||
YamlConfiguration localeConfiguration = ConfigUtils.loadYaml(plugin, localeFile);
|
||||
YamlConfiguration localeConfigurationAtStream = getLocaleAtStream(plugin, localeFile);
|
||||
|
||||
// 载入配置
|
||||
loadPluginLocale(plugin, localeFile, localeConfiguration, localeConfigurationAtStream);
|
||||
|
||||
// 注册监听
|
||||
TLib.getTLib().getConfigWatcher().removeListener(localeFile);
|
||||
TLib.getTLib().getConfigWatcher().addListener(localeFile, null, obj -> {
|
||||
infoLogger("RELOADING-LANG", plugin.getName());
|
||||
loadPluginLocale(plugin, localeFile, ConfigUtils.loadYaml(plugin, localeFile), getLocaleAtStream(plugin, localeFile));
|
||||
});
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorLogger("ERROR-LOADING-LANG", plugin.getName(), e.toString() + "\n" + e.getStackTrace()[0].toString());
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isLocaleLoaded(Plugin plugin) {
|
||||
return map.containsKey(plugin.getName());
|
||||
}
|
||||
|
||||
public static boolean isDependWithTabooLib(Plugin plugin) {
|
||||
return plugin.getClass().getAnnotation(TLocalePlugin.class) != null || plugin.getDescription().getDepend().contains(Main.getInst().getName()) || plugin.getDescription().getSoftDepend().contains(Main.getInst().getName());
|
||||
}
|
||||
|
||||
public static List<String> getLocalePriority() {
|
||||
return Main.getInst().getConfig().contains("LOCALE.PRIORITY") ? Main.getInst().getConfig().getStringList("LOCALE.PRIORITY") : Collections.singletonList("zh_CN");
|
||||
}
|
||||
|
||||
private static boolean isLoadLocale(Plugin plugin, boolean isCover) {
|
||||
return (isCover || !isLocaleLoaded(plugin)) && (plugin.equals(Main.getInst()) || isDependWithTabooLib(plugin));
|
||||
}
|
||||
|
||||
private static void infoLogger(String path, String... args) {
|
||||
TLogger.getGlobalLogger().info(Strings.replaceWithOrder(TLib.getInternalLanguage().getString(path), args));
|
||||
}
|
||||
|
||||
private static void errorLogger(String path, String... args) {
|
||||
TLogger.getGlobalLogger().error(Strings.replaceWithOrder(TLib.getInternalLanguage().getString(path), args));
|
||||
}
|
||||
|
||||
private static File getLocaleFile(Plugin plugin) {
|
||||
releaseLocales(plugin);
|
||||
return getLocalePriority().stream().map(localeName -> new File(plugin.getDataFolder(), "lang/" + localeName + ".yml")).filter(File::exists).findFirst().orElse(null);
|
||||
}
|
||||
|
||||
private static void releaseLocales(Plugin plugin) {
|
||||
getLocalePriority().stream().filter(localeName -> !new File(plugin.getDataFolder(), "lang/" + localeName + ".yml").exists() && plugin.getResource("lang/" + localeName + ".yml") != null).forEach(localeName -> plugin.saveResource("lang/" + localeName + ".yml", true));
|
||||
}
|
||||
|
||||
private static TLocaleInstance getLocaleInstance(Plugin plugin) {
|
||||
TLocaleInstance instance = new TLocaleInstance(plugin);
|
||||
map.put(plugin.getName(), instance);
|
||||
return instance;
|
||||
}
|
||||
|
||||
private static YamlConfiguration getLocaleAtStream(Plugin plugin, File localeFile) {
|
||||
InputStream localeInputSteam = FileUtils.getResource(plugin, "lang/" + localeFile.getName());
|
||||
try {
|
||||
String yamlText = new String(IO.readFully(localeInputSteam), Charset.forName("utf-8"));
|
||||
YamlConfiguration yaml = new YamlConfiguration();
|
||||
yaml.loadFromString(yamlText);
|
||||
return yaml;
|
||||
} catch (Exception ignored) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static void loadPluginLocale(Plugin plugin, File localeFile, YamlConfiguration localeConfiguration, YamlConfiguration localeConfigurationAtStream) {
|
||||
TLocaleInstance localeInstance = getLocaleInstance(plugin);
|
||||
if (localeConfigurationAtStream != null) {
|
||||
localeInstance.load(localeConfigurationAtStream);
|
||||
}
|
||||
localeInstance.load(localeConfiguration);
|
||||
if (localeInstance.getLatestUpdateNodes().get() <= 0) {
|
||||
infoLogger("SUCCESS-LOADING-LANG-NORMAL", plugin.getName(), localeFile.getName().split("\\.")[0], String.valueOf(localeInstance.size()));
|
||||
} else {
|
||||
infoLogger("SUCCESS-LOADING-LANG-UPDATE", plugin.getName(), localeFile.getName().split("\\.")[0], String.valueOf(localeInstance.size()), String.valueOf(localeInstance.getLatestUpdateNodes().get()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
package com.ilummc.tlib.resources;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author sky
|
||||
* @Since 2018-05-12 13:58
|
||||
*/
|
||||
public interface TLocaleSender {
|
||||
|
||||
/**
|
||||
* 发送信息
|
||||
*
|
||||
* @param sender 发送目标
|
||||
* @param args 参数
|
||||
*/
|
||||
void sendTo(CommandSender sender, String... args);
|
||||
|
||||
/**
|
||||
* 获取文本
|
||||
*
|
||||
* @param args 参数
|
||||
* @return 文本
|
||||
*/
|
||||
String asString(String... args);
|
||||
|
||||
/**
|
||||
* 获取文本集合
|
||||
*
|
||||
* @param args 参数
|
||||
* @return 文本集合
|
||||
*/
|
||||
List<String> asStringList(String... args);
|
||||
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package com.ilummc.tlib.util;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public class IO {
|
||||
|
||||
public static byte[] readFully(InputStream inputStream) throws IOException {
|
||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||
byte[] buf = new byte[1024];
|
||||
int len = 0;
|
||||
while ((len = inputStream.read(buf)) > 0) {
|
||||
stream.write(buf, 0, len);
|
||||
}
|
||||
return stream.toByteArray();
|
||||
}
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
package com.ilummc.tlib.util;
|
||||
|
||||
public class Strings {
|
||||
|
||||
public static boolean isBlank(String var) {
|
||||
return var == null || var.trim().isEmpty();
|
||||
}
|
||||
|
||||
public static boolean isEmpty(CharSequence var) {
|
||||
return var == null || var.length() == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 优化过的 String#replace,比默认快了大概 5 倍
|
||||
*
|
||||
* @param template 模板替换文件
|
||||
* @param args 替换的参数
|
||||
* @return 替换好的字符串
|
||||
*/
|
||||
public static String replaceWithOrder(String template, Object... args) {
|
||||
if (args.length == 0 || template.length() == 0) {
|
||||
return template;
|
||||
}
|
||||
char[] arr = template.toCharArray();
|
||||
StringBuilder stringBuilder = new StringBuilder(template.length());
|
||||
for (int i = 0; i < arr.length; i++) {
|
||||
if (arr[i] == '{' && Character.isDigit(arr[Math.min(i + 1, arr.length - 1)])
|
||||
&& arr[Math.min(i + 1, arr.length - 1)] - '0' < args.length
|
||||
&& arr[Math.min(i + 2, arr.length - 1)] == '}') {
|
||||
stringBuilder.append(args[arr[i + 1] - '0']);
|
||||
i += 2;
|
||||
} else {
|
||||
stringBuilder.append(arr[i]);
|
||||
}
|
||||
}
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
// *********************************
|
||||
//
|
||||
// Deprecated
|
||||
//
|
||||
// *********************************
|
||||
|
||||
public static String replaceWithOrder(String template, String... args) {
|
||||
return replaceWithOrder(template, (Object[]) args);
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package com.ilummc.tlibscala.runtime
|
||||
|
||||
import me.skymc.taboolib.Main
|
||||
import me.skymc.taboolib.economy.EcoUtils
|
||||
import me.skymc.taboolib.inventory.builder.ItemBuilder
|
||||
import org.bukkit.OfflinePlayer
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
class RichOfflinePlayer(private val offlinePlayer: OfflinePlayer) {
|
||||
|
||||
def getSkullItem: ItemStack = new ItemBuilder(offlinePlayer).build()
|
||||
|
||||
def getMoney: Double = EcoUtils.get(offlinePlayer)
|
||||
|
||||
def withdraw(x: Double): Boolean = Main.getEconomy.withdrawPlayer(offlinePlayer, x).transactionSuccess
|
||||
|
||||
def deposit(x: Double): Boolean = Main.getEconomy.depositPlayer(offlinePlayer, x).transactionSuccess
|
||||
|
||||
def hasMoney(x: Double): Boolean = Main.getEconomy.has(offlinePlayer, x)
|
||||
|
||||
}
|
||||
|
||||
|
||||
object RichOfflinePlayer {
|
||||
|
||||
implicit def player2rich(player: OfflinePlayer): RichOfflinePlayer = new RichOfflinePlayer(player)
|
||||
|
||||
implicit def rich2player(player: RichOfflinePlayer): OfflinePlayer = player.offlinePlayer
|
||||
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
package com.ilummc.tlibscala.runtime
|
||||
|
||||
import com.ilummc.tlib.resources.TLocale
|
||||
import me.skymc.taboolib.anvil.AnvilContainerAPI
|
||||
import me.skymc.taboolib.display.{ActionUtils, TitleUtils}
|
||||
import me.skymc.taboolib.permission.PermissionUtils
|
||||
import me.skymc.taboolib.player.PlayerUtils
|
||||
import me.skymc.taboolib.scoreboard.ScoreboardUtil
|
||||
import me.skymc.taboolib.sign.SignUtils
|
||||
import org.bukkit.block.Block
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
import scala.collection.JavaConverters._
|
||||
|
||||
class RichPlayer(private val player: Player) extends RichOfflinePlayer(player) {
|
||||
|
||||
def sendActionBar(x: String): Unit = ActionUtils.send(player, x)
|
||||
|
||||
def getFishTicks: Int = PlayerUtils.getFishingTicks(PlayerUtils.getPlayerHookedFish(player))
|
||||
|
||||
def setFishTicks(x: Int): Unit = PlayerUtils.setFishingTicks(PlayerUtils.getPlayerHookedFish(player), x)
|
||||
|
||||
def resetData(): Unit = PlayerUtils.resetData(player, false)
|
||||
|
||||
def resetData(scoreboard: Boolean): Unit = PlayerUtils.resetData(player, scoreboard)
|
||||
|
||||
def displaySidebar(title: String, elements: Map[String, Integer]): Unit = ScoreboardUtil.rankedSidebarDisplay(player, title, mapAsJavaMap(elements))
|
||||
|
||||
def displaySidebarUnranked(title: String, elements: Array[String]): Unit = ScoreboardUtil.unrankedSidebarDisplay(player, elements: _*)
|
||||
|
||||
def displaySidebarUnranked(title: String, elements: List[String]): Unit = ScoreboardUtil.unrankedSidebarDisplay(player, elements: _*)
|
||||
|
||||
def displaySidebarUnranked(title: String, elements: String*): Unit = ScoreboardUtil.unrankedSidebarDisplay(player, elements: _*)
|
||||
|
||||
def openSign(block: Block): Unit = SignUtils.openSign(player, block)
|
||||
|
||||
def openSign(lines: Array[String], id: String): Unit = SignUtils.openSign(player, lines, id)
|
||||
|
||||
//todo TagDataHandler
|
||||
|
||||
def addPermission(perm: String): Unit = PermissionUtils.addPermission(player, perm)
|
||||
|
||||
def removePermission(perm: String): Unit = PermissionUtils.removePermission(player, perm)
|
||||
|
||||
def sendTitle(title: String, subtitle: String, fadein: Int, stay: Int, fadeout: Int): Unit = TitleUtils.sendTitle(player, title, subtitle, fadein, stay, fadeout)
|
||||
|
||||
def sendTitle(p: Player, title: String, fadeint: Int, stayt: Int, fadeoutt: Int, subtitle: String, fadeinst: Int, stayst: Int, fadeoutst: Int): Unit = TitleUtils.sendTitle(p, title, fadeint, stayt, fadeoutt, subtitle, fadeinst, stayst, fadeoutst)
|
||||
|
||||
def openAnvil(): Unit = AnvilContainerAPI.openAnvil(player)
|
||||
|
||||
def sendLocalizedMessage(node: String, params: String*): Unit = TLocale.sendTo(player, node, params: _*)
|
||||
|
||||
def locale(node: String, params: String*): Unit = sendLocalizedMessage(node, params: _*)
|
||||
|
||||
def <<(text: String): RichPlayer = {
|
||||
player.sendMessage(text)
|
||||
this
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
object RichPlayer {
|
||||
|
||||
implicit def player2rich(player: Player): RichPlayer = new RichPlayer(player)
|
||||
|
||||
implicit def rich2player(player: RichPlayer): Player = player.player
|
||||
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
package me.skymc.taboolib.bstats;
|
||||
package io.izzel.taboolib;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.ServicePriority;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
@@ -55,7 +55,7 @@ public class Metrics {
|
||||
}
|
||||
|
||||
// The plugin
|
||||
private final JavaPlugin plugin;
|
||||
private final Plugin plugin;
|
||||
|
||||
// A list with all custom charts
|
||||
private final List<CustomChart> charts = new ArrayList<>();
|
||||
@@ -65,7 +65,7 @@ public class Metrics {
|
||||
*
|
||||
* @param plugin The plugin which stats should be submitted.
|
||||
*/
|
||||
public Metrics(JavaPlugin plugin) {
|
||||
public Metrics(Plugin plugin) {
|
||||
if (plugin == null) {
|
||||
throw new IllegalArgumentException("Plugin cannot be null!");
|
||||
}
|
||||
@@ -78,27 +78,17 @@ public class Metrics {
|
||||
|
||||
// Check if the config file exists
|
||||
if (!config.isSet("serverUuid")) {
|
||||
|
||||
// Add default values
|
||||
config.addDefault("enabled", true);
|
||||
// Every server gets it's unique random id.
|
||||
config.addDefault("serverUuid", UUID.randomUUID().toString());
|
||||
// Should failed request be logged?
|
||||
config.addDefault("logFailedRequests", false);
|
||||
|
||||
// Inform the server owners about bStats
|
||||
config.options().header(
|
||||
"bStats collects some data for plugin authors like how many servers are using their plugins.\n" +
|
||||
"To honor their work, you should not disable it.\n" +
|
||||
"This has nearly no effect on the server performance!\n" +
|
||||
"Check out https://bStats.org/ to learn more :)"
|
||||
).copyDefaults(true);
|
||||
try {
|
||||
config.save(configFile);
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
// Load the data
|
||||
serverUUID = config.getString("serverUuid");
|
||||
logFailedRequests = config.getBoolean("logFailedRequests", false);
|
||||
109
src/main/scala/io/izzel/taboolib/PluginLoader.java
Normal file
109
src/main/scala/io/izzel/taboolib/PluginLoader.java
Normal file
@@ -0,0 +1,109 @@
|
||||
package io.izzel.taboolib;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
import io.izzel.taboolib.locale.TLocaleLoader;
|
||||
import io.izzel.taboolib.module.command.TCommandHandler;
|
||||
import io.izzel.taboolib.module.config.TConfig;
|
||||
import io.izzel.taboolib.module.config.TConfigWatcher;
|
||||
import io.izzel.taboolib.module.dependency.TDependencyInjector;
|
||||
import io.izzel.taboolib.module.inject.TListenerHandler;
|
||||
import io.izzel.taboolib.module.mysql.IHost;
|
||||
import io.izzel.taboolib.module.mysql.hikari.HikariHandler;
|
||||
import io.izzel.taboolib.origin.database.PluginDataManager;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2019-07-05 15:14
|
||||
*/
|
||||
public abstract class PluginLoader {
|
||||
|
||||
private static List<PluginLoader> registerLoader = Lists.newArrayList();
|
||||
private static Set<String> plugins = Sets.newHashSet();
|
||||
|
||||
static {
|
||||
registerLoader.add(new PluginLoader() {
|
||||
|
||||
@Override
|
||||
public void onLoading(Plugin plugin) {
|
||||
// 加载语言文件
|
||||
TLocaleLoader.load(plugin, false);
|
||||
// 注入依赖
|
||||
TDependencyInjector.inject(plugin, plugin.getClass());
|
||||
// 读取插件类
|
||||
TabooLibLoader.setupClasses(plugin);
|
||||
// 加载插件类
|
||||
TabooLibLoader.getPluginClassSafely(plugin).forEach(c -> TabooLibLoader.preLoadClass(plugin, c));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStarting(Plugin plugin) {
|
||||
// 加载监听器
|
||||
TListenerHandler.setupListener(plugin);
|
||||
// 加载插件类
|
||||
TabooLibLoader.getPluginClassSafely(plugin).forEach(c -> TabooLibLoader.postLoadClass(plugin, c));
|
||||
// 注册插件命令
|
||||
TCommandHandler.registerCommand(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivated(Plugin plugin) {
|
||||
// 注册监听器
|
||||
TListenerHandler.registerListener(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopping(Plugin plugin) {
|
||||
// 注销监听器
|
||||
TListenerHandler.cancelListener(plugin);
|
||||
// 储存插件数据
|
||||
PluginDataManager.saveAllCaches(plugin, true);
|
||||
// 注销数据库连接
|
||||
Sets.newHashSet(HikariHandler.getDataSource().keySet()).stream().filter(IHost::isAutoClose).forEach(HikariHandler::closeDataSource);
|
||||
// 释放文检动态读取
|
||||
Optional.ofNullable(TConfig.getFiles().remove(plugin.getName())).ifPresent(files -> files.forEach(file -> TConfigWatcher.getInst().removeListener(file)));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void onLoading(Plugin plugin) {
|
||||
}
|
||||
|
||||
public void onStarting(Plugin plugin) {
|
||||
}
|
||||
|
||||
public void onActivated(Plugin plugin) {
|
||||
}
|
||||
|
||||
public void onStopping(Plugin plugin) {
|
||||
}
|
||||
|
||||
public static void addPlugin(Plugin plugin) {
|
||||
plugins.add(plugin.getName());
|
||||
}
|
||||
|
||||
public static void load(Plugin plugin) {
|
||||
registerLoader.forEach(loader -> loader.onLoading(plugin));
|
||||
}
|
||||
|
||||
public static void start(Plugin plugin) {
|
||||
registerLoader.forEach(loader -> loader.onStarting(plugin));
|
||||
}
|
||||
|
||||
public static void active(Plugin plugin) {
|
||||
registerLoader.forEach(loader -> loader.onActivated(plugin));
|
||||
}
|
||||
|
||||
public static void stop(Plugin plugin) {
|
||||
registerLoader.forEach(loader -> loader.onStopping(plugin));
|
||||
}
|
||||
|
||||
public static boolean isPlugin(Plugin plugin) {
|
||||
return plugins.contains(plugin.getName());
|
||||
}
|
||||
}
|
||||
137
src/main/scala/io/izzel/taboolib/TabooLib.java
Normal file
137
src/main/scala/io/izzel/taboolib/TabooLib.java
Normal file
@@ -0,0 +1,137 @@
|
||||
package io.izzel.taboolib;
|
||||
|
||||
import io.izzel.taboolib.locale.TLocaleLoader;
|
||||
import io.izzel.taboolib.module.config.TConfig;
|
||||
import io.izzel.taboolib.module.config.TConfigWatcher;
|
||||
import io.izzel.taboolib.module.dependency.Dependency;
|
||||
import io.izzel.taboolib.module.logger.TLogger;
|
||||
import io.izzel.taboolib.module.mysql.hikari.HikariHandler;
|
||||
import io.izzel.taboolib.module.nms.NMSHandler;
|
||||
import io.izzel.taboolib.origin.database.PlayerDataManager;
|
||||
import io.izzel.taboolib.origin.database.PluginDataManager;
|
||||
import io.izzel.taboolib.plugin.InternalPlugin;
|
||||
import io.izzel.taboolib.util.Files;
|
||||
import io.izzel.taboolib.util.IO;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.util.NumberConversions;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2019-07-05 10:39
|
||||
* <p>
|
||||
* 注意与 TabooLib4.x 版本的兼容
|
||||
* 可能存在同时运行的情况
|
||||
*/
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "org.slf4j:slf4j-api:1.7.25", url = "https://skymc.oss-cn-shanghai.aliyuncs.com/libs/org.slf4j-slf4j-api-1.7.25.jar")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "com.zaxxer:HikariCP:3.1.0", url = "https://skymc.oss-cn-shanghai.aliyuncs.com/libs/com.zaxxer-HikariCP-3.1.0.jar")
|
||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "org.scala-lang:scala-library:2.12.8", url = "https://skymc.oss-cn-shanghai.aliyuncs.com/libs/scala-library-2.12.8.jar")
|
||||
public class TabooLib {
|
||||
|
||||
private static TabooLib inst = new TabooLib();
|
||||
private static TLogger logger;
|
||||
private static TConfig config;
|
||||
private static double version;
|
||||
|
||||
// 第三方依赖下载位置
|
||||
private File libsFolder;
|
||||
private File playerDataFolder;
|
||||
private File serverDataFolder;
|
||||
|
||||
// 内部语言文件
|
||||
private YamlConfiguration internal = new YamlConfiguration();
|
||||
|
||||
public TabooLib() {
|
||||
// 创建配置
|
||||
inst = this;
|
||||
logger = TLogger.getUnformatted("TabooLib");
|
||||
config = TConfig.create(getPlugin(), "config.yml");
|
||||
libsFolder = Files.folder("plugins/TabooLib/libs");
|
||||
playerDataFolder = Files.folder(config.getString("DATAURL.PLAYER-DATA"));
|
||||
serverDataFolder = Files.folder(config.getString("DATAURL.SERVER-DATA"));
|
||||
// 加载版本号
|
||||
try {
|
||||
version = NumberConversions.toDouble(IO.readFully(Files.getResource("version"), Charset.forName("utf-8")));
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
// 加载内部语言文件
|
||||
try {
|
||||
internal.loadFromString(IO.readFully(Files.getResource("lang/internal.yml"), Charset.forName("utf-8")));
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
// 加载 TabooLib 语言文件
|
||||
TLocaleLoader.load(getPlugin(), false);
|
||||
// 加载 TabooLib
|
||||
TabooLibLoader.init();
|
||||
// 创建 TabooLib 插件数据
|
||||
PluginDataManager.addPluginData("TabooLib", null);
|
||||
PluginDataManager.addPluginData("TabooLibrary", null);
|
||||
// 创建线程检测服务器是否关闭
|
||||
Executors.newSingleThreadExecutor().submit(() -> {
|
||||
while (NMSHandler.getHandler().isRunning()) {
|
||||
}
|
||||
// 关闭连接池
|
||||
HikariHandler.closeDataSourceForce();
|
||||
// 保存数据
|
||||
PlayerDataManager.saveAllPlayers(false, true);
|
||||
PluginDataManager.saveAllCaches();
|
||||
// 插件关闭
|
||||
PluginLoader.stop(getPlugin());
|
||||
// 清理数据
|
||||
if (config.getBoolean("DELETE-DATA")) {
|
||||
Files.deepDelete(getPlayerDataFolder());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
TConfigWatcher.getInst().unregisterAll();
|
||||
}
|
||||
|
||||
public static InternalPlugin getPlugin() {
|
||||
return InternalPlugin.getPlugin();
|
||||
}
|
||||
|
||||
// *********************************
|
||||
//
|
||||
// Getter and Setter
|
||||
//
|
||||
// *********************************
|
||||
|
||||
public static TabooLib getInst() {
|
||||
return inst;
|
||||
}
|
||||
|
||||
public static TLogger getLogger() {
|
||||
return logger;
|
||||
}
|
||||
|
||||
public static TConfig getConfig() {
|
||||
return config;
|
||||
}
|
||||
|
||||
public static double getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public File getLibsFolder() {
|
||||
return libsFolder;
|
||||
}
|
||||
|
||||
public File getPlayerDataFolder() {
|
||||
return playerDataFolder;
|
||||
}
|
||||
|
||||
public File getServerDataFolder() {
|
||||
return serverDataFolder;
|
||||
}
|
||||
|
||||
public YamlConfiguration getInternal() {
|
||||
return internal;
|
||||
}
|
||||
}
|
||||
91
src/main/scala/io/izzel/taboolib/TabooLibAPI.java
Normal file
91
src/main/scala/io/izzel/taboolib/TabooLibAPI.java
Normal file
@@ -0,0 +1,91 @@
|
||||
package io.izzel.taboolib;
|
||||
|
||||
import io.izzel.taboolib.module.nms.NMSHandler;
|
||||
import io.izzel.taboolib.origin.database.PluginDataManager;
|
||||
import io.izzel.taboolib.util.Strings;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.server.ServerCommandEvent;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2019-07-05 14:31
|
||||
*/
|
||||
public class TabooLibAPI {
|
||||
|
||||
private static boolean bukkit;
|
||||
private static boolean originLoaded;
|
||||
|
||||
static {
|
||||
try {
|
||||
// 判断是否基于 Bukkit 运行
|
||||
bukkit = Class.forName("org.bukkit.Bukkit") != null;
|
||||
// 获取 TabooLib4.x 版本是否载入
|
||||
originLoaded = Bukkit.getPluginManager().getPlugin("TabooLib") != null;
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isBukkit() {
|
||||
return bukkit;
|
||||
}
|
||||
|
||||
public static boolean isOriginLoaded() {
|
||||
return originLoaded;
|
||||
}
|
||||
|
||||
public static boolean isDependTabooLib(Plugin plugin) {
|
||||
return PluginLoader.isPlugin(plugin);
|
||||
}
|
||||
|
||||
public static double[] getTPS() {
|
||||
return NMSHandler.getHandler().getTPS();
|
||||
}
|
||||
|
||||
public static boolean isDebug() {
|
||||
return PluginDataManager.getPluginData("TabooLibrary", TabooLib.getPlugin()).getBoolean("debug");
|
||||
}
|
||||
|
||||
public static void setDebug(boolean debug) {
|
||||
PluginDataManager.getPluginData("TabooLibrary", TabooLib.getPlugin()).set("debug", debug);
|
||||
}
|
||||
|
||||
public static void debug(String... args) {
|
||||
debug(TabooLib.getPlugin(), args);
|
||||
}
|
||||
|
||||
public static void debug(Plugin plugin, String... args) {
|
||||
if (!isDebug()) {
|
||||
return;
|
||||
}
|
||||
for (String line : args) {
|
||||
Bukkit.getConsoleSender().sendMessage("§4[" + plugin.getName() + "][DEBUG] §c" + line);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean dispatchCommand(CommandSender sender, String command) {
|
||||
try {
|
||||
if ((sender instanceof Player)) {
|
||||
PlayerCommandPreprocessEvent e = new PlayerCommandPreprocessEvent((Player) sender, "/" + command);
|
||||
Bukkit.getPluginManager().callEvent(e);
|
||||
if (e.isCancelled() || Strings.isBlank(e.getMessage()) || !e.getMessage().startsWith("/")) {
|
||||
return false;
|
||||
}
|
||||
return Bukkit.dispatchCommand(e.getPlayer(), e.getMessage().substring(1));
|
||||
} else {
|
||||
ServerCommandEvent e = new ServerCommandEvent(sender, command);
|
||||
Bukkit.getPluginManager().callEvent(e);
|
||||
if (e.isCancelled() || Strings.isBlank(e.getCommand())) {
|
||||
return false;
|
||||
}
|
||||
return Bukkit.dispatchCommand(e.getSender(), e.getCommand());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
159
src/main/scala/io/izzel/taboolib/TabooLibLoader.java
Normal file
159
src/main/scala/io/izzel/taboolib/TabooLibLoader.java
Normal file
@@ -0,0 +1,159 @@
|
||||
package io.izzel.taboolib;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import io.izzel.taboolib.module.dependency.TDependencyInjector;
|
||||
import io.izzel.taboolib.module.inject.TSchedule;
|
||||
import io.izzel.taboolib.origin.client.TabooLibClient;
|
||||
import io.izzel.taboolib.origin.client.TabooLibServer;
|
||||
import io.izzel.taboolib.origin.database.PlayerDataManager;
|
||||
import io.izzel.taboolib.origin.database.PluginDataManager;
|
||||
import io.izzel.taboolib.util.Files;
|
||||
import io.izzel.taboolib.util.Reflection;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2019-07-05 15:30
|
||||
*/
|
||||
public class TabooLibLoader {
|
||||
|
||||
static Map<String, List<Class>> pluginClasses = Maps.newHashMap();
|
||||
static List<Loader> loaders = Lists.newArrayList();
|
||||
|
||||
@TSchedule(period = 20 * 60, async = true)
|
||||
static void save() {
|
||||
PluginDataManager.saveAllCaches();
|
||||
PlayerDataManager.saveAllCaches(true, false);
|
||||
}
|
||||
|
||||
@TSchedule
|
||||
static void start() {
|
||||
PluginLoader.active(TabooLib.getPlugin());
|
||||
// 通讯网络服务器
|
||||
if (TabooLib.getConfig().getBoolean("SERVER")) {
|
||||
TabooLibServer.main(new String[0]);
|
||||
}
|
||||
// 通讯网络客户端
|
||||
TabooLibClient.init();
|
||||
}
|
||||
|
||||
static void init() {
|
||||
// 加载依赖
|
||||
TDependencyInjector.inject("TabooLib", TabooLib.class);
|
||||
// 插件统计
|
||||
Metrics metrics = new Metrics(TabooLib.getPlugin());
|
||||
metrics.addCustomChart(new Metrics.SingleLineChart("plugins_using_taboolib", () -> Math.toIntExact(Arrays.stream(Bukkit.getPluginManager().getPlugins()).filter(TabooLibAPI::isDependTabooLib).count())));
|
||||
// 读取插件类
|
||||
setupClasses(TabooLib.getPlugin());
|
||||
// 读取加载器
|
||||
pluginClasses.get("TabooLib").stream().filter(TabooLibLoader::isLoader).forEach(pluginClass -> {
|
||||
try {
|
||||
loaders.add((Loader) Reflection.instantiateObject(pluginClass));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
loaders.sort(Comparator.comparingInt(Loader::priority));
|
||||
});
|
||||
// 加载插件
|
||||
PluginLoader.load(TabooLib.getPlugin());
|
||||
PluginLoader.start(TabooLib.getPlugin());
|
||||
}
|
||||
|
||||
public static Optional<List<Class>> getPluginClasses(Plugin plugin) {
|
||||
return Optional.ofNullable(pluginClasses.get(plugin.getName()));
|
||||
}
|
||||
|
||||
public static List<Class> getPluginClassSafely(Plugin plugin) {
|
||||
List<Class> classes = pluginClasses.get(plugin.getName());
|
||||
return classes == null ? new ArrayList<>() : new ArrayList<>(classes);
|
||||
}
|
||||
|
||||
static boolean isLoader(Class pluginClass) {
|
||||
return !Loader.class.equals(pluginClass) && Loader.class.isAssignableFrom(pluginClass);
|
||||
}
|
||||
|
||||
static void setupClasses(Plugin plugin) {
|
||||
try {
|
||||
long time = System.currentTimeMillis();
|
||||
List<Class> classes;
|
||||
IgnoreClasses annotation = plugin.getClass().getAnnotation(IgnoreClasses.class);
|
||||
if (annotation != null) {
|
||||
classes = Files.getClasses(plugin, annotation.value());
|
||||
} else {
|
||||
classes = Files.getClasses(plugin);
|
||||
}
|
||||
if (plugin.getName().equals("TabooLib")) {
|
||||
classes = classes.stream().filter(c -> c.getName().startsWith("io.izzel")).collect(Collectors.toList());
|
||||
}
|
||||
TabooLibAPI.debug("Saved " + classes.size() + " classes (" + plugin.getName() + ") (" + (System.currentTimeMillis() - time) + "ms)");
|
||||
pluginClasses.put(plugin.getName(), classes);
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
static void preLoadClass(Plugin plugin, Class<?> loadClass) {
|
||||
loaders.forEach(loader -> {
|
||||
try {
|
||||
loader.preLoad(plugin, loadClass);
|
||||
} catch (NoClassDefFoundError ignore) {
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static void postLoadClass(Plugin plugin, Class<?> loadClass) {
|
||||
loaders.forEach(loader -> {
|
||||
try {
|
||||
loader.postLoad(plugin, loadClass);
|
||||
} catch (NoClassDefFoundError ignore) {
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static void unloadClass(Plugin plugin, Class<?> loadClass) {
|
||||
loaders.forEach(loader -> {
|
||||
try {
|
||||
loader.unload(plugin, loadClass);
|
||||
} catch (NoClassDefFoundError ignore) {
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public interface Loader {
|
||||
|
||||
default void preLoad(org.bukkit.plugin.Plugin plugin, Class<?> loadClass) {
|
||||
}
|
||||
|
||||
default void postLoad(org.bukkit.plugin.Plugin plugin, Class<?> loadClass) {
|
||||
}
|
||||
|
||||
default void unload(Plugin plugin, Class<?> cancelClass) {
|
||||
}
|
||||
|
||||
default int priority() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface IgnoreClasses {
|
||||
|
||||
String[] value();
|
||||
|
||||
}
|
||||
}
|
||||
57
src/main/scala/io/izzel/taboolib/Version.java
Normal file
57
src/main/scala/io/izzel/taboolib/Version.java
Normal file
@@ -0,0 +1,57 @@
|
||||
package io.izzel.taboolib;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2019-07-05 14:42
|
||||
*/
|
||||
public enum Version {
|
||||
|
||||
v1_7(10700), v1_8(10800), v1_9(10900), v1_10(11000), v1_11(11100), v1_12(11200), v1_13(11300), v1_14(11400), vNull(0);
|
||||
|
||||
private int versionInt;
|
||||
|
||||
Version(int versionInt) {
|
||||
this.versionInt = versionInt;
|
||||
}
|
||||
|
||||
public int getVersionInt() {
|
||||
return versionInt;
|
||||
}
|
||||
|
||||
public static boolean isAfter(Version in) {
|
||||
return getCurrentVersion().getVersionInt() >= in.getVersionInt();
|
||||
}
|
||||
|
||||
public static boolean isBefore(Version in) {
|
||||
return getCurrentVersion().getVersionInt() < in.getVersionInt();
|
||||
}
|
||||
|
||||
public static String getBukkitVersion() {
|
||||
return Bukkit.getServer().getClass().getName().split("\\.")[3];
|
||||
}
|
||||
|
||||
public static Version getCurrentVersion() {
|
||||
String nmsVersion = getBukkitVersion();
|
||||
if (nmsVersion.startsWith("v1_7")) {
|
||||
return v1_7;
|
||||
} else if (nmsVersion.startsWith("v1_8")) {
|
||||
return v1_8;
|
||||
} else if (nmsVersion.startsWith("v1_9")) {
|
||||
return v1_9;
|
||||
} else if (nmsVersion.startsWith("v1_10")) {
|
||||
return v1_10;
|
||||
} else if (nmsVersion.startsWith("v1_11")) {
|
||||
return v1_11;
|
||||
} else if (nmsVersion.startsWith("v1_12")) {
|
||||
return v1_12;
|
||||
} else if (nmsVersion.startsWith("v1_13")) {
|
||||
return v1_13;
|
||||
} else if (nmsVersion.startsWith("v1_14")) {
|
||||
return v1_14;
|
||||
} else {
|
||||
return vNull;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,17 @@
|
||||
package me.skymc.taboolib.commands;
|
||||
package io.izzel.taboolib.command;
|
||||
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import me.skymc.taboolib.commands.internal.BaseMainCommand;
|
||||
import me.skymc.taboolib.commands.internal.BaseSubCommand;
|
||||
import me.skymc.taboolib.commands.internal.TCommand;
|
||||
import me.skymc.taboolib.commands.internal.type.CommandArgument;
|
||||
import me.skymc.taboolib.commands.internal.type.CommandRegister;
|
||||
import me.skymc.taboolib.string.ArrayUtils;
|
||||
import io.izzel.taboolib.TabooLibAPI;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.module.command.base.BaseMainCommand;
|
||||
import io.izzel.taboolib.module.command.base.BaseSubCommand;
|
||||
import io.izzel.taboolib.module.command.TCommand;
|
||||
import io.izzel.taboolib.module.command.base.CommandArgument;
|
||||
import io.izzel.taboolib.module.command.base.CommandRegister;
|
||||
import io.izzel.taboolib.util.ArrayUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.server.ServerCommandEvent;
|
||||
|
||||
/**
|
||||
* @Author sky
|
||||
@@ -33,6 +31,7 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
|
||||
|
||||
@CommandRegister(priority = 1)
|
||||
BaseSubCommand chat = new BaseSubCommand() {
|
||||
|
||||
@Override
|
||||
public String getLabel() {
|
||||
return "chat";
|
||||
@@ -58,7 +57,7 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
|
||||
TLocale.sendTo(sender, "INVALID-PLAYER-OFFLINE", args[0]);
|
||||
return;
|
||||
}
|
||||
player.chat(ArrayUtils.arrayJoin(args, 1));
|
||||
player.chat(ArrayUtil.arrayJoin(args, 1));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -69,6 +68,11 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
|
||||
return "command";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getAliases() {
|
||||
return new String[] {"cmd"};
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return TLocale.asString("COMMANDS.TEXECUTE.COMMAND.DESCRIPTION");
|
||||
@@ -85,7 +89,7 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
|
||||
@Override
|
||||
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (args[0].equalsIgnoreCase("console")) {
|
||||
dispatchCommand(Bukkit.getConsoleSender(), ArrayUtils.arrayJoin(args, 1));
|
||||
TabooLibAPI.dispatchCommand(Bukkit.getConsoleSender(), ArrayUtil.arrayJoin(args, 1));
|
||||
return;
|
||||
}
|
||||
Player player = Bukkit.getPlayerExact(args[0]);
|
||||
@@ -93,17 +97,23 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
|
||||
TLocale.sendTo(sender, "INVALID-TARGET-NOT-FOUND", args[0]);
|
||||
return;
|
||||
}
|
||||
dispatchCommand(player, ArrayUtils.arrayJoin(args, 1));
|
||||
TabooLibAPI.dispatchCommand(player, ArrayUtil.arrayJoin(args, 1));
|
||||
}
|
||||
};
|
||||
|
||||
@CommandRegister(priority = 2)
|
||||
BaseSubCommand commandAsOp = new BaseSubCommand() {
|
||||
|
||||
@Override
|
||||
public String getLabel() {
|
||||
return "commandAsOp";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getAliases() {
|
||||
return new String[] {"op"};
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return TLocale.asString("COMMANDS.TEXECUTE.COMMAND-AS-OP.DESCRIPTION");
|
||||
@@ -120,7 +130,7 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
|
||||
@Override
|
||||
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (args[0].equalsIgnoreCase("console")) {
|
||||
dispatchCommand(Bukkit.getConsoleSender(), ArrayUtils.arrayJoin(args, 1));
|
||||
TabooLibAPI.dispatchCommand(Bukkit.getConsoleSender(), ArrayUtil.arrayJoin(args, 1));
|
||||
return;
|
||||
}
|
||||
Player player = Bukkit.getPlayerExact(args[0]);
|
||||
@@ -131,33 +141,10 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
|
||||
boolean isOp = player.isOp();
|
||||
player.setOp(true);
|
||||
try {
|
||||
dispatchCommand(player, ArrayUtils.arrayJoin(args, 1));
|
||||
TabooLibAPI.dispatchCommand(player, ArrayUtil.arrayJoin(args, 1));
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
player.setOp(isOp);
|
||||
}
|
||||
};
|
||||
|
||||
public static boolean dispatchCommand(CommandSender sender, String command) {
|
||||
try {
|
||||
if ((sender instanceof Player)) {
|
||||
PlayerCommandPreprocessEvent e = new PlayerCommandPreprocessEvent((Player) sender, "/" + command);
|
||||
Bukkit.getPluginManager().callEvent(e);
|
||||
if (e.isCancelled() || Strings.isBlank(e.getMessage()) || !e.getMessage().startsWith("/")) {
|
||||
return false;
|
||||
}
|
||||
return Bukkit.dispatchCommand(e.getPlayer(), e.getMessage().substring(1));
|
||||
} else {
|
||||
ServerCommandEvent e = new ServerCommandEvent(sender, command);
|
||||
Bukkit.getPluginManager().callEvent(e);
|
||||
if (e.isCancelled() || Strings.isBlank(e.getCommand())) {
|
||||
return false;
|
||||
}
|
||||
return Bukkit.dispatchCommand(e.getSender(), e.getCommand());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
package me.skymc.taboolib.commands.locale;
|
||||
package io.izzel.taboolib.command;
|
||||
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import com.ilummc.tlib.resources.TLocaleLoader;
|
||||
import me.skymc.taboolib.commands.internal.BaseMainCommand;
|
||||
import me.skymc.taboolib.commands.internal.BaseSubCommand;
|
||||
import me.skymc.taboolib.commands.internal.TCommand;
|
||||
import me.skymc.taboolib.commands.internal.type.CommandArgument;
|
||||
import me.skymc.taboolib.commands.internal.type.CommandRegister;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.locale.TLocaleLoader;
|
||||
import io.izzel.taboolib.module.command.base.BaseMainCommand;
|
||||
import io.izzel.taboolib.module.command.base.BaseSubCommand;
|
||||
import io.izzel.taboolib.module.command.TCommand;
|
||||
import io.izzel.taboolib.module.command.base.CommandArgument;
|
||||
import io.izzel.taboolib.module.command.base.CommandRegister;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@@ -1,17 +1,18 @@
|
||||
package me.skymc.taboolib.commands.plugin;
|
||||
package io.izzel.taboolib.command;
|
||||
|
||||
import com.google.common.base.Joiner;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import me.skymc.taboolib.commands.internal.BaseMainCommand;
|
||||
import me.skymc.taboolib.commands.internal.BaseSubCommand;
|
||||
import me.skymc.taboolib.commands.internal.TCommand;
|
||||
import me.skymc.taboolib.commands.internal.type.CommandArgument;
|
||||
import me.skymc.taboolib.commands.internal.type.CommandRegister;
|
||||
import me.skymc.taboolib.plugin.PluginLoadState;
|
||||
import me.skymc.taboolib.plugin.PluginLoadStateType;
|
||||
import me.skymc.taboolib.plugin.PluginUnloadState;
|
||||
import me.skymc.taboolib.plugin.PluginUtils;
|
||||
import me.skymc.taboolib.string.ArrayUtils;
|
||||
import io.izzel.taboolib.TabooLibAPI;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.module.command.TCommand;
|
||||
import io.izzel.taboolib.module.command.base.BaseMainCommand;
|
||||
import io.izzel.taboolib.module.command.base.BaseSubCommand;
|
||||
import io.izzel.taboolib.module.command.base.CommandArgument;
|
||||
import io.izzel.taboolib.module.command.base.CommandRegister;
|
||||
import io.izzel.taboolib.origin.plugin.PluginLoadState;
|
||||
import io.izzel.taboolib.origin.plugin.PluginLoadStateType;
|
||||
import io.izzel.taboolib.origin.plugin.PluginUnloadState;
|
||||
import io.izzel.taboolib.origin.plugin.PluginUtils;
|
||||
import io.izzel.taboolib.util.ArrayUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@@ -37,17 +38,6 @@ public class TabooLibPluginCommand extends BaseMainCommand {
|
||||
return TLocale.asString("COMMANDS.TPLUGIN.COMMAND-TITLE");
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public List<String> onTabComplete(CommandSender commandSender, Command command, String s, String[] args) {
|
||||
// if (args.length == 1) {
|
||||
// return getSubCommands().stream().filter(internalCommandExecutor -> internalCommandExecutor != null && (args[0].isEmpty() || internalCommandExecutor.getLabel().toLowerCase().startsWith(args[0].toLowerCase()))).map(BaseSubCommand::getLabel).collect(Collectors.toList());
|
||||
// } else if (args.length > 1 && isPluginCommand(args[0])) {
|
||||
// return Arrays.stream(Bukkit.getPluginManager().getPlugins()).filter(x -> !PluginUtils.isIgnored(x)).collect(Collectors.toList()).stream().filter(plugin -> args[1].isEmpty() || plugin.getName().toLowerCase().startsWith(args[1].toLowerCase())).map(Plugin::getName).collect(Collectors.toList());
|
||||
// } else {
|
||||
// return null;
|
||||
// }
|
||||
// }
|
||||
|
||||
@CommandRegister(priority = 1)
|
||||
BaseSubCommand load = new BaseSubCommand() {
|
||||
|
||||
@@ -68,7 +58,7 @@ public class TabooLibPluginCommand extends BaseMainCommand {
|
||||
|
||||
@Override
|
||||
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
String name = ArrayUtils.arrayJoin(args, 0);
|
||||
String name = ArrayUtil.arrayJoin(args, 0);
|
||||
if (PluginUtils.getPluginByName(name) != null) {
|
||||
TLocale.sendTo(sender, "COMMANDS.TPLUGIN.LOAD.INVALID-PLUGIN", name, name + " already loaded!");
|
||||
} else {
|
||||
@@ -114,13 +104,13 @@ public class TabooLibPluginCommand extends BaseMainCommand {
|
||||
@Override
|
||||
public CommandArgument[] getArguments() {
|
||||
return new CommandArgument[] {new CommandArgument(TLocale.asString("COMMANDS.TPLUGIN.UNLOAD.ARGUMENTS.0"), true, () -> {
|
||||
return Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toList());
|
||||
return java.util.Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toList());
|
||||
})};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
String name = ArrayUtils.arrayJoin(args, 0);
|
||||
String name = ArrayUtil.arrayJoin(args, 0);
|
||||
Plugin plugin = PluginUtils.getPluginByName(name);
|
||||
if (plugin == null) {
|
||||
TLocale.sendTo(sender, "COMMANDS.TPLUGIN.UNLOAD.INVALID-PLUGIN", name);
|
||||
@@ -164,15 +154,15 @@ public class TabooLibPluginCommand extends BaseMainCommand {
|
||||
|
||||
@Override
|
||||
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
String name = ArrayUtils.arrayJoin(args, 0);
|
||||
String name = ArrayUtil.arrayJoin(args, 0);
|
||||
Plugin plugin = PluginUtils.getPluginByName(name);
|
||||
if (plugin == null) {
|
||||
TLocale.sendTo(sender, "COMMANDS.TPLUGIN.RELOAD.INVALID-PLUGIN", name);
|
||||
} else if (PluginUtils.isIgnored(plugin)) {
|
||||
TLocale.sendTo(sender, "COMMANDS.TPLUGIN.RELOAD.INVALID-PLUGIN-IGNORED", name);
|
||||
} else {
|
||||
TLocale.sendTo(sender, "COMMANDS.TPLUGIN.RELOAD.TRY-RELOAD");
|
||||
PluginUtils.reload(plugin);
|
||||
TabooLibAPI.dispatchCommand(sender, "taboolibplugin unload " + plugin.getName());
|
||||
TabooLibAPI.dispatchCommand(sender, "taboolibplugin load " + plugin.getName());
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -192,12 +182,14 @@ public class TabooLibPluginCommand extends BaseMainCommand {
|
||||
|
||||
@Override
|
||||
public CommandArgument[] getArguments() {
|
||||
return new CommandArgument[] {new CommandArgument(TLocale.asString("COMMANDS.TPLUGIN.INFO.ARGUMENTS.0"), true)};
|
||||
return new CommandArgument[] {new CommandArgument(TLocale.asString("COMMANDS.TPLUGIN.INFO.ARGUMENTS.0"), true, () -> {
|
||||
return Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toList());
|
||||
})};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
String name = ArrayUtils.arrayJoin(args, 0);
|
||||
String name = ArrayUtil.arrayJoin(args, 0);
|
||||
Plugin plugin = PluginUtils.getPluginByName(name);
|
||||
if (plugin == null) {
|
||||
TLocale.sendTo(sender, "COMMANDS.TPLUGIN.INFO.INVALID-PLUGIN", name);
|
||||
@@ -1,7 +1,6 @@
|
||||
package me.skymc.taboolib.listener;
|
||||
package io.izzel.taboolib.listener;
|
||||
|
||||
import me.skymc.taboolib.Main;
|
||||
import me.skymc.taboolib.message.MsgUtils;
|
||||
import io.izzel.taboolib.module.inject.TListener;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
@@ -14,11 +13,9 @@ import pw.yumc.Yum.events.PluginNetworkEvent;
|
||||
@TListener(depend = "YUM")
|
||||
public class ListenerNetWork implements Listener {
|
||||
|
||||
public static final String GG = "本监听只是为了防止本插件的更新检测被 YUM 插件阻止,别无它用。";
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void onNetWork(PluginNetworkEvent e) {
|
||||
if (e.getPlugin() != null && e.getPlugin().equals(Main.getInst())) {
|
||||
if (e.getPlugin() != null && e.getPlugin().getName().equals("TabooLib")) {
|
||||
e.setCancelled(false);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package io.izzel.taboolib.listener;
|
||||
|
||||
import io.izzel.taboolib.TabooLibAPI;
|
||||
import io.izzel.taboolib.Version;
|
||||
import io.izzel.taboolib.module.inject.TListener;
|
||||
import io.izzel.taboolib.module.item.Items;
|
||||
import io.izzel.taboolib.module.logger.TLogger;
|
||||
import io.izzel.taboolib.module.tellraw.TellrawJson;
|
||||
import io.izzel.taboolib.origin.database.PlayerDataManager;
|
||||
import io.izzel.taboolib.origin.database.PluginDataManager;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.server.ServerCommandEvent;
|
||||
|
||||
/**
|
||||
* @author sky
|
||||
*/
|
||||
@TListener
|
||||
public class ListenerPlayerCommand implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void cmd(ServerCommandEvent e) {
|
||||
if (e.getCommand().equalsIgnoreCase("saveFiles")) {
|
||||
if (Version.isAfter(Version.v1_8)) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
PluginDataManager.saveAllCaches();
|
||||
PlayerDataManager.saveAllCaches(true, false);
|
||||
TLogger.getGlobalLogger().info("Successfully.");
|
||||
} else if (e.getCommand().equalsIgnoreCase("tDebug")) {
|
||||
if (Version.isAfter(Version.v1_8)) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
if (TabooLibAPI.isDebug()) {
|
||||
TabooLibAPI.setDebug(false);
|
||||
TLogger.getGlobalLogger().info("&cDisabled.");
|
||||
} else {
|
||||
TabooLibAPI.setDebug(true);
|
||||
TLogger.getGlobalLogger().info("&aEnabled.");
|
||||
}
|
||||
} else if (e.getCommand().equalsIgnoreCase("tExceptionEvent")) {
|
||||
e.setCancelled(true);
|
||||
throw new IllegalStateException("TabooLib Example Exception");
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void cmd(PlayerCommandPreprocessEvent e) {
|
||||
if (e.getMessage().equals("/tellrawTest") && e.getPlayer().hasPermission("taboolib.tellraw")) {
|
||||
e.setCancelled(true);
|
||||
TellrawJson.create()
|
||||
.append("§8[§3§lTabooLib§8] §7TellrawJson Test: §f[")
|
||||
.append(Items.getName(e.getPlayer().getItemInHand())).hoverItem(e.getPlayer().getItemInHand())
|
||||
.append("§f]")
|
||||
.send(e.getPlayer());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package me.skymc.taboolib.listener;
|
||||
package io.izzel.taboolib.listener;
|
||||
|
||||
import me.skymc.taboolib.events.PlayerJumpEvent;
|
||||
import io.izzel.taboolib.module.inject.TListener;
|
||||
import io.izzel.taboolib.origin.event.PlayerJumpEvent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
@@ -30,7 +31,7 @@ public class ListenerPlayerJump implements Listener {
|
||||
PlayerJumpEvent evt = new PlayerJumpEvent(event.isCancelled(), event.getPlayer());
|
||||
Bukkit.getPluginManager().callEvent(evt);
|
||||
if (evt.isCancelled()) {
|
||||
event.setCancelled(true);
|
||||
event.setTo(event.getFrom());
|
||||
}
|
||||
} else if (this.cooldown.get(event.getPlayer()) <= System.currentTimeMillis()) {
|
||||
this.cooldown.put(event.getPlayer(), System.currentTimeMillis() + 350L);
|
||||
@@ -38,7 +39,7 @@ public class ListenerPlayerJump implements Listener {
|
||||
|
||||
Bukkit.getPluginManager().callEvent(evt);
|
||||
if (evt.isCancelled()) {
|
||||
event.setCancelled(true);
|
||||
event.setTo(event.getFrom());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,16 +1,15 @@
|
||||
package com.ilummc.tlib.resources;
|
||||
package io.izzel.taboolib.locale;
|
||||
|
||||
import com.ilummc.tlib.TLib;
|
||||
import com.ilummc.tlib.bungee.api.ChatColor;
|
||||
import com.ilummc.tlib.bungee.api.chat.TextComponent;
|
||||
import com.ilummc.tlib.bungee.chat.ComponentSerializer;
|
||||
import com.ilummc.tlib.inject.TLoggerManager;
|
||||
import com.ilummc.tlib.util.Ref;
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import io.izzel.taboolib.TabooLib;
|
||||
import io.izzel.taboolib.module.logger.TLoggerManager;
|
||||
import io.izzel.taboolib.module.nms.NMSHandler;
|
||||
import io.izzel.taboolib.module.tellraw.TellrawCreator;
|
||||
import io.izzel.taboolib.util.Ref;
|
||||
import io.izzel.taboolib.util.Strings;
|
||||
import io.izzel.taboolib.util.chat.ChatColor;
|
||||
import io.izzel.taboolib.util.chat.ComponentSerializer;
|
||||
import io.izzel.taboolib.util.chat.TextComponent;
|
||||
import me.clip.placeholderapi.PlaceholderAPI;
|
||||
import me.skymc.taboolib.Main;
|
||||
import me.skymc.taboolib.common.nms.NMSHandler;
|
||||
import me.skymc.taboolib.json.tellraw.TellrawCreator;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -58,19 +57,19 @@ public class TLocale {
|
||||
|
||||
public static String asString(String path, String... args) {
|
||||
try {
|
||||
return asString(path, Ref.getCallerClass(3).orElse(Main.class), args);
|
||||
return asString(path, Ref.getCallerClass(3).orElse(TabooLib.class), args);
|
||||
} catch (Exception e) {
|
||||
TLib.getTLib().getLogger().error(Strings.replaceWithOrder(TLib.getInternalLanguage().getString("FETCH-LOCALE-ERROR"), path));
|
||||
TLib.getTLib().getLogger().error(Strings.replaceWithOrder(TLib.getInternalLanguage().getString("LOCALE-ERROR-REASON"), e.getMessage()));
|
||||
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 List<String> asStringList(String path, String... args) {
|
||||
try {
|
||||
return asStringList(path, Ref.getCallerClass(3).orElse(Main.class), args);
|
||||
return asStringList(path, Ref.getCallerClass(3).orElse(TabooLib.class), args);
|
||||
} catch (Exception e) {
|
||||
TLib.getTLib().getLogger().error(Strings.replaceWithOrder(TLib.getInternalLanguage().getString("LOCALE-ERROR-REASON"), e.getMessage()));
|
||||
TabooLib.getLogger().error(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("LOCALE-ERROR-REASON"), e.getMessage()));
|
||||
return Collections.singletonList("§4<" + path + "§4>");
|
||||
}
|
||||
}
|
||||
@@ -108,7 +107,7 @@ public class TLocale {
|
||||
public static final class Translate extends TLocale {
|
||||
|
||||
public static boolean isPlaceholderUseDefault() {
|
||||
return Main.getInst().getConfig().getBoolean("LOCALE.USE_PAPI", false);
|
||||
return TabooLib.getConfig().getBoolean("LOCALE.USE_PAPI", false);
|
||||
}
|
||||
|
||||
public static boolean isPlaceholderPluginEnabled() {
|
||||
@@ -1,10 +1,9 @@
|
||||
package com.ilummc.tlib.resources;
|
||||
package io.izzel.taboolib.locale;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.ilummc.tlib.TLib;
|
||||
import com.ilummc.tlib.resources.type.TLocaleText;
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import io.izzel.taboolib.TabooLib;
|
||||
import io.izzel.taboolib.locale.type.TLocaleText;
|
||||
import io.izzel.taboolib.util.Strings;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
@@ -12,7 +11,10 @@ import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
import java.util.*;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -59,8 +61,8 @@ class TLocaleInstance {
|
||||
}
|
||||
});
|
||||
} catch (Exception | Error e) {
|
||||
TLib.getTLib().getLogger().error(Strings.replaceWithOrder(TLib.getInternalLanguage().getString("SEND-LOCALE-ERROR"), path));
|
||||
TLib.getTLib().getLogger().error(Strings.replaceWithOrder(TLib.getInternalLanguage().getString("LOCALE-ERROR-REASON"), e.toString()));
|
||||
TabooLib.getLogger().error(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("SEND-LOCALE-ERROR"), path));
|
||||
TabooLib.getLogger().error(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("LOCALE-ERROR-REASON"), e.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
19
src/main/scala/io/izzel/taboolib/locale/TLocaleSender.java
Normal file
19
src/main/scala/io/izzel/taboolib/locale/TLocaleSender.java
Normal file
@@ -0,0 +1,19 @@
|
||||
package io.izzel.taboolib.locale;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author sky
|
||||
* @Since 2018-05-12 13:58
|
||||
*/
|
||||
public interface TLocaleSender {
|
||||
|
||||
void sendTo(CommandSender sender, String... args);
|
||||
|
||||
String asString(String... args);
|
||||
|
||||
List<String> asStringList(String... args);
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.ilummc.tlib.resources;
|
||||
package io.izzel.taboolib.locale;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.serialization.ConfigurationSerializable;
|
||||
@@ -1,11 +1,10 @@
|
||||
package com.ilummc.tlib.resources.type;
|
||||
package io.izzel.taboolib.locale.type;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.ilummc.tlib.compat.PlaceholderHook;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import com.ilummc.tlib.resources.TLocaleSerialize;
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import me.skymc.taboolib.display.ActionUtils;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.locale.TLocaleSerialize;
|
||||
import io.izzel.taboolib.module.compat.PlaceholderHook;
|
||||
import io.izzel.taboolib.util.Strings;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.serialization.SerializableAs;
|
||||
@@ -1,14 +1,14 @@
|
||||
package com.ilummc.tlib.resources.type;
|
||||
package io.izzel.taboolib.locale.type;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.ilummc.tlib.bungee.chat.ComponentSerializer;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import com.ilummc.tlib.resources.TLocaleSerialize;
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import me.skymc.taboolib.Main;
|
||||
import me.skymc.taboolib.bookformatter.BookFormatter;
|
||||
import me.skymc.taboolib.bookformatter.builder.BookBuilder;
|
||||
import me.skymc.taboolib.json.tellraw.TellrawJson;
|
||||
import io.izzel.taboolib.TabooLib;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.locale.TLocaleSerialize;
|
||||
import io.izzel.taboolib.module.tellraw.TellrawJson;
|
||||
import io.izzel.taboolib.origin.book.BookFormatter;
|
||||
import io.izzel.taboolib.origin.book.builder.BookBuilder;
|
||||
import io.izzel.taboolib.util.Strings;
|
||||
import io.izzel.taboolib.util.chat.ComponentSerializer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.serialization.SerializableAs;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -77,9 +77,9 @@ public class TLocaleBook extends TLocaleSerialize {
|
||||
public void run() {
|
||||
BookFormatter.forceOpen((Player) sender, bookBuilder.build());
|
||||
}
|
||||
}.runTask(Main.getInst());
|
||||
}.runTask(TabooLib.getPlugin());
|
||||
}
|
||||
}.runTaskAsynchronously(Main.getInst());
|
||||
}.runTaskAsynchronously(TabooLib.getPlugin());
|
||||
}
|
||||
|
||||
private String format(TellrawJson jsonPage, CommandSender sender, String[] args) {
|
||||
@@ -1,14 +1,14 @@
|
||||
package com.ilummc.tlib.resources.type;
|
||||
package io.izzel.taboolib.locale.type;
|
||||
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import com.ilummc.tlib.resources.TLocaleSerialize;
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import me.skymc.taboolib.other.NumberUtils;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.locale.TLocaleSerialize;
|
||||
import io.izzel.taboolib.util.Strings;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.serialization.SerializableAs;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.NumberConversions;
|
||||
import org.inventivetalent.bossbar.BossBar;
|
||||
import org.inventivetalent.bossbar.BossBarAPI;
|
||||
|
||||
@@ -72,7 +72,14 @@ public class TLocaleBossBar extends TLocaleSerialize {
|
||||
}
|
||||
|
||||
public static TLocaleBossBar valueOf(Map<String, Object> map) {
|
||||
return new TLocaleBossBar(map.getOrDefault("text", "§4* Invalid Text*").toString(), getColor(String.valueOf(map.get("color"))), getStyle(String.valueOf(map.get("style"))), (float) NumberUtils.getDouble(String.valueOf(map.getOrDefault("progress", 1))), NumberUtils.getInteger(String.valueOf(map.getOrDefault("timeout", 20))), NumberUtils.getInteger(String.valueOf(map.getOrDefault("timeout-interval", 2))), isPlaceholderEnabled(map));
|
||||
return new TLocaleBossBar(
|
||||
map.getOrDefault("text", "§4* Invalid Text*").toString(),
|
||||
getColor(String.valueOf(map.get("color"))),
|
||||
getStyle(String.valueOf(map.get("style"))),
|
||||
NumberConversions.toFloat(map.getOrDefault("progress", 1)),
|
||||
NumberConversions.toInt(map.getOrDefault("timeout", 20)),
|
||||
NumberConversions.toInt(map.getOrDefault("timeout-interval", 2)),
|
||||
isPlaceholderEnabled(map));
|
||||
}
|
||||
|
||||
private static BossBarAPI.Color getColor(String color) {
|
||||
@@ -1,21 +1,19 @@
|
||||
package com.ilummc.tlib.resources.type;
|
||||
package io.izzel.taboolib.locale.type;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.ilummc.tlib.TLib;
|
||||
import com.ilummc.tlib.bungee.api.chat.*;
|
||||
import com.ilummc.tlib.bungee.chat.ComponentSerializer;
|
||||
import com.ilummc.tlib.compat.PlaceholderHook;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import com.ilummc.tlib.resources.TLocaleSerialize;
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import me.skymc.taboolib.inventory.ItemUtils;
|
||||
import me.skymc.taboolib.json.tellraw.TellrawJson;
|
||||
import me.skymc.taboolib.other.NumberUtils;
|
||||
import me.skymc.taboolib.string.VariableFormatter;
|
||||
import io.izzel.taboolib.TabooLib;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.locale.TLocaleSerialize;
|
||||
import io.izzel.taboolib.module.compat.PlaceholderHook;
|
||||
import io.izzel.taboolib.module.tellraw.TellrawJson;
|
||||
import io.izzel.taboolib.util.Strings;
|
||||
import io.izzel.taboolib.util.Variables;
|
||||
import io.izzel.taboolib.util.chat.*;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.serialization.SerializableAs;
|
||||
import org.bukkit.util.NumberConversions;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
import java.util.*;
|
||||
@@ -88,7 +86,7 @@ public class TLocaleJson extends TLocaleSerialize {
|
||||
} else {
|
||||
// 这个参数节点并没有找到,于是随便放点字符串进去
|
||||
builder.addAll(Arrays.asList(TextComponent.fromLegacyText(text)));
|
||||
TLib.getTLib().getLogger().warn(Strings.replaceWithOrder(TLib.getInternalLanguage().getString("MISSING-ARGUMENT"), node));
|
||||
TabooLib.getLogger().warn(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("MISSING-ARGUMENT"), node));
|
||||
}
|
||||
// 有可能一开头就是 <@xxx>,然后 split 出来就少了一些,于是直接加上
|
||||
if (index < template.length) {
|
||||
@@ -171,7 +169,7 @@ public class TLocaleJson extends TLocaleSerialize {
|
||||
// 遍历本页文本
|
||||
for (int i = 0; i < textList.size(); i++) {
|
||||
// 捕捉变量
|
||||
for (VariableFormatter.Variable variable : new VariableFormatter(TLocale.Translate.setColored(textList.get(i)), pattern).find().getVariableList()) {
|
||||
for (Variables.Variable variable : new Variables(TLocale.Translate.setColored(textList.get(i)), pattern).find().getVariableList()) {
|
||||
// 如果是变量
|
||||
if (variable.isVariable()) {
|
||||
String[] split = variable.getText().split("@");
|
||||
@@ -199,9 +197,6 @@ public class TLocaleJson extends TLocaleSerialize {
|
||||
// 文本
|
||||
pageJson.append(args.getOrDefault("text", text).toString());
|
||||
// 功能
|
||||
if (args.containsKey("item")) {
|
||||
pageJson.hoverItem(ItemUtils.getCacheItem(args.get("item").toString()));
|
||||
}
|
||||
if (args.containsKey("hover")) {
|
||||
pageJson.hoverText(args.get("hover").toString());
|
||||
}
|
||||
@@ -212,7 +207,7 @@ public class TLocaleJson extends TLocaleSerialize {
|
||||
pageJson.clickCommand(args.get("command").toString());
|
||||
}
|
||||
if (args.containsKey("page")) {
|
||||
pageJson.clickChangePage(NumberUtils.getInteger(args.get("page").toString()));
|
||||
pageJson.clickChangePage(NumberConversions.toInt(args.get("page").toString()));
|
||||
}
|
||||
if (args.containsKey("url")) {
|
||||
pageJson.clickOpenURL(args.get("url").toString());
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.ilummc.tlib.resources.type;
|
||||
package io.izzel.taboolib.locale.type;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.ilummc.tlib.resources.TLocaleSerialize;
|
||||
import me.skymc.taboolib.sound.SoundPack;
|
||||
import io.izzel.taboolib.locale.TLocaleSerialize;
|
||||
import io.izzel.taboolib.origin.lite.Sounds;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.serialization.SerializableAs;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -21,19 +21,19 @@ import java.util.stream.Collectors;
|
||||
@SerializableAs("ACTION")
|
||||
public class TLocaleSound extends TLocaleSerialize {
|
||||
|
||||
private final List<SoundPack> soundPacks;
|
||||
private final List<Sounds> soundPacks;
|
||||
|
||||
public TLocaleSound(List<SoundPack> soundPacks) {
|
||||
public TLocaleSound(List<Sounds> soundPacks) {
|
||||
this.soundPacks = soundPacks;
|
||||
}
|
||||
|
||||
public static TLocaleSound valueOf(Map<String, Object> map) {
|
||||
List<SoundPack> soundPacks = new ArrayList<>();
|
||||
List<Sounds> soundPacks = new ArrayList<>();
|
||||
Object sounds = map.containsKey("sounds") ? map.get("sounds") : map.getOrDefault("sound", "");
|
||||
if (sounds instanceof List) {
|
||||
soundPacks = ((List<String>) sounds).stream().map(SoundPack::new).collect(Collectors.toList());
|
||||
soundPacks = ((List<String>) sounds).stream().map(Sounds::new).collect(Collectors.toList());
|
||||
} else {
|
||||
soundPacks.add(new SoundPack(sounds.toString()));
|
||||
soundPacks.add(new Sounds(sounds.toString()));
|
||||
}
|
||||
return new TLocaleSound(soundPacks);
|
||||
}
|
||||
@@ -61,7 +61,7 @@ public class TLocaleSound extends TLocaleSerialize {
|
||||
if (soundPacks.size() == 1) {
|
||||
map.put("sounds", soundPacks.get(0).toString());
|
||||
} else if (soundPacks.size() > 1) {
|
||||
map.put("sounds", soundPacks.stream().map(SoundPack::toString).collect(Collectors.toList()));
|
||||
map.put("sounds", soundPacks.stream().map(Sounds::toString).collect(Collectors.toList()));
|
||||
}
|
||||
return map;
|
||||
}
|
||||
@@ -1,13 +1,11 @@
|
||||
package com.ilummc.tlib.resources.type;
|
||||
package io.izzel.taboolib.locale.type;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.ilummc.tlib.compat.PlaceholderHook;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import com.ilummc.tlib.resources.TLocaleSerialize;
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import me.skymc.taboolib.Main;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.locale.TLocaleSerialize;
|
||||
import io.izzel.taboolib.util.Strings;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.serialization.SerializableAs;
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
package com.ilummc.tlib.resources.type;
|
||||
package io.izzel.taboolib.locale.type;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import com.ilummc.tlib.resources.TLocaleSerialize;
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import me.skymc.taboolib.display.TitleUtils;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.locale.TLocaleSerialize;
|
||||
import io.izzel.taboolib.util.Strings;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.serialization.SerializableAs;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.common.pathfinder;
|
||||
package io.izzel.taboolib.module.ai;
|
||||
|
||||
/**
|
||||
* @Author sky
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.common.pathfinder;
|
||||
package io.izzel.taboolib.module.ai;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Entity;
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.common.pathfinder;
|
||||
package io.izzel.taboolib.module.ai;
|
||||
|
||||
/**
|
||||
* @Author sky
|
||||
@@ -1,22 +1,22 @@
|
||||
package me.skymc.taboolib.common.pathfinder;
|
||||
package io.izzel.taboolib.module.ai;
|
||||
|
||||
import me.skymc.taboolib.common.loader.Instantiable;
|
||||
import me.skymc.taboolib.common.versioncontrol.SimpleVersionControl;
|
||||
import io.izzel.taboolib.module.inject.TFunction;
|
||||
import io.izzel.taboolib.module.lite.SimpleVersionControl;
|
||||
|
||||
/**
|
||||
* @Author sky
|
||||
* @Since 2018-09-19 20:31
|
||||
*/
|
||||
@Instantiable("SimpleAiSelector")
|
||||
@TFunction(enable = "init")
|
||||
public class SimpleAiSelector {
|
||||
|
||||
private static PathfinderCreator internalPathfinderCreator;
|
||||
private static PathfinderExecutor internalPathfinderExecutor;
|
||||
|
||||
public SimpleAiSelector() {
|
||||
static void init() {
|
||||
try {
|
||||
internalPathfinderCreator = (PathfinderCreator) SimpleVersionControl.createNMS("me.skymc.taboolib.common.pathfinder.internal.InternalPathfinderCreator").translate().newInstance();
|
||||
internalPathfinderExecutor = (PathfinderExecutor) SimpleVersionControl.createNMS("me.skymc.taboolib.common.pathfinder.internal.InternalPathfinderExecutor").translate().newInstance();
|
||||
internalPathfinderCreator = (PathfinderCreator) SimpleVersionControl.createNMS("io.izzel.taboolib.module.ai.internal.InternalPathfinderCreator").translate().newInstance();
|
||||
internalPathfinderExecutor = (PathfinderExecutor) SimpleVersionControl.createNMS("io.izzel.taboolib.module.ai.internal.InternalPathfinderExecutor").translate().newInstance();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package me.skymc.taboolib.common.pathfinder.internal;
|
||||
package io.izzel.taboolib.module.ai.internal;
|
||||
|
||||
import me.skymc.taboolib.common.pathfinder.PathfinderCreator;
|
||||
import me.skymc.taboolib.common.pathfinder.SimpleAi;
|
||||
import io.izzel.taboolib.module.ai.PathfinderCreator;
|
||||
import io.izzel.taboolib.module.ai.SimpleAi;
|
||||
|
||||
/**
|
||||
* 该类仅用作生成 ASM 代码,无任何意义
|
||||
@@ -1,9 +1,9 @@
|
||||
package me.skymc.taboolib.common.pathfinder.internal;
|
||||
package io.izzel.taboolib.module.ai.internal;
|
||||
|
||||
import me.skymc.taboolib.common.pathfinder.PathfinderExecutor;
|
||||
import me.skymc.taboolib.common.pathfinder.SimpleAi;
|
||||
import me.skymc.taboolib.common.pathfinder.SimpleAiSelector;
|
||||
import me.skymc.taboolib.nms.NMSUtils;
|
||||
import io.izzel.taboolib.module.ai.PathfinderExecutor;
|
||||
import io.izzel.taboolib.module.ai.SimpleAi;
|
||||
import io.izzel.taboolib.module.ai.SimpleAiSelector;
|
||||
import io.izzel.taboolib.module.lite.SimpleReflection;
|
||||
import net.minecraft.server.v1_8_R3.*;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
|
||||
@@ -27,18 +27,17 @@ public class InternalPathfinderExecutor extends PathfinderExecutor {
|
||||
|
||||
public InternalPathfinderExecutor() {
|
||||
try {
|
||||
pathfinderGoalSelectorSet = NMSUtils.getNMSClass("PathfinderGoalSelector").getDeclaredField("b");
|
||||
pathfinderGoalSelectorSet.setAccessible(true);
|
||||
controllerJumpCurrent = NMSUtils.getNMSClass("ControllerJump").getDeclaredField("a");
|
||||
controllerJumpCurrent.setAccessible(true);
|
||||
SimpleReflection.saveField(PathfinderGoalSelector.class);
|
||||
SimpleReflection.saveField(ControllerJump.class);
|
||||
pathfinderGoalSelectorSet =SimpleReflection.getField(PathfinderGoalSelector.class, "b");
|
||||
controllerJumpCurrent = SimpleReflection.getField(ControllerJump.class, "a");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Class<?> pathEntityClass = NMSUtils.getNMSClass("PathEntity");
|
||||
for (Field field : NMSUtils.getNMSClass("NavigationAbstract").getDeclaredFields()) {
|
||||
if (field.getType().equals(pathEntityClass)) {
|
||||
field.setAccessible(true);
|
||||
SimpleReflection.saveField(NavigationAbstract.class);
|
||||
for (Field field : SimpleReflection.getFields(NavigationAbstract.class).values()) {
|
||||
if (field.getType().equals(PathEntity.class)) {
|
||||
pathEntity = field;
|
||||
return;
|
||||
}
|
||||
@@ -1,10 +1,9 @@
|
||||
package me.skymc.taboolib.commands.internal;
|
||||
package io.izzel.taboolib.module.command;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author sky
|
||||
@@ -1,18 +1,15 @@
|
||||
package me.skymc.taboolib.commands.internal;
|
||||
package io.izzel.taboolib.module.command;
|
||||
|
||||
import com.ilummc.tlib.inject.TPluginManager;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import me.skymc.taboolib.common.util.SimpleReflection;
|
||||
import me.skymc.taboolib.fileutils.FileUtils;
|
||||
import me.skymc.taboolib.listener.TListener;
|
||||
import me.skymc.taboolib.methods.ReflectionUtils;
|
||||
import me.skymc.taboolib.string.ArrayUtils;
|
||||
import io.izzel.taboolib.TabooLibAPI;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.module.command.base.BaseMainCommand;
|
||||
import io.izzel.taboolib.module.inject.TFunction;
|
||||
import io.izzel.taboolib.module.lite.SimpleReflection;
|
||||
import io.izzel.taboolib.util.ArrayUtil;
|
||||
import io.izzel.taboolib.util.Files;
|
||||
import io.izzel.taboolib.util.Reflection;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.*;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.server.PluginEnableEvent;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.SimplePluginManager;
|
||||
|
||||
@@ -26,30 +23,17 @@ import java.util.stream.Collectors;
|
||||
* @Author sky
|
||||
* @Since 2018-05-23 2:43
|
||||
*/
|
||||
@TListener
|
||||
public class TCommandHandler implements Listener {
|
||||
@TFunction(enable = "init")
|
||||
public class TCommandHandler {
|
||||
|
||||
private static SimpleCommandMap commandMap;
|
||||
private static Map<String, Command> knownCommands;
|
||||
|
||||
public TCommandHandler() {
|
||||
SimpleReflection.saveField(Bukkit.getPluginManager() instanceof TPluginManager ? TPluginManager.class : SimplePluginManager.class, "commandMap");
|
||||
static void init() {
|
||||
SimpleReflection.saveField(SimplePluginManager.class, "commandMap");
|
||||
SimpleReflection.saveField(SimpleCommandMap.class, "knownCommands");
|
||||
commandMap = (SimpleCommandMap) SimpleReflection.getFieldValue(Bukkit.getPluginManager() instanceof TPluginManager ? TPluginManager.class : SimplePluginManager.class, Bukkit.getPluginManager(), "commandMap");
|
||||
commandMap = (SimpleCommandMap) SimpleReflection.getFieldValue(SimplePluginManager.class, Bukkit.getPluginManager(), "commandMap");
|
||||
knownCommands = (Map<String, Command>) SimpleReflection.getFieldValue(SimpleCommandMap.class, commandMap, "knownCommands");
|
||||
try {
|
||||
registerCommands();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onEnable(PluginEnableEvent e) {
|
||||
try {
|
||||
registerCommand(e.getPlugin());
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean registerPluginCommand(Plugin plugin, String command, CommandExecutor commandExecutor) {
|
||||
@@ -72,8 +56,11 @@ public class TCommandHandler implements Listener {
|
||||
return registerPluginCommand(plugin, command, description, usage, aliases, null, null, commandExecutor, tabCompleter);
|
||||
}
|
||||
|
||||
public static boolean registerPluginCommand(Plugin plugin, String command, String description, String usage, List<String> aliases, String permission, String permissionMessage, CommandExecutor commandExecutor, TabCompleter tabCompleter) {
|
||||
return registerPluginCommand(plugin, command, description, usage, aliases, permission, permissionMessage, commandExecutor, tabCompleter, false);
|
||||
/**
|
||||
* 获取插件注册的命令
|
||||
*/
|
||||
public static Command getPluginCommand(String command) {
|
||||
return commandMap.getCommand(command);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -88,27 +75,23 @@ public class TCommandHandler implements Listener {
|
||||
* @param permissionMessage 权限提示
|
||||
* @param commandExecutor 命令执行器
|
||||
* @param tabCompleter 补全执行器
|
||||
* @param silence 是否屏蔽提示
|
||||
* @return 注册结果(boolean)
|
||||
*/
|
||||
public static boolean registerPluginCommand(Plugin plugin, String command, String description, String usage, List<String> aliases, String permission, String permissionMessage, CommandExecutor commandExecutor, TabCompleter tabCompleter, boolean silence) {
|
||||
public static boolean registerPluginCommand(Plugin plugin, String command, String description, String usage, List<String> aliases, String permission, String permissionMessage, CommandExecutor commandExecutor, TabCompleter tabCompleter) {
|
||||
try {
|
||||
Constructor<PluginCommand> constructor = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class);
|
||||
constructor.setAccessible(true);
|
||||
PluginCommand pluginCommand = constructor.newInstance(command, plugin);
|
||||
pluginCommand.setExecutor(commandExecutor);
|
||||
pluginCommand.setTabCompleter(tabCompleter);
|
||||
ReflectionUtils.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "description", description);
|
||||
ReflectionUtils.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "usageMessage", usage);
|
||||
ReflectionUtils.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "aliases", aliases.stream().map(String::toLowerCase).collect(Collectors.toList()));
|
||||
ReflectionUtils.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "activeAliases", aliases.stream().map(String::toLowerCase).collect(Collectors.toList()));
|
||||
ReflectionUtils.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "permission", permission);
|
||||
ReflectionUtils.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "permissionMessage", permissionMessage);
|
||||
Reflection.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "description", description);
|
||||
Reflection.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "usageMessage", usage);
|
||||
Reflection.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "aliases", aliases.stream().map(String::toLowerCase).collect(Collectors.toList()));
|
||||
Reflection.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "activeAliases", aliases.stream().map(String::toLowerCase).collect(Collectors.toList()));
|
||||
Reflection.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "permission", permission);
|
||||
Reflection.setValue(pluginCommand, pluginCommand.getClass().getSuperclass(), true, "permissionMessage", permissionMessage);
|
||||
commandMap.register(plugin.getName(), pluginCommand);
|
||||
TabooLib.debug("Command " + command + " created. (" + plugin.getName() + ")");
|
||||
// if (!TabooLib.isTabooLib(plugin) && !silence) {
|
||||
// TLocale.Logger.info("COMMANDS.INTERNAL.COMMAND-CREATE", plugin.getName(), command);
|
||||
// }
|
||||
TabooLibAPI.debug("Command " + command + " created. (" + plugin.getName() + ")");
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
TLocale.Logger.error("COMMANDS.INTERNAL.COMMAND-CREATE-FAILED", plugin.getName(), command, e.toString());
|
||||
@@ -129,40 +112,23 @@ public class TCommandHandler implements Listener {
|
||||
registerPluginCommand(
|
||||
plugin,
|
||||
command,
|
||||
ArrayUtils.skipEmpty(tCommand.description(), "Registered by TabooLib."),
|
||||
ArrayUtils.skipEmpty(tCommand.usage(), "/" + command),
|
||||
ArrayUtils.skipEmpty(ArrayUtils.asList(tCommand.aliases()), new ArrayList<>()),
|
||||
ArrayUtils.skipEmpty(tCommand.permission()),
|
||||
ArrayUtils.skipEmpty(tCommand.permissionMessage()),
|
||||
ArrayUtil.skipEmpty(tCommand.description(), "Registered by TabooLib."),
|
||||
ArrayUtil.skipEmpty(tCommand.usage(), "/" + command),
|
||||
ArrayUtil.skipEmpty(ArrayUtil.asList(tCommand.aliases()), new ArrayList<>()),
|
||||
ArrayUtil.skipEmpty(tCommand.permission()),
|
||||
ArrayUtil.skipEmpty(tCommand.permissionMessage()),
|
||||
baseMainCommand,
|
||||
baseMainCommand);
|
||||
}
|
||||
return BaseMainCommand.createCommandExecutor(command, baseMainCommand);
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册所有插件的所有 TCommand 命令
|
||||
*/
|
||||
public static void registerCommands() {
|
||||
for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
|
||||
try {
|
||||
registerCommand(plugin);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册插件的所有 TCommand 命令
|
||||
*
|
||||
* @param plugin 插件
|
||||
*/
|
||||
public static void registerCommand(Plugin plugin) {
|
||||
if (!(plugin.equals(TabooLib.instance()) || TabooLib.isDependTabooLib(plugin))) {
|
||||
return;
|
||||
}
|
||||
for (Class pluginClass : FileUtils.getClasses(plugin)) {
|
||||
for (Class pluginClass : Files.getClasses(plugin)) {
|
||||
if (BaseMainCommand.class.isAssignableFrom(pluginClass) && pluginClass.isAnnotationPresent(TCommand.class)) {
|
||||
TCommand tCommand = (TCommand) pluginClass.getAnnotation(TCommand.class);
|
||||
try {
|
||||
@@ -174,16 +140,6 @@ public class TCommandHandler implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取插件注册的命令
|
||||
*
|
||||
* @param command 命令名称
|
||||
* @return {@link Command}
|
||||
*/
|
||||
public static Command getPluginCommand(String command) {
|
||||
return commandMap.getCommand(command);
|
||||
}
|
||||
|
||||
// *********************************
|
||||
//
|
||||
// Getter and Setter
|
||||
@@ -1,22 +1,25 @@
|
||||
package me.skymc.taboolib.commands.internal;
|
||||
package io.izzel.taboolib.module.command.base;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import me.skymc.taboolib.Main;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import me.skymc.taboolib.commands.internal.type.*;
|
||||
import me.skymc.taboolib.string.ArrayUtils;
|
||||
import me.skymc.taboolib.string.StringUtils;
|
||||
import io.izzel.taboolib.TabooLib;
|
||||
import io.izzel.taboolib.TabooLibAPI;
|
||||
import io.izzel.taboolib.Version;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.util.ArrayUtil;
|
||||
import io.izzel.taboolib.util.Strings;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.*;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -28,7 +31,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
||||
|
||||
private PluginCommand registerCommand;
|
||||
private List<Class<?>> linkClasses = new CopyOnWriteArrayList<>();
|
||||
private List<BaseSubCommand> subCommands = new CopyOnWriteArrayList<>();
|
||||
private List<io.izzel.taboolib.module.command.base.BaseSubCommand> subCommands = new CopyOnWriteArrayList<>();
|
||||
|
||||
public static BaseMainCommand createCommandExecutor(String command, BaseMainCommand baseMainCommand) {
|
||||
Preconditions.checkArgument(Bukkit.getPluginCommand(command) != null, "PluginCommand \"" + command + "\" not found");
|
||||
@@ -46,7 +49,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
||||
public static void loadCommandRegister(BaseMainCommand baseMainCommand) {
|
||||
List<Method> methods = new ArrayList<>();
|
||||
List<CommandField> fields = new ArrayList<>();
|
||||
baseMainCommand.getLinkClasses().forEach(clazz -> Arrays.stream(clazz.getDeclaredMethods()).filter(method -> method.getAnnotation(CommandRegister.class) != null).forEach(methods::add));
|
||||
baseMainCommand.getLinkClasses().forEach(clazz -> java.util.Arrays.stream(clazz.getDeclaredMethods()).filter(method -> method.getAnnotation(CommandRegister.class) != null).forEach(methods::add));
|
||||
if (methods.size() > 0) {
|
||||
methods.sort(Comparator.comparingDouble(a -> a.getAnnotation(CommandRegister.class).priority()));
|
||||
methods.forEach(x -> {
|
||||
@@ -57,13 +60,13 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
||||
}
|
||||
});
|
||||
}
|
||||
baseMainCommand.getLinkClasses().forEach(clazz -> Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.getAnnotation(CommandRegister.class) != null && field.getType().equals(BaseSubCommand.class)).forEach(field -> fields.add(new CommandField(field, clazz))));
|
||||
baseMainCommand.getLinkClasses().forEach(clazz -> java.util.Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.getAnnotation(CommandRegister.class) != null && field.getType().equals(io.izzel.taboolib.module.command.base.BaseSubCommand.class)).forEach(field -> fields.add(new CommandField(field, clazz))));
|
||||
if (fields.size() > 0) {
|
||||
fields.sort(Comparator.comparingDouble(commandField -> commandField.getField().getAnnotation(CommandRegister.class).priority()));
|
||||
fields.forEach(commandField -> {
|
||||
try {
|
||||
commandField.getField().setAccessible(true);
|
||||
BaseSubCommand subCommand = (BaseSubCommand) commandField.getField().get(commandField.getParent().newInstance());
|
||||
io.izzel.taboolib.module.command.base.BaseSubCommand subCommand = (io.izzel.taboolib.module.command.base.BaseSubCommand) commandField.getField().get(commandField.getParent().newInstance());
|
||||
subCommand.setLabel(commandField.getField().getName());
|
||||
baseMainCommand.registerSubCommand(subCommand);
|
||||
} catch (Exception ignored) {
|
||||
@@ -71,8 +74,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
||||
});
|
||||
}
|
||||
if (methods.size() + fields.size() > 0) {
|
||||
TabooLib.debug("Registered " + (methods.size() + fields.size()) + " sub-command with " + baseMainCommand.getRegisterCommand().getName() + " (" + baseMainCommand.getRegisterCommand().getPlugin().getName() + ")");
|
||||
// TLocale.Logger.info("COMMANDS.INTERNAL.COMMAND-REGISTER", baseMainCommand.getRegisterCommand().getPlugin().getName(), baseMainCommand.getRegisterCommand().getName(), String.valueOf(methods.size() + fields.size()));
|
||||
TabooLibAPI.debug("Registered " + (methods.size() + fields.size()) + " sub-command with " + baseMainCommand.getRegisterCommand().getName() + " (" + baseMainCommand.getRegisterCommand().getPlugin().getName() + ")");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,11 +90,11 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
||||
return linkClasses;
|
||||
}
|
||||
|
||||
public List<BaseSubCommand> getSubCommands() {
|
||||
public List<io.izzel.taboolib.module.command.base.BaseSubCommand> getSubCommands() {
|
||||
return subCommands;
|
||||
}
|
||||
|
||||
public void registerSubCommand(BaseSubCommand subCommand) {
|
||||
public void registerSubCommand(io.izzel.taboolib.module.command.base.BaseSubCommand subCommand) {
|
||||
if (subCommand != null) {
|
||||
Preconditions.checkArgument(subCommand.getLabel() != null, "Command label can not be null");
|
||||
Preconditions.checkArgument(subCommand.getArguments() != null, "Command arguments can not be null");
|
||||
@@ -120,7 +122,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
||||
});
|
||||
return label.stream().filter(l -> args[0].isEmpty() || l.toLowerCase().startsWith(args[0].toLowerCase())).collect(Collectors.toList());
|
||||
}
|
||||
for (BaseSubCommand subCommand : subCommands) {
|
||||
for (io.izzel.taboolib.module.command.base.BaseSubCommand subCommand : subCommands) {
|
||||
CommandArgument[] arguments = subCommand.getArguments();
|
||||
if (args[0].equalsIgnoreCase(subCommand.getLabel()) && args.length - 1 <= arguments.length) {
|
||||
CommandTab commandTab = arguments[args.length - 2].getTab();
|
||||
@@ -137,15 +139,15 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
||||
if (args.length == 0) {
|
||||
onCommandHelp(sender, command, label, args);
|
||||
} else {
|
||||
for (BaseSubCommand subCommand : subCommands) {
|
||||
if (subCommand == null || !(args[0].equalsIgnoreCase(subCommand.getLabel()) || Arrays.stream(subCommand.getAliases()).anyMatch(args[0]::equalsIgnoreCase)) || !hasPermission(sender, subCommand)) {
|
||||
for (io.izzel.taboolib.module.command.base.BaseSubCommand subCommand : subCommands) {
|
||||
if (subCommand == null || !(args[0].equalsIgnoreCase(subCommand.getLabel()) || java.util.Arrays.stream(subCommand.getAliases()).anyMatch(args[0]::equalsIgnoreCase)) || !hasPermission(sender, subCommand)) {
|
||||
continue;
|
||||
}
|
||||
if (!isConfirmType(sender, subCommand.getType())) {
|
||||
TLocale.sendTo(sender, "COMMANDS.INTERNAL.TYPE-ERROR", args[0], TLocale.asString("COMMANDS.INTERNAL.TYPE-" + subCommand.getType()));
|
||||
return true;
|
||||
}
|
||||
String[] subCommandArgs = ArrayUtils.removeFirst(args);
|
||||
String[] subCommandArgs = ArrayUtil.removeFirst(args);
|
||||
if (subCommand.isParameterConform(subCommandArgs)) {
|
||||
subCommand.onCommand(sender, command, label, subCommand.ignoredLabel() ? subCommandArgs : args);
|
||||
} else {
|
||||
@@ -157,12 +159,12 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
List<BaseSubCommand> commandCompute = subCommands.stream().filter(x -> x != null && hasPermission(sender, x)).sorted((b, a) -> Double.compare(StringUtils.similarDegree(args[0], a.getLabel()), StringUtils.similarDegree(args[0], b.getLabel()))).collect(Collectors.toList());
|
||||
List<io.izzel.taboolib.module.command.base.BaseSubCommand> commandCompute = subCommands.stream().filter(x -> x != null && hasPermission(sender, x)).sorted((b, a) -> Double.compare(Strings.similarDegree(args[0], a.getLabel()), Strings.similarDegree(args[0], b.getLabel()))).collect(Collectors.toList());
|
||||
if (commandCompute.size() > 0) {
|
||||
TLocale.sendTo(sender, "COMMANDS.INTERNAL.ERROR-COMMAND", args[0], commandCompute.get(0).getCommandString(label).trim());
|
||||
}
|
||||
}
|
||||
}.runTaskAsynchronously(Main.getInst());
|
||||
}.runTaskAsynchronously(TabooLib.getPlugin());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -196,7 +198,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
||||
// *********************************
|
||||
|
||||
private String getEmptyLine() {
|
||||
return TabooLib.getVerint() < 10800 ? "~" : "";
|
||||
return Version.isAfter(Version.v1_8) ? "" : "~";
|
||||
}
|
||||
|
||||
private boolean isConfirmType(CommandSender sender, CommandType commandType) {
|
||||
@@ -206,10 +208,10 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
||||
}
|
||||
|
||||
private void disguisedPlugin() {
|
||||
linkClasses.forEach(clazz -> disguisedPlugin(clazz, (JavaPlugin) registerCommand.getPlugin()));
|
||||
linkClasses.forEach(clazz -> disguisedPlugin(clazz, registerCommand.getPlugin()));
|
||||
}
|
||||
|
||||
private void disguisedPlugin(Class<?> targetClass, JavaPlugin plugin) {
|
||||
private void disguisedPlugin(Class<?> targetClass, Plugin plugin) {
|
||||
try {
|
||||
Field pluginField = targetClass.getClassLoader().getClass().getDeclaredField("plugin");
|
||||
pluginField.setAccessible(true);
|
||||
@@ -218,7 +220,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hideInHelp(BaseSubCommand baseSubCommand) {
|
||||
private boolean hideInHelp(io.izzel.taboolib.module.command.base.BaseSubCommand baseSubCommand) {
|
||||
return baseSubCommand != null && baseSubCommand.hideInHelp();
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package me.skymc.taboolib.commands.internal;
|
||||
package io.izzel.taboolib.module.command.base;
|
||||
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import me.skymc.taboolib.commands.internal.type.CommandArgument;
|
||||
import me.skymc.taboolib.commands.internal.type.CommandType;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package me.skymc.taboolib.commands.internal.type;
|
||||
package io.izzel.taboolib.module.command.base;
|
||||
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.commands.internal.type;
|
||||
package io.izzel.taboolib.module.command.base;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.commands.internal.type;
|
||||
package io.izzel.taboolib.module.command.base;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.commands.internal.type;
|
||||
package io.izzel.taboolib.module.command.base;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.commands.internal.type;
|
||||
package io.izzel.taboolib.module.command.base;
|
||||
|
||||
/**
|
||||
* @author Bkm016
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.commands.builder.type;
|
||||
package io.izzel.taboolib.module.command.lite;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
@@ -9,6 +9,6 @@ import org.bukkit.command.CommandSender;
|
||||
*/
|
||||
public interface CompleterCommand {
|
||||
|
||||
boolean execute(CommandSender sender, String[] args);
|
||||
void execute(CommandSender sender, String[] args);
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.commands.builder.type;
|
||||
package io.izzel.taboolib.module.command.lite;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
package me.skymc.taboolib.commands.builder;
|
||||
package io.izzel.taboolib.module.command.lite;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.Lists;
|
||||
import me.skymc.taboolib.commands.builder.type.CompleterCommand;
|
||||
import me.skymc.taboolib.commands.builder.type.CompleterTab;
|
||||
import me.skymc.taboolib.commands.internal.TCommandHandler;
|
||||
import me.skymc.taboolib.string.ArrayUtils;
|
||||
import io.izzel.taboolib.module.command.TCommandHandler;
|
||||
import io.izzel.taboolib.util.ArrayUtil;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -19,7 +16,7 @@ import java.util.List;
|
||||
public class SimpleCommandBuilder {
|
||||
|
||||
public static final CompleterTab EMPTY_COMPLETER_TAB = ((sender, args) -> new ArrayList<>());
|
||||
public static final CompleterCommand EMPTY_COMPLETER_COMMAND = ((sender, args) -> false);
|
||||
public static final CompleterCommand EMPTY_COMPLETER_COMMAND = ((sender, args) -> {});
|
||||
|
||||
private String command;
|
||||
private Plugin plugin;
|
||||
@@ -30,7 +27,6 @@ public class SimpleCommandBuilder {
|
||||
private String permissionMessage;
|
||||
private CompleterTab completerTab = EMPTY_COMPLETER_TAB;
|
||||
private CompleterCommand completerCommand = EMPTY_COMPLETER_COMMAND;
|
||||
private boolean silence;
|
||||
private boolean forceRegister;
|
||||
private boolean build;
|
||||
|
||||
@@ -40,7 +36,6 @@ public class SimpleCommandBuilder {
|
||||
this.description = "";
|
||||
this.usage = "/" + command;
|
||||
this.aliases = new ArrayList<>();
|
||||
this.silence = false;
|
||||
this.build = false;
|
||||
}
|
||||
|
||||
@@ -69,7 +64,7 @@ public class SimpleCommandBuilder {
|
||||
}
|
||||
|
||||
public SimpleCommandBuilder aliases(String... aliases) {
|
||||
this.aliases = ArrayUtils.asList(aliases);
|
||||
this.aliases = ArrayUtil.asList(aliases);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -93,12 +88,6 @@ public class SimpleCommandBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public SimpleCommandBuilder silence() {
|
||||
this.silence = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SimpleCommandBuilder forceRegister() {
|
||||
this.forceRegister = true;
|
||||
return this;
|
||||
@@ -121,12 +110,8 @@ public class SimpleCommandBuilder {
|
||||
permission,
|
||||
permissionMessage,
|
||||
(sender, command, s, args) -> {
|
||||
try {
|
||||
return completerCommand.execute(sender, args);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
completerCommand.execute(sender, args);
|
||||
return true;
|
||||
},
|
||||
(sender, command, s, args) -> {
|
||||
try {
|
||||
@@ -134,9 +119,8 @@ public class SimpleCommandBuilder {
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
return Lists.newArrayList();
|
||||
},
|
||||
silence);
|
||||
return null;
|
||||
});
|
||||
build = true;
|
||||
return this;
|
||||
}
|
||||
@@ -183,10 +167,6 @@ public class SimpleCommandBuilder {
|
||||
return completerCommand;
|
||||
}
|
||||
|
||||
public boolean isSilence() {
|
||||
return silence;
|
||||
}
|
||||
|
||||
public boolean isForceRegister() {
|
||||
return forceRegister;
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package io.izzel.taboolib.module.compat;
|
||||
|
||||
import io.izzel.taboolib.module.inject.TFunction;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
|
||||
/**
|
||||
* @Author 坏黑
|
||||
* @Since 2019-07-05 18:50
|
||||
*/
|
||||
@TFunction(enable = "init")
|
||||
public class EconomyHook {
|
||||
|
||||
private static Economy economy;
|
||||
|
||||
static void init() {
|
||||
if (Bukkit.getPluginManager().getPlugin("Vault") == null) {
|
||||
return;
|
||||
}
|
||||
RegisteredServiceProvider<Economy> l = Bukkit.getServer().getServicesManager().getRegistration(Economy.class);
|
||||
if (l != null) {
|
||||
economy = l.getProvider();
|
||||
}
|
||||
}
|
||||
|
||||
public static void remove(OfflinePlayer p, double d) {
|
||||
economy.withdrawPlayer(p, d);
|
||||
}
|
||||
|
||||
public static void add(OfflinePlayer p, double d) {
|
||||
economy.depositPlayer(p, d);
|
||||
}
|
||||
|
||||
public static void set(OfflinePlayer p, double d) {
|
||||
add(p, d - get(p));
|
||||
}
|
||||
|
||||
public static double get(OfflinePlayer p) {
|
||||
return economy.getBalance(p);
|
||||
}
|
||||
|
||||
public static void create(OfflinePlayer p) {
|
||||
economy.createPlayerAccount(p);
|
||||
}
|
||||
|
||||
public static boolean exists() {
|
||||
return economy != null;
|
||||
}
|
||||
|
||||
public static net.milkbowl.vault.economy.Economy getEconomy() {
|
||||
return economy;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package io.izzel.taboolib.module.compat;
|
||||
|
||||
import io.izzel.taboolib.module.inject.TFunction;
|
||||
import net.milkbowl.vault.permission.Permission;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@TFunction(enable = "init")
|
||||
public class PermissionHook {
|
||||
|
||||
private static Permission perms;
|
||||
|
||||
static void init() {
|
||||
if (Bukkit.getPluginManager().getPlugin("Vault") == null) {
|
||||
return;
|
||||
}
|
||||
RegisteredServiceProvider<Permission> rsp = Bukkit.getServer().getServicesManager().getRegistration(Permission.class);
|
||||
perms = rsp.getProvider();
|
||||
}
|
||||
|
||||
public static Permission getPermission() {
|
||||
return perms;
|
||||
}
|
||||
|
||||
public static void addPermission(Player player, String perm) {
|
||||
perms.playerAdd(player, perm);
|
||||
}
|
||||
|
||||
public static void removePermission(Player player, String perm) {
|
||||
perms.playerRemove(player, perm);
|
||||
}
|
||||
|
||||
public static boolean hasPermission(Player player, String perm) {
|
||||
return perms.playerHas(player, perm) || Arrays.stream(perms.getPlayerGroups(player)).anyMatch(group -> perms.groupHas(player.getWorld(), group, perm));
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,17 @@
|
||||
package com.ilummc.tlib.compat;
|
||||
package io.izzel.taboolib.module.compat;
|
||||
|
||||
import me.clip.placeholderapi.PlaceholderAPI;
|
||||
import io.izzel.taboolib.module.inject.TFunction;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@TFunction(enable = "init")
|
||||
public abstract class PlaceholderHook {
|
||||
|
||||
private static PlaceholderHook impl;
|
||||
|
||||
public static void init() {
|
||||
static void init() {
|
||||
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
|
||||
impl = new PlaceholderImpl();
|
||||
} else {
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.support;
|
||||
package io.izzel.taboolib.module.compat;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||
@@ -19,13 +19,13 @@ import java.util.stream.Collectors;
|
||||
/**
|
||||
* @Author AgarthaLib
|
||||
*/
|
||||
public class SupportWorldGuard {
|
||||
public class WorldGuardHook {
|
||||
|
||||
public static final SupportWorldGuard INSTANCE = new SupportWorldGuard();
|
||||
public static final WorldGuardHook INSTANCE = new WorldGuardHook();
|
||||
private WorldGuardPlugin worldGuard;
|
||||
private Method getRegionManager;
|
||||
|
||||
public SupportWorldGuard() {
|
||||
public WorldGuardHook() {
|
||||
Preconditions.checkNotNull(Bukkit.getServer().getPluginManager().getPlugin("WorldGuard"), "WorldGuard was not found.");
|
||||
worldGuard = WorldGuardPlugin.inst();
|
||||
if (!worldGuard.getDescription().getVersion().startsWith("7")) {
|
||||
@@ -1,12 +1,12 @@
|
||||
package me.skymc.taboolib.common.configuration;
|
||||
package io.izzel.taboolib.module.config;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.ilummc.tlib.TLib;
|
||||
import com.ilummc.tlib.logger.TLogger;
|
||||
import com.ilummc.tlib.resources.TLocale;
|
||||
import com.ilummc.tlib.util.Ref;
|
||||
import me.skymc.taboolib.Main;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import io.izzel.taboolib.TabooLib;
|
||||
import io.izzel.taboolib.TabooLibAPI;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import io.izzel.taboolib.module.logger.TLogger;
|
||||
import io.izzel.taboolib.util.Files;
|
||||
import io.izzel.taboolib.util.Ref;
|
||||
import org.bukkit.configuration.InvalidConfigurationException;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
@@ -22,56 +22,36 @@ import java.util.Optional;
|
||||
* @Author sky
|
||||
* @Since 2018-09-08 15:00
|
||||
*/
|
||||
public class TConfiguration extends YamlConfiguration {
|
||||
public class TConfig extends YamlConfiguration {
|
||||
|
||||
private static Map<String, List<File>> files = Maps.newHashMap();
|
||||
private File file;
|
||||
private Runnable runnable;
|
||||
|
||||
private TConfiguration(File file, Plugin plugin) {
|
||||
private TConfig(File file, Plugin plugin) {
|
||||
files.computeIfAbsent(plugin.getName(), name -> new ArrayList<>()).add(file);
|
||||
this.file = file;
|
||||
reload();
|
||||
TLib.getTLib().getConfigWatcher().addSimpleListener(this.file, this::reload);
|
||||
TabooLib.debug("Loaded TConfiguration \"" + file.getName() + "\" from Plugin \"" + plugin.getName() + "\"");
|
||||
TConfigWatcher.getInst().addSimpleListener(this.file, this::reload);
|
||||
TabooLibAPI.debug("Loaded TConfiguration \"" + file.getName() + "\" from Plugin \"" + plugin.getName() + "\"");
|
||||
}
|
||||
|
||||
public static Map<String, List<File>> getFiles() {
|
||||
return files;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建配置文件
|
||||
*
|
||||
* @param file 文件
|
||||
* @return {@link TConfiguration}
|
||||
*/
|
||||
public static TConfiguration create(File file) {
|
||||
return new TConfiguration(file, Ref.getCallerPlugin(Ref.getCallerClass(3).orElse(Main.class)));
|
||||
public static TConfig create(File file) {
|
||||
return new TConfig(file, Ref.getCallerPlugin(Ref.getCallerClass(3).orElse(TabooLib.class)));
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建配置文件
|
||||
*
|
||||
* @param file 文件
|
||||
* @param plugin 插件
|
||||
* @return {@link TConfiguration}
|
||||
*/
|
||||
public static TConfiguration create(File file, Plugin plugin) {
|
||||
return new TConfiguration(file, plugin);
|
||||
public static TConfig create(File file, Plugin plugin) {
|
||||
return new TConfig(file, plugin);
|
||||
}
|
||||
|
||||
/**
|
||||
* 从插件里释放文件并创建
|
||||
*
|
||||
* @param plugin 插件
|
||||
* @param path 目录
|
||||
* @return {@link TConfiguration}
|
||||
*/
|
||||
public static TConfiguration createInResource(Plugin plugin, String path) {
|
||||
public static TConfig create(Plugin plugin, String path) {
|
||||
File file = new File(plugin.getDataFolder(), path);
|
||||
if (!file.exists()) {
|
||||
plugin.saveResource(path, true);
|
||||
Files.releaseResource(plugin, path, false);
|
||||
}
|
||||
return create(file, plugin);
|
||||
}
|
||||
@@ -89,7 +69,7 @@ public class TConfiguration extends YamlConfiguration {
|
||||
}
|
||||
|
||||
public void release() {
|
||||
TLib.getTLib().getConfigWatcher().removeListener(file);
|
||||
TConfigWatcher.getInst().removeListener(file);
|
||||
}
|
||||
|
||||
public void reload() {
|
||||
@@ -111,7 +91,7 @@ public class TConfiguration extends YamlConfiguration {
|
||||
return file;
|
||||
}
|
||||
|
||||
public TConfiguration listener(Runnable runnable) {
|
||||
public TConfig listener(Runnable runnable) {
|
||||
this.runnable = runnable;
|
||||
return this;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.ilummc.tlib.inject;
|
||||
package io.izzel.taboolib.module.config;
|
||||
|
||||
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
|
||||
import org.apache.commons.lang3.tuple.Triple;
|
||||
@@ -19,6 +19,7 @@ import java.util.function.Consumer;
|
||||
*/
|
||||
public class TConfigWatcher {
|
||||
|
||||
private static TConfigWatcher configWatcher = new TConfigWatcher();
|
||||
private final ScheduledExecutorService service = Executors.newScheduledThreadPool(1, new BasicThreadFactory.Builder().namingPattern("TConfigWatcherService-%d").build());
|
||||
private final Map<WatchService, Triple<File, Object, Consumer<Object>>> map = new HashMap<>();
|
||||
|
||||
@@ -40,6 +41,10 @@ public class TConfigWatcher {
|
||||
}, 1000, 100, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
public static TConfigWatcher getInst() {
|
||||
return configWatcher;
|
||||
}
|
||||
|
||||
public void addSimpleListener(File file, Runnable runnable) {
|
||||
addListener(file, null, obj -> runnable.run());
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.ilummc.tlib.annotations;
|
||||
package io.izzel.taboolib.module.dependency;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
@@ -1,6 +1,4 @@
|
||||
package com.ilummc.tlib.annotations;
|
||||
|
||||
import com.ilummc.tlib.dependency.TDependency;
|
||||
package io.izzel.taboolib.module.dependency;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
package io.izzel.taboolib.module.dependency;
|
||||
|
||||
import io.izzel.taboolib.TabooLib;
|
||||
import io.izzel.taboolib.util.Files;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class TDependency {
|
||||
|
||||
// 阿里 http://maven.aliyun.com/nexus/content/groups/public
|
||||
public static final String MAVEN_REPO = "http://repo1.maven.org/maven2";
|
||||
|
||||
/**
|
||||
* 请求一个插件作为依赖,这个插件将会在所有已经添加的 Jenkins 仓库、Maven 仓库寻找
|
||||
* <p>
|
||||
* 阻塞线程进行下载/加载
|
||||
*
|
||||
* @param args 插件名称,下载地址(可选)
|
||||
* @return 是否成功加载了依赖
|
||||
*/
|
||||
public static boolean requestPlugin(String... args) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求一个库作为依赖,这个库将会在 Maven Central、oss.sonatype 以及自定义的 Maven 仓库寻找
|
||||
* <p>
|
||||
* 阻塞线程进行下载/加载
|
||||
*
|
||||
* @param type 依赖名,格式为 groupId:artifactId:version
|
||||
* @return 是否成功加载库,如果加载成功,插件将可以任意调用使用的类
|
||||
*/
|
||||
public static boolean requestLib(String type, String repo, String url) {
|
||||
// 清理大小为 0 的依赖文件
|
||||
File libFolder = new File(TabooLib.getPlugin().getDataFolder(), "/libs");
|
||||
if (libFolder.exists()) {
|
||||
Arrays.stream(libFolder.listFiles()).filter(listFile -> listFile.length() == 0).forEach(File::delete);
|
||||
}
|
||||
if (type.matches(".*:.*:.*")) {
|
||||
String[] arr = type.split(":");
|
||||
File file = new File(TabooLib.getPlugin().getDataFolder(), "/libs/" + String.join("-", arr) + ".jar");
|
||||
if (file.exists()) {
|
||||
TDependencyLoader.addToPath(TabooLib.getPlugin(), file);
|
||||
return true;
|
||||
} else {
|
||||
if (downloadMaven(repo, arr[0], arr[1], arr[2], file, url)) {
|
||||
TDependencyLoader.addToPath(TabooLib.getPlugin(), file);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean downloadMaven(String url, String groupId, String artifactId, String version, File target, String dl) {
|
||||
Files.toFile(Files.readFromURL(dl.length() == 0 ? url + "/" + groupId.replace('.', '/') + "/" + artifactId + "/" + version + "/" + artifactId + "-" + version + ".jar" : dl, ""), Files.file(target));
|
||||
return target.length() > 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package io.izzel.taboolib.module.dependency;
|
||||
|
||||
import io.izzel.taboolib.TabooLibAPI;
|
||||
import io.izzel.taboolib.locale.TLocale;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
/**
|
||||
* @author Izzel_Aliz
|
||||
*/
|
||||
public class TDependencyInjector {
|
||||
|
||||
public static Dependency[] getDependencies(Class<?> clazz) {
|
||||
Dependency[] dependencies = new Dependency[0];
|
||||
Dependencies d = clazz.getAnnotation(Dependencies.class);
|
||||
if (d != null) {
|
||||
dependencies = d.value();
|
||||
}
|
||||
Dependency d2 = clazz.getAnnotation(Dependency.class);
|
||||
if (d2 != null) {
|
||||
dependencies = new Dependency[] {d2};
|
||||
}
|
||||
return dependencies;
|
||||
}
|
||||
|
||||
public static void inject(Plugin plugin, Class<?> clazz) {
|
||||
inject(plugin.getName(), clazz);
|
||||
}
|
||||
|
||||
public static void inject(String name, Class<?> clazz) {
|
||||
for (Dependency dependency : getDependencies(clazz)) {
|
||||
if (dependency.type() == Dependency.Type.LIBRARY) {
|
||||
if (TDependency.requestLib(dependency.maven(), dependency.mavenRepo(), dependency.url())) {
|
||||
TabooLibAPI.debug(" Loaded " + String.join(":", dependency.maven()) + " (" + name + ")");
|
||||
} else {
|
||||
TLocale.Logger.warn("DEPENDENCY.LIBRARY-LOAD-FAIL", name, String.join(":", dependency.maven()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.common.playercontainer;
|
||||
package io.izzel.taboolib.module.inject;
|
||||
|
||||
/**
|
||||
* @author sky
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.common.playercontainer;
|
||||
package io.izzel.taboolib.module.inject;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
@@ -1,9 +1,7 @@
|
||||
package me.skymc.taboolib.common.playercontainer;
|
||||
package io.izzel.taboolib.module.inject;
|
||||
|
||||
import com.ilummc.tlib.logger.TLogger;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import me.skymc.taboolib.TabooLibLoader;
|
||||
import org.bukkit.Bukkit;
|
||||
import io.izzel.taboolib.TabooLibLoader;
|
||||
import io.izzel.taboolib.module.logger.TLogger;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
@@ -21,13 +19,10 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
* @Author sky
|
||||
* @Since 2018-09-14 23:45
|
||||
*/
|
||||
@TListener
|
||||
public class PlayerContainerLoader implements Listener, TabooLibLoader.Loader {
|
||||
|
||||
Map<String, List<Container>> pluginContainer = new ConcurrentHashMap<>();
|
||||
|
||||
PlayerContainerLoader() {
|
||||
Bukkit.getPluginManager().registerEvents(this, TabooLib.instance());
|
||||
}
|
||||
static Map<String, List<Container>> pluginContainer = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
public void postLoad(Plugin plugin, Class<?> pluginClass) {
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.common.function;
|
||||
package io.izzel.taboolib.module.inject;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
@@ -1,8 +1,8 @@
|
||||
package me.skymc.taboolib.common.function;
|
||||
package io.izzel.taboolib.module.inject;
|
||||
|
||||
import com.ilummc.tlib.logger.TLogger;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import me.skymc.taboolib.TabooLibLoader;
|
||||
import io.izzel.taboolib.TabooLibAPI;
|
||||
import io.izzel.taboolib.TabooLibLoader;
|
||||
import io.izzel.taboolib.module.logger.TLogger;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
@@ -26,7 +26,7 @@ public class TFunctionLoader implements TabooLibLoader.Loader {
|
||||
}
|
||||
method.setAccessible(true);
|
||||
method.invoke(null);
|
||||
TabooLib.debug("Function " + pluginClass.getSimpleName() + " loaded. (" + plugin.getName() + ")");
|
||||
TabooLibAPI.debug("Function " + pluginClass.getSimpleName() + " loaded. (" + plugin.getName() + ")");
|
||||
} catch (NoSuchMethodException ignore) {
|
||||
} catch (Exception e) {
|
||||
TLogger.getGlobalLogger().warn("TFunction load Failed: " + pluginClass.getName());
|
||||
@@ -47,7 +47,7 @@ public class TFunctionLoader implements TabooLibLoader.Loader {
|
||||
}
|
||||
method.setAccessible(true);
|
||||
method.invoke(null);
|
||||
TabooLib.debug("Function " + pluginClass.getSimpleName() + " unloaded. (" + plugin.getName() + ")");
|
||||
TabooLibAPI.debug("Function " + pluginClass.getSimpleName() + " unloaded. (" + plugin.getName() + ")");
|
||||
} catch (NoSuchMethodException ignore) {
|
||||
} catch (Exception e) {
|
||||
TLogger.getGlobalLogger().warn("TFunction unload Failed: " + pluginClass.getName());
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.common.inject;
|
||||
package io.izzel.taboolib.module.inject;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
@@ -1,15 +1,15 @@
|
||||
package me.skymc.taboolib.common.inject;
|
||||
package io.izzel.taboolib.module.inject;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.ilummc.tlib.logger.TLogger;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import me.skymc.taboolib.TabooLibLoader;
|
||||
import me.skymc.taboolib.commands.builder.SimpleCommandBuilder;
|
||||
import me.skymc.taboolib.common.configuration.TConfiguration;
|
||||
import me.skymc.taboolib.common.packet.TPacketHandler;
|
||||
import me.skymc.taboolib.common.packet.TPacketListener;
|
||||
import me.skymc.taboolib.cooldown.seconds.CooldownPack2;
|
||||
import me.skymc.taboolib.cooldown.seconds.CooldownUtils2;
|
||||
import io.izzel.taboolib.TabooLibAPI;
|
||||
import io.izzel.taboolib.TabooLibLoader;
|
||||
import io.izzel.taboolib.module.command.lite.SimpleCommandBuilder;
|
||||
import io.izzel.taboolib.module.config.TConfig;
|
||||
import io.izzel.taboolib.module.logger.TLogger;
|
||||
import io.izzel.taboolib.module.packet.TPacketHandler;
|
||||
import io.izzel.taboolib.module.packet.TPacketListener;
|
||||
import io.izzel.taboolib.origin.lite.cooldown.Cooldown;
|
||||
import io.izzel.taboolib.origin.lite.cooldown.Cooldowns;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
@@ -50,9 +50,9 @@ public class TInjectLoader implements TabooLibLoader.Loader {
|
||||
}
|
||||
});
|
||||
// TConfiguration Inject
|
||||
injectTypes.put(TConfiguration.class, (plugin, field, args, instance) -> {
|
||||
injectTypes.put(TConfig.class, (plugin, field, args, instance) -> {
|
||||
try {
|
||||
field.set(instance, TConfiguration.createInResource(plugin, args.length == 0 ? "config.yml" : args[0]));
|
||||
field.set(instance, TConfig.create(plugin, args.length == 0 ? "config.yml" : args[0]));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -74,9 +74,9 @@ public class TInjectLoader implements TabooLibLoader.Loader {
|
||||
}
|
||||
});
|
||||
// CooldownPack Inject
|
||||
injectTypes.put(CooldownPack2.class, (plugin, field, args, instance) -> {
|
||||
injectTypes.put(Cooldown.class, (plugin, field, args, instance) -> {
|
||||
try {
|
||||
CooldownUtils2.register((CooldownPack2) field.get(instance), plugin);
|
||||
Cooldowns.register((Cooldown) field.get(instance), plugin);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
@@ -142,7 +142,7 @@ public class TInjectLoader implements TabooLibLoader.Loader {
|
||||
try {
|
||||
field.setAccessible(true);
|
||||
injectTask.run(plugin, field, annotation.value(), instance);
|
||||
TabooLib.debug(field.getName() + " injected. (" + field.getType().getName() + ")");
|
||||
TabooLibAPI.debug(field.getName() + " injected. (" + field.getType().getName() + ")");
|
||||
} catch (Throwable e) {
|
||||
TLogger.getGlobalLogger().error(field.getName() + " inject failed: " + e.getMessage() + " (" + field.getType().getName() + ")");
|
||||
if (e.getMessage() == null) {
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.common.inject;
|
||||
package io.izzel.taboolib.module.inject;
|
||||
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.listener;
|
||||
package io.izzel.taboolib.module.inject;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
@@ -1,18 +1,15 @@
|
||||
package me.skymc.taboolib.listener;
|
||||
package io.izzel.taboolib.module.inject;
|
||||
|
||||
import com.ilummc.tlib.logger.TLogger;
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import me.skymc.taboolib.TabooLibLoader;
|
||||
import me.skymc.taboolib.cronus.util.StringExpression;
|
||||
import me.skymc.taboolib.events.TPluginEnableEvent;
|
||||
import me.skymc.taboolib.methods.ReflectionUtils;
|
||||
import io.izzel.taboolib.TabooLibAPI;
|
||||
import io.izzel.taboolib.TabooLibLoader;
|
||||
import io.izzel.taboolib.Version;
|
||||
import io.izzel.taboolib.module.logger.TLogger;
|
||||
import io.izzel.taboolib.origin.cronus.util.StringExpression;
|
||||
import io.izzel.taboolib.util.Strings;
|
||||
import io.izzel.taboolib.util.Reflection;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.server.PluginDisableEvent;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
@@ -22,8 +19,7 @@ import java.util.*;
|
||||
* @Author sky
|
||||
* @Since 2018-08-22 13:48
|
||||
*/
|
||||
@TListener
|
||||
public class TListenerHandler implements Listener {
|
||||
public class TListenerHandler {
|
||||
|
||||
private static HashMap<String, List<Listener>> listeners = new HashMap<>();
|
||||
|
||||
@@ -52,7 +48,7 @@ public class TListenerHandler implements Listener {
|
||||
try {
|
||||
TListener tListener = pluginClass.getAnnotation(TListener.class);
|
||||
// 检查版本
|
||||
if (!new StringExpression(tListener.version()).isSelect(TabooLib.getVersionNumber())) {
|
||||
if (!new StringExpression(tListener.version()).isSelect(Version.getCurrentVersion().getVersionInt())) {
|
||||
continue;
|
||||
}
|
||||
// 检查注册条件
|
||||
@@ -62,16 +58,16 @@ public class TListenerHandler implements Listener {
|
||||
}
|
||||
}
|
||||
// 实例化监听器
|
||||
Listener listener = plugin.getClass().equals(pluginClass) ? (Listener) plugin : (Listener) ReflectionUtils.instantiateObject(pluginClass);
|
||||
Listener listener = plugin.getClass().equals(pluginClass) ? (Listener) plugin : (Listener) Reflection.instantiateObject(pluginClass);
|
||||
try {
|
||||
listeners.computeIfAbsent(plugin.getName(), name -> new ArrayList<>()).add(listener);
|
||||
TabooLib.debug("Listener " + listener.getClass().getSimpleName() + " setup successfully. (" + plugin.getName() + ")");
|
||||
TabooLibAPI.debug("Listener " + listener.getClass().getSimpleName() + " setup successfully. (" + plugin.getName() + ")");
|
||||
} catch (Exception e) {
|
||||
TLogger.getGlobalLogger().warn("TListener setup Failed: " + pluginClass.getName());
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
TabooLib.debug("Listener " + pluginClass.getSimpleName() + "(" + plugin.getName() + ")" + " setup failed: " + e.toString());
|
||||
TabooLibAPI.debug("Listener " + pluginClass.getSimpleName() + "(" + plugin.getName() + ")" + " setup failed: " + e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -124,7 +120,7 @@ public class TListenerHandler implements Listener {
|
||||
}
|
||||
// 注册监听
|
||||
Bukkit.getPluginManager().registerEvents(listener, plugin);
|
||||
TabooLib.debug("Listener " + listener.getClass().getSimpleName() + " registered. (" + plugin.getName() + ")");
|
||||
TabooLibAPI.debug("Listener " + listener.getClass().getSimpleName() + " registered. (" + plugin.getName() + ")");
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -169,21 +165,4 @@ public class TListenerHandler implements Listener {
|
||||
public static HashMap<String, List<Listener>> getListeners() {
|
||||
return listeners;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
public void onPluginEnable(TPluginEnableEvent e) {
|
||||
try {
|
||||
setupListener(e.getPlugin());
|
||||
Bukkit.getScheduler().runTask(TabooLib.instance(), () -> registerListener(e.getPlugin()));
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPluginDisable(PluginDisableEvent e) {
|
||||
try {
|
||||
cancelListener(e.getPlugin());
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package me.skymc.taboolib.common.schedule;
|
||||
package io.izzel.taboolib.module.inject;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user