diff --git a/.classpath b/.classpath
deleted file mode 100644
index 1921f5d..0000000
--- a/.classpath
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.project b/.project
deleted file mode 100644
index 7ebb49d..0000000
--- a/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
- MiaoScript
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.m2e.core.maven2Builder
-
-
-
-
-
- org.eclipse.m2e.core.maven2Nature
- org.eclipse.jdt.core.javanature
-
-
diff --git a/lib/PlaceholderAPI.jar b/lib/PlaceholderAPI.jar
deleted file mode 100644
index 87bd3ab..0000000
Binary files a/lib/PlaceholderAPI.jar and /dev/null differ
diff --git a/obf.dict b/obf.dict
new file mode 100644
index 0000000..9ea3b95
--- /dev/null
+++ b/obf.dict
@@ -0,0 +1,105 @@
+™
+▄
+▒
+░
+▓
+™™
+▄™
+▒™
+░™
+▓™
+™▄
+▄▄
+▒▄
+░▄
+▓▄
+™▒
+▄▒
+▒▒
+░▒
+▓▒
+™░
+▄░
+▒░
+░░
+▓░
+™▓
+▄▓
+▒▓
+░▓
+▓▓
+ ™
+™▄
+™▒
+™░
+™▓
+▄™
+▄▄
+▄▒
+▄░
+▄▓
+▒™
+▒▄
+ ▒
+▒░
+▒▓
+░™
+░▄
+░▒
+ ░
+░▓
+▓™
+▓▄
+▓▒
+▓░
+ ▓
+™™™
+▄™▄
+▒™▒
+░™░
+▓™▓
+™▄™
+▄▄▄
+▒▄▒
+░▄░
+▓▄▓
+™▒™
+▄▒▄
+▒▒▒
+░▒░
+▓▒▓
+™░™
+▄░▄
+▒░▒
+░░░
+▓░▓
+™▓™
+▄▓▄
+▒▓▒
+░▓░
+▓▓▓
+™ ™
+™▄™
+™▒™
+™░™
+™▓™
+▄™▄
+▄ ▄
+▄▒▄
+▄░▄
+▄▓▄
+▒™▒
+▒▄▒
+▒ ▒
+▒░▒
+▒▓▒
+░™░
+░▄░
+░▒░
+░ ░
+░▓░
+▓™▓
+▓▄▓
+▓▒▓
+▓░▓
+▓ ▓
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 44e4005..2deb9a5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,113 +1,114 @@
- 4.0.0
- pw.yumc
- MiaoScript
- 1.1
-
- ${project.name}
-
-
- src/main/resources
- true
-
-
-
-
- maven-compiler-plugin
- 3.3
-
-
- 1.7
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- 2.3
-
- false
- true
-
-
- pw.yumc:YumCore
- cn.citycraft:PluginHelper
-
-
-
-
- pw.yumc.YumCore
- ${project.groupId}.${project.artifactId}
-
-
- cn.citycraft.PluginHelper
- ${project.groupId}.${project.artifactId}
-
-
-
-
-
- package
-
- shade
-
-
-
-
-
-
-
- Jenkins
- http://ci.yumc.pw/job/${project.artifactId}/
-
-
-
-
- 开发版本
- UTF-8
-
-
-
- spigot-repo
- https://hub.spigotmc.org/nexus/content/groups/public/
-
-
- yumc-repo
- http://repo.yumc.pw/content/groups/public/
-
-
-
-
- jtb
- YUMC
- http://repo.yumc.pw/content/repositories/yumcenter/
-
-
-
-
- org.spigotmc
- spigot-api
- jar
- 1.10.2-R0.1-SNAPSHOT
-
-
- cn.citycraft
- PluginHelper
- jar
- 1.0
-
-
- pw.yumc
- YumCore
- jar
- 1.0
-
-
- pw.yumc
- PlaceholderAPI
- 1.0
- system
- ${project.basedir}/lib/PlaceholderAPI.jar
-
-
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ pw.yumc
+ MiaoScript
+ 1.0
+
+
+ 502647092
+ 喵♂呜
+ admin@yumc.pw
+ http://www.yumc.pw
+
+
+
+ ${project.artifactId}
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 2.4.3
+
+
+ package
+
+ shade
+
+
+ false
+ true
+
+
+ pw.yumc:YumCore
+
+
+
+
+ pw.yumc.YumCore
+ ${project.groupId}.${project.artifactId}
+
+
+
+
+
+
+
+ com.github.wvengen
+ proguard-maven-plugin
+ 2.0.13
+
+
+ package
+
+ proguard
+
+
+
+
+
+
+
+
+ ${java.home}/lib/rt.jar
+
+
+
+
+
+
+
+
+ Jenkins
+ http://ci.yumc.pw/job/${project.artifactId}/
+
+
+ DEV
+ UTF-8
+ 1.8
+ 1.8
+
+
+
+ yumc-repo
+ http://repo.yumc.pw/content/groups/public/
+
+
+
+
+ yumc-repo
+ http://repo.yumc.pw/content/groups/public/
+
+
+
+
+ jtb
+ YUMC
+ http://repo.yumc.pw/content/repositories/yumcenter/
+
+
+
+
+ pw.yumc
+ YumCore
+ jar
+ [1.8,)
+
+
\ No newline at end of file
diff --git a/proguard.conf b/proguard.conf
new file mode 100644
index 0000000..1c77b9f
--- /dev/null
+++ b/proguard.conf
@@ -0,0 +1,55 @@
+# -----不优化-----
+-dontoptimize
+
+# -----忽略所有警告-----
+-dontwarn
+-dontnote
+
+# -----混淆时应用侵入式重载-----
+-overloadaggressively
+
+# -----启用混淆字典-----
+-obfuscationdictionary obf.dict
+-classobfuscationdictionary obf.dict
+-packageobfuscationdictionary obf.dict
+
+# -----保留所有属性
+-keepattributes **
+
+# -----保护所有实体中的字段名称-----
+-keepclassmembers class * implements java.io.Serializable { ; }
+
+# -----保护监听方法不被清理-----
+-keepclassmembers class * implements org.bukkit.event.Listener {
+ @org.bukkit.event.EventHandler ;
+}
+-keepclassmembers class * implements net.md_5.bungee.api.plugin.Listener {
+ @net.md_5.bungee.event.EventHandler ;
+}
+
+# -----保护继承事件不被清理-----
+-keep class ** extends org.bukkit.event.Event {*;}
+
+# -----保护枚举方法的完整性-----
+-keepclassmembers enum * {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+# -----保护配置注入不被清理-----
+-keepclassmembers class * extends **.config.inject.Inject** {
+ ;
+ public (org.bukkit.configuration.ConfigurationSection);
+}
+
+# -----保护注解命令方法不被清理-----
+-keepclassmembers class **.commands.annotation.** {;}
+-keepclassmembers class * implements **.commands.interfaces.Executor {;}
+
+# -----保护注解NotProguard标记-----
+-keep class **.NotProguard
+-keep @**.NotProguard class * {*;}
+-keepclassmembers class * {
+ @**.NotProguard ;
+ @**.NotProguard ;
+}
\ No newline at end of file
diff --git a/src/main/java/pw/yumc/MiaoScript/ManagerCenter.java b/src/main/java/pw/yumc/MiaoScript/ManagerCenter.java
deleted file mode 100644
index fb7a4de..0000000
--- a/src/main/java/pw/yumc/MiaoScript/ManagerCenter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package pw.yumc.MiaoScript;
-
-import org.bukkit.configuration.ConfigurationSection;
-
-import pw.yumc.MiaoScript.data.ConfigManager;
-import pw.yumc.MiaoScript.data.SQLManager;
-import pw.yumc.MiaoScript.event.EventManager;
-import pw.yumc.MiaoScript.module.ModuleManager;
-import pw.yumc.MiaoScript.script.ScriptManager;
-import pw.yumc.YumCore.bukkit.P;
-import pw.yumc.YumCore.config.FileConfig;
-
-/**
- * 管理中心
- *
- * @author 喵♂呜
- * @since 2016年8月29日 上午7:50:50
- */
-public class ManagerCenter {
- private final MiaoScript plugin = P.getPlugin();
- private final ConfigurationSection dbCfg;
- private final SQLManager sqlManager;
- private final EventManager eventManager;
- private final ModuleManager moduleManager;
- private final ConfigManager configManager;
- private final ScriptManager scriptManager;
-
- public ManagerCenter() {
- dbCfg = plugin.getConfig().getConfigurationSection("DataBase");
- configManager = new ConfigManager(P.getDataFolder());
- sqlManager = new SQLManager(dbCfg);
- eventManager = new EventManager(new FileConfig("event.yml"));
- scriptManager = new ScriptManager(new FileConfig("script.yml"));
- moduleManager = new ModuleManager();
- }
-
- /**
- * @return 配置管理
- */
- public ConfigManager getConfigManager() {
- return configManager;
- }
-
- /**
- * @return 事件管理
- */
- public EventManager getEventManager() {
- return eventManager;
- }
-
- /**
- * @return 模块管理
- */
- public ModuleManager getModuleManager() {
- return moduleManager;
- }
-
- /**
- * @return 脚本管理
- */
- public ScriptManager getScriptManager() {
- return scriptManager;
- }
-
- /**
- * @return 数据管理
- */
- public SQLManager getSQLManager() {
- return sqlManager;
- }
-
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/MiaoScript.java b/src/main/java/pw/yumc/MiaoScript/MiaoScript.java
index b7f4ce9..3d0a707 100644
--- a/src/main/java/pw/yumc/MiaoScript/MiaoScript.java
+++ b/src/main/java/pw/yumc/MiaoScript/MiaoScript.java
@@ -1,21 +1,21 @@
package pw.yumc.MiaoScript;
import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
+import java.io.InputStreamReader;
+import java.nio.file.Files;
+
+import javax.script.ScriptEngineManager;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.event.HandlerList;
import org.bukkit.plugin.java.JavaPlugin;
-import me.clip.placeholderapi.PlaceholderAPI;
-import pw.yumc.MiaoScript.commands.MSCommands;
-import pw.yumc.MiaoScript.javascript.MiaoScriptEngine;
-import pw.yumc.MiaoScript.script.ScriptPlaceholder;
-import pw.yumc.YumCore.config.FileConfig;
+import pw.yumc.YumCore.annotation.NotProguard;
+import pw.yumc.YumCore.bukkit.Log;
+import pw.yumc.YumCore.bukkit.P;
+import pw.yumc.YumCore.bukkit.compatible.C;
+import pw.yumc.YumCore.engine.MiaoScriptEngine;
+import pw.yumc.YumCore.mc.MinecraftTools;
/**
* 喵式脚本
@@ -24,131 +24,76 @@ import pw.yumc.YumCore.config.FileConfig;
* @since 2016年8月29日 上午7:50:39
*/
public class MiaoScript extends JavaPlugin {
- private FileConfig config;
- private ManagerCenter managerCenter;
-
- @Override
- public FileConfiguration getConfig() {
- return config;
- }
-
- /**
- * @return 管理中心
- */
- public ManagerCenter getManagerCenter() {
- return managerCenter;
- }
-
- /**
- * 全局载入
- */
- public void load() {
- loadConfig();
- loadManager();
- loadScript();
- loadEvents();
- loadModules();
- }
+ private MiaoScriptEngine engine;
@Override
public void onEnable() {
- load();
- register();
- new MSCommands();
- MiaoScriptEngine.getDefault();
+ saveScript();
+ loadEngine();
}
- @Override
- public void onLoad() {
- saveDefault();
+ private void saveScript() {
+ P.saveFile("modules");
}
- /**
- * 注册变量
- */
- public void register() {
- PlaceholderAPI.registerPlaceholderHook("miaoscript", new ScriptPlaceholder());
- PlaceholderAPI.registerPlaceholderHook("ms", new ScriptPlaceholder());
- }
-
- /**
- * 重新载入
- */
- public void reload() {
- HandlerList.unregisterAll(this);
- onLoad();
- load();
- }
-
- private void loadConfig() {
- config = new FileConfig();
- }
-
- /**
- * 注册事件
- */
- private void loadEvents() {
- getManagerCenter().getEventManager().registerAll();
- }
-
- /**
- * 初始管理中心
- */
- private void loadManager() {
- managerCenter = new ManagerCenter();
- }
-
- /**
- * 载入模块
- */
- private void loadModules() {
- getManagerCenter().getModuleManager().loadModules();
- }
-
- /**
- * 载入脚本
- */
- private void loadScript() {
- getManagerCenter().getScriptManager().registerAll();
- }
-
- /**
- * 保存默认文件
- */
- private void saveDefault() {
+ private void loadEngine() {
+ Thread currentThread = Thread.currentThread();
+ ClassLoader previousClassLoader = currentThread.getContextClassLoader();
+ currentThread.setContextClassLoader(getClassLoader());
try {
- saveFile("js", "module");
- } catch (final IOException e) {
+ ScriptEngineManager manager = new ScriptEngineManager();
+ this.engine = new MiaoScriptEngine(manager);
+ this.engine.put("base", new Base());
+ this.engine.eval(new InputStreamReader(this.getResource("bios.js")));
+ engine.invokeFunction("boot", this, engine);
+ } catch (Exception e) {
+ Log.w("脚本引擎初始化失败! %s:%s", e.getClass().getName(), e.getMessage());
+ } finally {
+ currentThread.setContextClassLoader(previousClassLoader);
}
}
- /**
- * 保存案例
- *
- * @param name
- * JS文件名称
- * @throws IOException
- */
- private void saveFile(final String... dirs) throws IOException {
- final URL url = getClassLoader().getResource("plugin.yml");
- final String upath = url.getFile().substring(url.getFile().indexOf("/") + 1);
- final String jarPath = upath.substring(0, upath.indexOf('!'));
- JarFile jar = null;
- jar = new JarFile(jarPath);
- final Enumeration jes = jar.entries();
- while (jes.hasMoreElements()) {
- final JarEntry je = jes.nextElement();
- if (!je.isDirectory()) {
- for (final String dir : dirs) {
- if (je.getName().startsWith(dir)) {
- if (!new File(getDataFolder(), je.getName()).exists()) {
- saveResource(je.getName(), false);
- }
-
- }
- }
- }
+ @NotProguard
+ public static class Base {
+ public Class getClass(String name) throws ClassNotFoundException {
+ return Class.forName(name);
+ }
+
+ public Class getLog() {
+ return Log.class;
+ }
+
+ public String read(String path) throws IOException {
+ Log.d("读取文件 %s ...", path);
+ return new String(Files.readAllBytes(new File(path).toPath()), "UTF-8");
+ }
+
+ public void save(String path, String content) throws IOException {
+ Log.d("保存文件 %s ...", path);
+ File file = new File(path);
+ if (!file.exists()) {
+ file.getParentFile().mkdirs();
+ file.createNewFile();
+ }
+ FileOutputStream fos = new FileOutputStream(file);
+ fos.write(content.getBytes("UTF-8"));
+ fos.close();
+ }
+
+ public Class getActionBar() {
+ return C.ActionBar.class;
+ }
+
+ public Class getTitle() {
+ return C.Title.class;
+ }
+
+ public Class getPlayer() {
+ return C.Player.class;
+ }
+
+ public Class getTools() {
+ return MinecraftTools.class;
}
- jar.close();
}
}
diff --git a/src/main/java/pw/yumc/MiaoScript/commands/MSCommands.java b/src/main/java/pw/yumc/MiaoScript/commands/MSCommands.java
deleted file mode 100644
index 7cf328e..0000000
--- a/src/main/java/pw/yumc/MiaoScript/commands/MSCommands.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package pw.yumc.MiaoScript.commands;
-
-import javax.script.ScriptException;
-
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-
-import me.clip.placeholderapi.PlaceholderAPI;
-import pw.yumc.MiaoScript.MiaoScript;
-import pw.yumc.MiaoScript.event.EventInfo;
-import pw.yumc.MiaoScript.javascript.MiaoScriptEngine;
-import pw.yumc.MiaoScript.misc.MLog;
-import pw.yumc.MiaoScript.script.ScriptInfo;
-import pw.yumc.YumCore.bukkit.Log;
-import pw.yumc.YumCore.bukkit.P;
-import pw.yumc.YumCore.commands.CommandArgument;
-import pw.yumc.YumCore.commands.CommandExecutor;
-import pw.yumc.YumCore.commands.CommandManager;
-import pw.yumc.YumCore.commands.annotation.Cmd;
-import pw.yumc.YumCore.commands.annotation.Help;
-
-/**
- * 喵式脚本命令
- *
- * @author 喵♂呜
- * @since 2016年8月29日 上午7:50:58
- */
-public class MSCommands implements CommandExecutor {
- private final MiaoScript plugin = P.getPlugin();
-
- public MSCommands() {
- new CommandManager("ms", this);
- }
-
- @Cmd(permission = "MiaoScript.debug")
- @Help("切换调试模式")
- public void debug(final CommandArgument e) {
- MLog.setDebug(!MLog.isDebug());
- e.getSender().sendMessage("§6调试模式: " + (MLog.isDebug() ? "§a开启" : "§c关闭"));
- }
-
- @Cmd(permission = "MiaoScript.listen")
- @Help("查看监听列表")
- public void listen(final CommandArgument e) {
- final CommandSender sender = e.getSender();
- for (final EventInfo ei : plugin.getManagerCenter().getEventManager().getEvents().values()) {
- ei.send(sender);
- }
- }
-
- @Cmd(permission = "MiaoScript.reload")
- @Help("重载配置文件")
- public void reload(final CommandArgument e) {
- plugin.reload();
- e.getSender().sendMessage("§a配置文件已重新载入!");
- }
-
- @Cmd(permission = "MiaoScript.run")
- @Help("解析脚本")
- public void run(final CommandArgument e) {
- final CommandSender sender = e.getSender();
- final String script = merge(e.getArgs(), 0);
- final MiaoScriptEngine engine = MiaoScriptEngine.getDefault();
- try {
- engine.put("Player", e.getSender());
- final long s = System.currentTimeMillis();
- final Object result = engine.eval(PlaceholderAPI.setPlaceholders((sender instanceof Player ? (Player) sender : null), script));
- sender.sendMessage(String.format("%s运行结果: %s 耗时: %s", Log.getPrefix(), String.valueOf(result), System.currentTimeMillis() - s));
- } catch (final ScriptException ex) {
- sender.sendMessage(String.format(Log.getPrefix() + "脚本语法错误: %s", ex.getMessage()));
- }
- }
-
- @Cmd(permission = "MiaoScript.script", minimumArguments = 1)
- @Help(value = "查看脚本信息", possibleArguments = "<脚本名称>")
- public void script(final CommandArgument e) {
- final CommandSender sender = e.getSender();
- final ScriptInfo s = plugin.getManagerCenter().getScriptManager().getScript(e.getArgs()[0]);
- if (s == null) {
- Log.toSender(sender, "脚本不存在!");
- } else {
- s.send(sender);
- }
- }
-
- private String merge(final String[] arr, final int index) {
- final StringBuffer strs = new StringBuffer();
- for (int i = index; i < arr.length; i++) {
- strs.append(arr[i]);
- strs.append(" ");
- }
- return strs.toString();
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/data/ConfigManager.java b/src/main/java/pw/yumc/MiaoScript/data/ConfigManager.java
deleted file mode 100644
index 06a04cd..0000000
--- a/src/main/java/pw/yumc/MiaoScript/data/ConfigManager.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package pw.yumc.MiaoScript.data;
-
-import java.io.File;
-import java.util.WeakHashMap;
-
-import pw.yumc.YumCore.config.FileConfig;
-
-/**
- * 配置管理
- *
- * @author 喵♂呜
- * @since 2016年8月25日 上午2:02:03
- */
-public class ConfigManager {
- private final File dir;
- private final WeakHashMap playerconfigs = new WeakHashMap<>();
-
- private FileConfig config = null;
-
- public ConfigManager(final File dir) {
- this.dir = dir;
- final File f = new File(dir, "config.yml");
- if (f.exists()) {
- this.config = new FileConfig(f);
- }
- }
-
- /**
- * @return 数据配置
- */
- public FileConfig get() {
- return config;
- }
-
- /**
- * @return 数据配置
- */
- public FileConfig get(final String name) {
- if (!playerconfigs.containsKey(name)) {
- playerconfigs.put(name, new FileConfig(dir, name));
- }
- return playerconfigs.get(name);
- }
-
- /**
- * 保存数据
- */
- public void save() {
- config.save();
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/data/SQLManager.java b/src/main/java/pw/yumc/MiaoScript/data/SQLManager.java
deleted file mode 100644
index c769d8d..0000000
--- a/src/main/java/pw/yumc/MiaoScript/data/SQLManager.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package pw.yumc.MiaoScript.data;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.ConfigurationSection;
-
-import pw.yumc.YumCore.bukkit.Log;
-import pw.yumc.YumCore.bukkit.P;
-import pw.yumc.YumCore.sql.core.DataBaseCore;
-import pw.yumc.YumCore.sql.core.MySQLCore;
-
-/**
- * 数据库管理
- *
- * @author 喵♂呜
- * @since 2016年8月29日 上午7:51:10
- */
-public class SQLManager {
- Map database = new HashMap<>();
-
- public SQLManager(final ConfigurationSection cfg) {
- final Set dbName = cfg.getKeys(false);
- for (final String db : dbName) {
- database.put(db, new MySQLCore(cfg.getConfigurationSection(db)));
- }
- }
-
- /**
- * 检查数据库连接
- */
- public void check() {
- Bukkit.getScheduler().runTaskAsynchronously(P.instance, new Runnable() {
- @Override
- public void run() {
- Log.info("检查数据库配置...");
- for (final Entry entry : database.entrySet()) {
- if (entry.getValue().getConnection() == null) {
- Log.warning(String.format("数据库 %s 连接失败 请检查配置参数是否正确", entry.getKey()));
- }
- }
- }
- });
- }
-
- /**
- * 获得数据库核心
- *
- * @param name
- * 数据库名称
- * @return {@link DataBaseCore}
- */
- public DataBaseCore get(final String name) {
- return database.get(name);
- }
-
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/event/EventInfo.java b/src/main/java/pw/yumc/MiaoScript/event/EventInfo.java
deleted file mode 100644
index f9522e0..0000000
--- a/src/main/java/pw/yumc/MiaoScript/event/EventInfo.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package pw.yumc.MiaoScript.event;
-
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.ConfigurationSection;
-
-import pw.yumc.MiaoScript.module.ModuleInfo;
-import pw.yumc.MiaoScript.script.ScriptInfo;
-import pw.yumc.YumCore.config.ConfigNode;
-import pw.yumc.YumCore.config.InjectConfigurationSection;
-
-/**
- * 事件信息
- *
- * @author 喵♂呜
- * @since 2016年8月24日 下午1:06:34
- */
-public class EventInfo extends InjectConfigurationSection {
- private transient String name;
- private transient ModuleInfo module;
- @ConfigNode("class")
- private String clazz;
- private String priority;
- private List scripts;
-
- public EventInfo(final String name, final ConfigurationSection config) {
- super(config);
- this.name = name;
- clearEmpty();
- }
-
- /**
- * 清理空字串脚本
- *
- * @param scripts
- * 脚本
- * @return 整理后的脚本
- */
- public void clearEmpty() {
- final Set cq = new HashSet<>();
- for (final String s : scripts) {
- if (!s.trim().isEmpty()) {
- cq.add(s);
- }
- }
- scripts = new LinkedList<>(cq);
- }
-
- /**
- * @return 获得类名称
- */
- public String getClazz() {
- return clazz;
- }
-
- /**
- * @return 获得上层Module 可能为Null
- */
- public ModuleInfo getModule() {
- return module;
- }
-
- /**
- * @return 事件显示名称
- */
- public String getName() {
- return name;
- }
-
- /**
- * @return 监听等级
- */
- public String getPriority() {
- return priority == null || "".equalsIgnoreCase(priority) ? "NORMAL" : priority;
- }
-
- /**
- * @return 获得执行的脚本
- */
- public List getScripts() {
- return scripts;
- }
-
- /**
- * 发送事件信息
- *
- * @param sender
- * 命令发送者
- */
- public void send(final CommandSender sender) {
- sender.sendMessage(String.format("§6名称: §a%s §6事件: §a%s §6优先级: §a%s", getName(), getClazz().substring(getClazz().lastIndexOf(".") + 1), getPriority()));
- sender.sendMessage("§6脚本列表: ");
- for (final String script : getScripts()) {
- sender.sendMessage(String.format("§6- §e%s", script));
- }
- }
-
- /**
- * @param module
- * 设置上层Module
- * @return {@link ScriptInfo}
- */
- public EventInfo setModule(final ModuleInfo module) {
- this.module = module;
- return this;
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/event/EventManager.java b/src/main/java/pw/yumc/MiaoScript/event/EventManager.java
deleted file mode 100644
index 8697f77..0000000
--- a/src/main/java/pw/yumc/MiaoScript/event/EventManager.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package pw.yumc.MiaoScript.event;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.script.ScriptException;
-
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Event;
-import org.bukkit.event.EventException;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.PlayerEvent;
-import org.bukkit.plugin.EventExecutor;
-
-import pw.yumc.MiaoScript.MiaoScript;
-import pw.yumc.MiaoScript.data.ConfigManager;
-import pw.yumc.MiaoScript.javascript.MiaoScriptEngine;
-import pw.yumc.MiaoScript.misc.MLog;
-import pw.yumc.MiaoScript.script.ScriptInfo;
-import pw.yumc.YumCore.bukkit.Log;
-import pw.yumc.YumCore.bukkit.P;
-
-/**
- * 事件管理
- *
- * @author 喵♂呜
- * @since 2016年8月24日 下午12:51:48
- */
-public class EventManager implements Listener {
- private static final String EVENT_FUNCTION = "handle";
- private static final String PROCESS_NOT_FOUND = "事件脚本 %s 脚本未包含 hanlde(Event) 函数!";
- private static final String INVIDE_SCRIPT = "事件脚本 %s 语法错误: %s";
- private static String identifier = "%s_%s";
- private final MiaoScript plugin = P.getPlugin();
- private final ConfigurationSection config;
-
- /**
- * 未处理的数据
- */
- private final List eventInfos = new ArrayList<>();
- /**
- * 处理后的数据
- */
- private final Map events = new HashMap<>();
-
- public EventManager(final ConfigurationSection config) {
- this.config = config;
- }
-
- /**
- * 获得事件信息
- *
- * @param event
- * 事件
- * @param priority
- * 事件等级
- * @return 事件处理信息
- */
- public EventInfo getEvent(final Event event, final EventPriority priority) {
- return getEvent(getIdentifier(event.getClass(), priority));
- }
-
- /**
- * 获得事件信息
- *
- * @param name
- * 事件占位符
- * @return 事件处理信息
- */
- public EventInfo getEvent(final String name) {
- return events.get(name);
- }
-
- /**
- * @return 获得注册的事件
- */
- public Map getEvents() {
- return events;
- }
-
- /**
- * 获得占位符
- *
- * @param event
- * 事件
- * @param priority
- * 优先级
- * @return 占位符
- */
- public String getIdentifier(final Class extends Event> event, final EventPriority priority) {
- return String.format(identifier, event.getSimpleName(), priority.name());
- }
-
- /**
- * 调试
- *
- * @param ei
- * 事件信息
- */
- public void printInfo(final EventInfo ei) {
- MLog.debug(String.format("名称: %s 事件: %s 优先级: %s", ei.getName(), ei.getClazz().substring(ei.getClazz().lastIndexOf(".") + 1), ei.getPriority()));
- MLog.debug("脚本列表: ");
- }
-
- /**
- * 注册事件
- *
- * @param eventInfo
- * 事件信息
- */
- public boolean register(final EventInfo eventInfo) {
- return register(eventInfo, this);
- }
-
- /**
- * 注册事件
- *
- * @param eventInfo
- * 事件信息
- * @param listener
- * 监听器
- * @return
- */
- @SuppressWarnings("unchecked")
- public boolean register(final EventInfo eventInfo, final Listener listener) {
- try {
- final Class extends Event> clazz = (Class extends Event>) Class.forName(eventInfo.getClazz());
- final EventPriority priority = EventPriority.valueOf(eventInfo.getPriority());
- events.put(getIdentifier(clazz, priority), eventInfo);
- Log.debug(String.format("监听器 %s 注册事件 %s 等级 %s", listener.getClass().getSimpleName(), eventInfo.getClazz(), eventInfo.getPriority()));
- Bukkit.getPluginManager().registerEvent(clazz, listener, priority, new EventExecutor() {
- @Override
- public void execute(final Listener listener, final Event event) throws EventException {
- final EventInfo ei = plugin.getManagerCenter().getEventManager().getEvent(event, priority);
- if (ei == null) {
- Log.debug(String.format("事件 %s_%s 未找到对应处理脚本!", event.getEventName(), priority.name()));
- return;
- }
- MLog.debug("========== MiaoScript Debug ==========");
- printInfo(ei);
- Player player = null;
- final ConfigManager cfgmgr = ei.getModule() != null ? ei.getModule().getConfigManager() : plugin.getManagerCenter().getConfigManager();
- if (event instanceof PlayerEvent) {
- player = ((PlayerEvent) event).getPlayer();
- }
- final MiaoScriptEngine engine = MiaoScriptEngine.getDefault();
- engine.put("Event", event);
- engine.put("Player", player);
- engine.put("Config", cfgmgr.get());
- engine.put("PlayerConfig", cfgmgr);
- for (final String scriptname : ei.getScripts()) {
- final ScriptInfo script = plugin.getManagerCenter().getScriptManager().getScript(scriptname);
- if (script == null) {
- Log.debug(String.format("事件 %s_%s 未找到 %s 脚本!", event.getEventName(), priority.name(), scriptname));
- }
- Object result = null;
- try {
- engine.eval(script.getExpression(player));
- result = engine.invokeFunction(EVENT_FUNCTION, new Object[] { event });
- } catch (final NoSuchMethodException e1) {
- Log.warning(String.format(PROCESS_NOT_FOUND, scriptname));
- } catch (final ScriptException e1) {
- Log.warning(String.format(INVIDE_SCRIPT, scriptname, e1.getMessage()));
- }
- MLog.debug(String.format("- %s 返回值: %s", scriptname, result));
- }
- MLog.debug("======================================");
- }
- }, plugin);
- return true;
- } catch (final ClassNotFoundException e) {
- Log.warning(String.format("事件 %s 的监听类 %s 未找到!", eventInfo.getName(), eventInfo.getClazz()));
- } catch (final Exception e) {
- Log.warning(String.format("事件 %s 的注册失败 %s: %s!", eventInfo.getName(), e.getClass().getName(), e.getMessage()));
- }
- return false;
- }
-
- /**
- * 注册所有事件
- */
- public void registerAll() {
- eventInfos.clear();
- for (final String event : config.getKeys(false)) {
- final ConfigurationSection e = config.getConfigurationSection(event);
- if (e == null) {
- continue;
- }
- eventInfos.add(new EventInfo(event, e));
- }
- int count = 0;
- for (final EventInfo ei : eventInfos) {
- if (!ei.getScripts().isEmpty() && register(ei)) {
- count++;
- }
- }
- Log.info(String.format("已注册全局事件 %s 个...", count));
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/javascript/MiaoScriptEngine.java b/src/main/java/pw/yumc/MiaoScript/javascript/MiaoScriptEngine.java
deleted file mode 100644
index 2ab4488..0000000
--- a/src/main/java/pw/yumc/MiaoScript/javascript/MiaoScriptEngine.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package pw.yumc.MiaoScript.javascript;
-
-import java.io.Reader;
-
-import javax.script.Bindings;
-import javax.script.Invocable;
-import javax.script.ScriptContext;
-import javax.script.ScriptEngine;
-import javax.script.ScriptEngineFactory;
-import javax.script.ScriptEngineManager;
-import javax.script.ScriptException;
-
-import org.bukkit.Bukkit;
-
-import pw.yumc.MiaoScript.ManagerCenter;
-import pw.yumc.MiaoScript.MiaoScript;
-import pw.yumc.MiaoScript.misc.MLog;
-import pw.yumc.MiaoScript.misc.StaticAgent;
-import pw.yumc.YumCore.bukkit.Log;
-import pw.yumc.YumCore.bukkit.P;
-
-/**
- * 喵式脚本引擎
- *
- * @author 喵♂呜
- * @since 2016年8月29日 上午7:51:43
- */
-public class MiaoScriptEngine implements ScriptEngine, Invocable {
- private static MiaoScriptEngine DEFAULT;
- private final MiaoScript plugin = P.getPlugin();
- private final ManagerCenter mCenter = plugin.getManagerCenter();
- private ScriptEngine engine;
-
- public MiaoScriptEngine(final String engineType) {
- try {
- engine = new ScriptEngineManager().getEngineByName(engineType);
- } catch (final NullPointerException ex) {
- Log.warning("无效的解析引擎! 已设为默认值 'javascript'");
- engine = new ScriptEngineManager().getEngineByName("javascript");
- }
- engine.put("Bukkit", Bukkit.getServer());
- engine.put("Server", Bukkit.getServer());
- engine.put("ActionBar", new StaticAgent.ActionBar());
- engine.put("Title", new StaticAgent.Title());
- engine.put("MainConfig", mCenter.getConfigManager().get());
- engine.put("PlayerConfig", mCenter.getConfigManager());
- engine.put("SQL", mCenter.getSQLManager());
- engine.put("Prefix", Log.getPrefix());
- engine.put("Log", P.getLogger());
- engine.put("MLog", MLog.LOG);
- }
-
- public static MiaoScriptEngine getDefault() {
- if (DEFAULT == null) {
- DEFAULT = new MiaoScriptEngine("javascript");
- }
- return DEFAULT;
- }
-
- @Override
- public Bindings createBindings() {
- return engine.createBindings();
- }
-
- @Override
- public Object eval(final Reader reader) throws ScriptException {
- return engine.eval(reader);
- }
-
- @Override
- public Object eval(final Reader reader, final Bindings n) throws ScriptException {
- return engine.eval(reader, n);
- }
-
- @Override
- public Object eval(final Reader reader, final ScriptContext context) throws ScriptException {
- return engine.eval(reader, context);
- }
-
- @Override
- public Object eval(final String script) throws ScriptException {
- MLog.debug(script.split("\n"));
- return engine.eval(script);
- }
-
- @Override
- public Object eval(final String script, final Bindings n) throws ScriptException {
- return engine.eval(script, n);
- }
-
- @Override
- public Object eval(final String script, final ScriptContext context) throws ScriptException {
- return engine.eval(script, context);
- }
-
- @Override
- public Object get(final String key) {
- return engine.get(key);
- }
-
- @Override
- public Bindings getBindings(final int scope) {
- return engine.getBindings(scope);
- }
-
- @Override
- public ScriptContext getContext() {
- return engine.getContext();
- }
-
- @Override
- public ScriptEngineFactory getFactory() {
- return engine.getFactory();
- }
-
- @Override
- public T getInterface(final Class clasz) {
- return ((Invocable) engine).getInterface(clasz);
- }
-
- @Override
- public T getInterface(final Object thiz, final Class clasz) {
- return ((Invocable) engine).getInterface(thiz, clasz);
- }
-
- @Override
- public Object invokeFunction(final String name, final Object... args) throws ScriptException, NoSuchMethodException {
- final Object result = ((Invocable) engine).invokeFunction(name, args);
- engine.put("Event", null);
- engine.put("Player", null);
- engine.put("PlayerConfig", mCenter.getConfigManager());
- MLog.debug(String.valueOf(result));
- return result;
- }
-
- @Override
- public Object invokeMethod(final Object thiz, final String name, final Object... args) throws ScriptException, NoSuchMethodException {
- return ((Invocable) engine).invokeMethod(thiz, name, args);
- }
-
- @Override
- public void put(final String key, final Object value) {
- engine.put(key, value);
- }
-
- @Override
- public void setBindings(final Bindings bindings, final int scope) {
- engine.setBindings(bindings, scope);
- }
-
- @Override
- public void setContext(final ScriptContext context) {
- engine.setContext(context);
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/misc/MLog.java b/src/main/java/pw/yumc/MiaoScript/misc/MLog.java
deleted file mode 100644
index 3ff4a02..0000000
--- a/src/main/java/pw/yumc/MiaoScript/misc/MLog.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package pw.yumc.MiaoScript.misc;
-
-/**
- * 喵日志
- *
- * @author 喵♂呜
- * @since 2016年8月29日 上午7:52:02
- */
-public class MLog {
- public static MiaoScriptLog LOG = new MiaoScriptLog();
- private static boolean debug = false;
-
- /**
- * 输出调试消息
- *
- * @param msg
- * 调试消息
- */
- public static void debug(final String msg) {
- LOG.debug(msg);
- }
-
- /**
- * 输出调试消息
- *
- * @param msg
- * 调试消息
- */
- public static void debug(final String[] msg) {
- LOG.debug(msg);
- }
-
- /**
- * @return 是否为调试模式
- */
- public static boolean isDebug() {
- return debug;
- }
-
- /**
- * 设置调试模式
- *
- * @param debug
- * 是否调试
- */
- public static void setDebug(final boolean debug) {
- LOG.setDebug(debug);
- MLog.debug = debug;
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/misc/MiaoScriptLog.java b/src/main/java/pw/yumc/MiaoScript/misc/MiaoScriptLog.java
deleted file mode 100644
index 19275ed..0000000
--- a/src/main/java/pw/yumc/MiaoScript/misc/MiaoScriptLog.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package pw.yumc.MiaoScript.misc;
-
-import pw.yumc.YumCore.bukkit.Log;
-
-/**
- * 喵式脚本日志
- *
- * @author 喵♂呜
- * @since 2016年8月29日 上午7:51:53
- */
-public class MiaoScriptLog {
- private boolean debug;
-
- /**
- * 输出调试消息
- *
- * @param msg
- * 调试消息
- */
- public void debug(final String msg) {
- if (debug) {
- Log.info(msg);
- }
- }
-
- /**
- * 输出调试消息
- *
- * @param msg
- * 调试消息
- */
- public void debug(final String[] msgs) {
- if (debug) {
- for (final String msg : msgs) {
- Log.info(msg);
- }
- }
- }
-
- public boolean isDebug() {
- return debug;
- }
-
- public void setDebug(final boolean debug) {
- this.debug = debug;
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/misc/StaticAgent.java b/src/main/java/pw/yumc/MiaoScript/misc/StaticAgent.java
deleted file mode 100644
index 801ad08..0000000
--- a/src/main/java/pw/yumc/MiaoScript/misc/StaticAgent.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package pw.yumc.MiaoScript.misc;
-
-import org.bukkit.World;
-import org.bukkit.entity.Player;
-
-import pw.yumc.YumCore.bukkit.compatible.C;
-
-/**
- * 静态方法代理
- *
- * @author 喵♂呜
- * @since 2016年8月29日 上午7:52:10
- */
-public class StaticAgent {
- public static class ActionBar {
- public void broadcast(final String msg) {
- C.ActionBar.broadcast(msg);
- }
-
- public void broadcast(final String msg, final int time) {
- C.ActionBar.broadcast(msg, time);
- }
-
- public void broadcast(final World world, final String msg, final int time) {
- C.ActionBar.broadcast(world, msg, 0);
- }
-
- public void send(final Player player, final String msg) {
- C.ActionBar.send(player, msg);
- }
-
- public void send(final Player player, final String msg, final int time) {
- C.ActionBar.send(player, msg, time);
- }
- }
-
- public static class Title {
- public void send(final Player player, final String title, final String sub) {
- C.Title.send(player, title, sub);
- }
-
- public void send(final Player player, final String title, final String sub, final int fadeInTime, final int stayTime, final int fadeOutTime) {
- C.Title.send(player, title, sub, fadeInTime, stayTime, fadeOutTime);
- }
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/module/MainInfo.java b/src/main/java/pw/yumc/MiaoScript/module/MainInfo.java
deleted file mode 100644
index d610b83..0000000
--- a/src/main/java/pw/yumc/MiaoScript/module/MainInfo.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package pw.yumc.MiaoScript.module;
-
-import java.io.File;
-
-import pw.yumc.YumCore.config.InjectConfig;
-
-/**
- * 主模块信息
- *
- * @author 喵♂呜
- * @since 2016年8月29日 上午7:52:25
- */
-public class MainInfo extends InjectConfig {
- private String name;
- private String description;
-
- public MainInfo(final File file) {
- super(file);
- }
-
- /**
- * @return 模块描述
- */
- public String getDescription() {
- return description;
- }
-
- /**
- * @return 模块名称
- */
- public String getName() {
- return name;
- }
-
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/module/ModuleInfo.java b/src/main/java/pw/yumc/MiaoScript/module/ModuleInfo.java
deleted file mode 100644
index be307cb..0000000
--- a/src/main/java/pw/yumc/MiaoScript/module/ModuleInfo.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package pw.yumc.MiaoScript.module;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.bukkit.configuration.InvalidConfigurationException;
-import org.bukkit.event.Listener;
-
-import pw.yumc.MiaoScript.ManagerCenter;
-import pw.yumc.MiaoScript.MiaoScript;
-import pw.yumc.MiaoScript.data.ConfigManager;
-import pw.yumc.MiaoScript.event.EventInfo;
-import pw.yumc.MiaoScript.script.ScriptInfo;
-import pw.yumc.YumCore.bukkit.Log;
-import pw.yumc.YumCore.bukkit.P;
-import pw.yumc.YumCore.config.FileConfig;
-
-/**
- * 模块信息
- *
- * @author 喵♂呜
- * @since 2016年8月29日 上午7:52:32
- */
-public class ModuleInfo implements Listener {
- private static final String LOADINFO = "已加载模块 %s 包含脚本/变量 %s 个 事件 %s 个...";
- private static String MAIN = "main.yml";
- private static String EVENT = "event.yml";
- private static String SCRIPT = "script.yml";
-
- private final File dataFolder;
- private final ConfigManager configManager;
- private MainInfo main;
- private List events = Collections.emptyList();
- private List scripts = Collections.emptyList();
-
- public ModuleInfo(final File dir) throws FileNotFoundException, InvalidConfigurationException {
- if (!dir.isDirectory()) {
- throw new IllegalArgumentException("模块必须是一个目录!");
- }
- this.dataFolder = dir;
- this.configManager = new ConfigManager(dir);
- load(dir);
- register();
- }
-
- /**
- * @return 配置管理器
- */
- public ConfigManager getConfigManager() {
- return configManager;
- }
-
- /**
- * @return 模块数据目录
- */
- public File getDataFolder() {
- return dataFolder;
- }
-
- /**
- * @return 模块注册的事件
- */
- public List getEvents() {
- return events;
- }
-
- /**
- * @return 获得模块主类
- */
- public MainInfo getMain() {
- return main;
- }
-
- /**
- * @return 获得模块脚本
- */
- public List getScripts() {
- return scripts;
- }
-
- /**
- * 载入模块
- *
- * @param dir
- * 模块目录
- * @throws FileNotFoundException
- * 主类未找到
- * @throws InvalidConfigurationException
- * 主类配置文件错误
- */
- private void load(final File dir) throws FileNotFoundException, InvalidConfigurationException {
- final File mainFile = new File(dir, MAIN);
- if (!mainFile.exists()) {
- throw new FileNotFoundException(String.format("模块主文件 %s 未找到!", MAIN));
- }
- try {
- main = new MainInfo(mainFile);
- } catch (final Exception e) {
- throw new InvalidConfigurationException(String.format("模块主文件 %s 格式错误!", MAIN), e);
- }
- final File eventFile = new File(dir, EVENT);
- if (eventFile.exists()) {
- events = loadEvents(eventFile);
- }
- final File scriptFile = new File(dir, SCRIPT);
- if (scriptFile.exists()) {
- scripts = loadScripts(scriptFile);
- }
- }
-
- /**
- * 载入事件
- *
- * @param file
- * 模块目录
- * @return 事件列表
- */
- private List loadEvents(final File file) {
- final List eis = new ArrayList<>();
- final FileConfig cfg = new FileConfig(file);
- for (final String ek : cfg.getKeys(false)) {
- eis.add(new EventInfo(ek, cfg.getConfigurationSection(ek)).setModule(this));
- }
- return eis;
- }
-
- /**
- * 载入脚本
- *
- * @param file
- * 模块目录
- * @return 脚本列表
- */
- private List loadScripts(final File file) {
- final List sis = new ArrayList<>();
- final FileConfig cfg = new FileConfig(file);
- for (final String sk : cfg.getKeys(false)) {
- sis.add(new ScriptInfo(sk, cfg.getConfigurationSection(sk), file.getParentFile()).setModule(this));
- }
- return sis;
- }
-
- private void register() {
- final MiaoScript m = P.getPlugin();
- final ManagerCenter mc = m.getManagerCenter();
- Log.info(String.format(LOADINFO, main.getName(), registerScripts(mc), registerEvents(mc)));
- }
-
- private int registerEvents(final ManagerCenter mc) {
- int count = 0;
- for (final EventInfo eventInfo : events) {
- if (!eventInfo.getScripts().isEmpty() && mc.getEventManager().register(eventInfo, this)) {
- count++;
- }
- }
- return count;
- }
-
- private int registerScripts(final ManagerCenter mc) {
- int count = 0;
- for (final ScriptInfo scriptInfo : scripts) {
- mc.getScriptManager().register(scriptInfo);
- count++;
- }
- return count;
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/module/ModuleManager.java b/src/main/java/pw/yumc/MiaoScript/module/ModuleManager.java
deleted file mode 100644
index 697c896..0000000
--- a/src/main/java/pw/yumc/MiaoScript/module/ModuleManager.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package pw.yumc.MiaoScript.module;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import pw.yumc.YumCore.bukkit.Log;
-import pw.yumc.YumCore.bukkit.P;
-
-/**
- * 模块管理
- *
- * @author 喵♂呜
- * @since 2016年8月29日 上午7:52:40
- */
-public class ModuleManager {
- private static final String LOADERROR = "目录 %s 载入模块失败 异常: %s";
- private static final String LOADED = "已载入 %s 个模块...";
- private final File MODULE_FOLDER = new File(P.getDataFolder(), "modules");
- private final List modules = new ArrayList<>();
-
- public ModuleManager() {
- if (!MODULE_FOLDER.exists()) {
- MODULE_FOLDER.mkdirs();
- }
- }
-
- public void loadModules() {
- modules.clear();
- int count = 0;
- for (final File dir : MODULE_FOLDER.listFiles()) {
- if (dir.isDirectory()) {
- try {
- modules.add(new ModuleInfo(dir));
- count++;
- } catch (final Exception e) {
- Log.warning(String.format(LOADERROR, dir.getName(), e.getMessage()));
- Log.debug("模块载入异常!", e);
- }
- }
- }
- Log.info(String.format(LOADED, count));
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/script/ScriptInfo.java b/src/main/java/pw/yumc/MiaoScript/script/ScriptInfo.java
deleted file mode 100644
index 002464f..0000000
--- a/src/main/java/pw/yumc/MiaoScript/script/ScriptInfo.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package pw.yumc.MiaoScript.script;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.entity.Player;
-
-import me.clip.placeholderapi.PlaceholderAPI;
-import me.clip.placeholderapi.PlaceholderAPIPlugin;
-import pw.yumc.MiaoScript.module.ModuleInfo;
-import pw.yumc.YumCore.bukkit.Log;
-import pw.yumc.YumCore.bukkit.P;
-import pw.yumc.YumCore.config.InjectConfigurationSection;
-import pw.yumc.YumCore.config.Nullable;
-
-/**
- * 脚本信息
- *
- * @author 喵♂呜
- * @since 2016年8月24日 下午12:52:09
- */
-public class ScriptInfo extends InjectConfigurationSection {
- public transient static final File dir = new File(P.getDataFolder(), "js");
- public transient static Charset UTF_8 = Charset.forName("UTF-8");
-
- static {
- if (!dir.exists()) {
- dir.mkdirs();
- }
- }
-
- private transient String name;
- private transient ModuleInfo module;
- private String expression;
- @Nullable
- private List commands;
- @Nullable
- private String type;
- @Nullable
- private String trueResult;
- @Nullable
- private String falseResult;
-
- public ScriptInfo(final String name, final ConfigurationSection config) {
- this(name, config, dir);
- }
-
- public ScriptInfo(final String name, final ConfigurationSection config, final File dir) {
- super(config);
- this.name = name;
- if ("boolean".equalsIgnoreCase(type) && (trueResult == null || falseResult == null)) {
- Log.warning(String.format("脚本 %s 缺少返回结果 将使用默认值!", name));
- }
- if (expression.startsWith("file:")) {
- final String fileName = expression.substring(5).trim();
- try {
- final File file = new File(dir, fileName);
- if (!file.exists()) {
- file.createNewFile();
- Log.warning(String.format("JS文件 %s 不存在 已创建新文件 请添加脚本信息!", fileName));
- } else {
- expression = new String(Files.readAllBytes(file.toPath()), UTF_8);
- Log.debug(String.format("脚本 %s 从文件 %s 载入表达式...", name, file.toPath()));
- }
- } catch (final IOException e) {
- Log.warning(String.format("JS文件 %s 读取失败 异常: %s", fileName, e.getMessage()));
- expression = "";
- }
- }
- }
-
- /**
- * @return 当前脚本绑定的命令
- */
- public List getCommands() {
- if (commands == null) {
- commands = Collections.emptyList();
- }
- return commands;
- }
-
- /**
- * @return 表达式
- */
- public String getExpression() {
- return expression;
- }
-
- /**
- * 获得PAPI解析的表达式
- *
- * @param p
- * 玩家
- * @return 获得解析后的表达式
- */
- public String getExpression(final Player p) {
- return PlaceholderAPI.setBracketPlaceholders(p, expression);
- }
-
- /**
- * @return False返回值
- */
- public String getFalseResult() {
- return falseResult == null ? PlaceholderAPIPlugin.booleanFalse() : falseResult;
- }
-
- /**
- * @return 获得上层Module
- */
- public ModuleInfo getModule() {
- return module;
- }
-
- /**
- * @return 脚本名称
- */
- public String getName() {
- return name;
- }
-
- /**
- * @return True返回值
- */
- public String getTrueResult() {
- return trueResult == null ? PlaceholderAPIPlugin.booleanTrue() : trueResult;
- }
-
- /**
- * @return 类型
- */
- public String getType() {
- return type == null ? "string" : type;
- }
-
- /**
- * 发送脚本信息
- *
- * @param sender
- * 命令接受者
- */
- public void send(final CommandSender sender) {
- sender.sendMessage(String.format("§6名称: §a%s §6返回值类型: §a%s §6表达式如下: ", getName(), getType()));
- for (final String exp : expression.split("\n")) {
- sender.sendMessage("§a" + exp);
- }
- final List cmd = getCommands();
- if (!cmd.isEmpty()) {
- sender.sendMessage(String.format("§6绑定命令: §a%s", Arrays.toString(cmd.toArray())));
- }
- if ("boolean".equalsIgnoreCase(type)) {
- sender.sendMessage(String.format("§6true返回值: §a%s", getTrueResult()));
- sender.sendMessage(String.format("§6False返回值: §a%s", getFalseResult()));
- }
- }
-
- /**
- * @param module
- * 设置上层Module
- * @return {@link ScriptInfo}
- */
- public ScriptInfo setModule(final ModuleInfo module) {
- this.module = module;
- return this;
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/script/ScriptManager.java b/src/main/java/pw/yumc/MiaoScript/script/ScriptManager.java
deleted file mode 100644
index 714259c..0000000
--- a/src/main/java/pw/yumc/MiaoScript/script/ScriptManager.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package pw.yumc.MiaoScript.script;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import javax.script.ScriptException;
-
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.PlayerCommandPreprocessEvent;
-
-import pw.yumc.MiaoScript.javascript.MiaoScriptEngine;
-import pw.yumc.YumCore.bukkit.Log;
-import pw.yumc.YumCore.bukkit.P;
-
-/**
- * 脚本管理
- *
- * @author 喵♂呜
- * @since 2016年8月24日 下午12:51:48
- */
-public class ScriptManager implements Listener {
- private static final String SCRIPTLOADED = "已加载全局变量/脚本 %s 个...";
- private static final String CMD_FUNCTION = "process";
- private static final String PROCESS_NOT_FOUND = "命令脚本 %s 脚本未包含 process(Player,Command,Args) 函数!";
- private static final String INVIDE_SCRIPT = "命令脚本 %s 语法错误: %s";
- private static final String REGISTER = "命令 %s 已绑定脚本 %s ...";
- private final ConfigurationSection config;
- private final Map cmds = new HashMap<>();
- private final Map scripts = new HashMap<>();
-
- public ScriptManager(final ConfigurationSection config) {
- this.config = config;
- Bukkit.getPluginManager().registerEvents(this, P.instance);
- }
-
- /**
- * 获取脚本信息
- *
- * @param name
- * 获得脚本
- * @return 脚本信息
- */
- public ScriptInfo getScript(final String name) {
- return scripts.get(name);
- }
-
- @EventHandler(priority = EventPriority.LOWEST)
- public void onPreCommand(final PlayerCommandPreprocessEvent e) {
- final String command = e.getMessage().substring(1);
- final String[] temp = command.split(" ");
- final String cmd = temp[0];
- if (cmds.containsKey(cmd)) {
- e.setCancelled(true);
- Bukkit.getScheduler().runTaskAsynchronously(P.instance, new Runnable() {
- @Override
- public void run() {
- final MiaoScriptEngine engine = MiaoScriptEngine.getDefault();
- final ScriptInfo script = cmds.get(cmd);
- final String[] args = Arrays.copyOfRange(temp, 1, temp.length);
- try {
- if (script.getModule() != null) {
- engine.put("Config", script.getModule().getConfigManager().get());
- engine.put("PlayerConfig", script.getModule().getConfigManager());
- }
- engine.eval(script.getExpression(e.getPlayer()));
- engine.invokeFunction(CMD_FUNCTION, new Object[] { e.getPlayer(), cmd, args });
- } catch (final NoSuchMethodException e1) {
- Log.warning(String.format(PROCESS_NOT_FOUND, script.getName()));
- } catch (final ScriptException e1) {
- Log.warning(String.format(INVIDE_SCRIPT, script.getName(), e1.getMessage()));
- }
- }
- });
- }
- }
-
- /**
- * 注册脚本
- *
- * @param name
- * 脚本名称
- * @param script
- * 脚本信息
- * @return
- */
- public ScriptInfo register(final ScriptInfo script) {
- if (script.getCommands() != null) {
- for (final String cmd : script.getCommands()) {
- cmds.put(cmd, script);
- Log.debug(String.format(REGISTER, cmd, script.getName()));
- }
- }
- return scripts.put(script.getName(), script);
- }
-
- /**
- * 注册脚本
- */
- public void registerAll() {
- scripts.clear();
- final Set keys = config.getKeys(false);
- for (final String key : keys) {
- register(new ScriptInfo(key, config.getConfigurationSection(key)));
- }
- Log.info(String.format(SCRIPTLOADED, keys.size()));
- }
-}
diff --git a/src/main/java/pw/yumc/MiaoScript/script/ScriptPlaceholder.java b/src/main/java/pw/yumc/MiaoScript/script/ScriptPlaceholder.java
deleted file mode 100644
index 5066e6b..0000000
--- a/src/main/java/pw/yumc/MiaoScript/script/ScriptPlaceholder.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package pw.yumc.MiaoScript.script;
-
-import javax.script.ScriptEngine;
-import javax.script.ScriptException;
-
-import org.bukkit.entity.Player;
-
-import me.clip.placeholderapi.PlaceholderAPI;
-import me.clip.placeholderapi.PlaceholderHook;
-import pw.yumc.MiaoScript.ManagerCenter;
-import pw.yumc.MiaoScript.MiaoScript;
-import pw.yumc.MiaoScript.javascript.MiaoScriptEngine;
-import pw.yumc.MiaoScript.misc.MLog;
-import pw.yumc.YumCore.bukkit.Log;
-import pw.yumc.YumCore.bukkit.P;
-
-/**
- * 脚本执行
- *
- * @author 喵♂呜
- * @since 2016年8月24日 下午12:51:59
- */
-public class ScriptPlaceholder extends PlaceholderHook {
- private static String invalid = "无效的脚本: %s";
- private static String typeError = "脚本 %s 返回值错误";
- private static String EMPTY = "";
-
- private final MiaoScript plugin = P.getPlugin();
- private final ManagerCenter mCenter = plugin.getManagerCenter();
-
- private final ScriptEngine engine = MiaoScriptEngine.getDefault();
-
- @Override
- public String onPlaceholderRequest(final Player p, final String key) {
- final ScriptInfo script = mCenter.getScriptManager().getScript(key);
- if (script == null) {
- return EMPTY;
- }
- final String expression = script.getExpression(p);
- try {
- engine.put("Player", p);
- MLog.debug(String.format("执行脚本 %s 表达式如下: ", key));
- Object result = engine.eval(expression);
- engine.put("Event", null);
- engine.put("Player", null);
- engine.put("PlayerConfig", mCenter.getConfigManager());
- if (result == null) {
- return EMPTY;
- }
- if ("boolean".equalsIgnoreCase(script.getType())) {
- if (!(result instanceof Boolean)) {
- return String.format(typeError, key);
- }
- if (((Boolean) result).booleanValue()) {
- result = script.getTrueResult();
- } else {
- result = script.getFalseResult();
- }
- }
- result = PlaceholderAPI.setPlaceholders(p, String.valueOf(result));
- MLog.debug(String.format("返回值: %s", result.toString()));
- return result.toString();
- } catch (final ScriptException ex) {
- Log.warning(String.format(invalid, key));
- ex.printStackTrace();
- return String.format(invalid, key);
- }
- }
-}
diff --git a/src/main/resources/bios.js b/src/main/resources/bios.js
new file mode 100644
index 0000000..e552f12
--- /dev/null
+++ b/src/main/resources/bios.js
@@ -0,0 +1,12 @@
+var boot;
+/**
+ * 初始化框架引擎
+ */
+(function () {
+ boot = function (plugin, engine) {
+ engine.put('root', plugin.getDataFolder());
+ engine.put('rootDir', plugin.getDataFolder().getCanonicalPath());
+ load(rootDir + '/modules/init.js');
+ init(plugin, engine);
+ }
+})();
\ No newline at end of file
diff --git a/src/main/resources/data.yml b/src/main/resources/data.yml
deleted file mode 100644
index e69de29..0000000
diff --git a/src/main/resources/event.yml b/src/main/resources/event.yml
deleted file mode 100644
index 5bd186f..0000000
--- a/src/main/resources/event.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-PlayerJoin:
- #Event Class Full Name
- class: org.bukkit.event.player.PlayerJoinEvent
- #EventPriority Allow Value: LOWEST, LOW, NORMAL, HIGH, HIGHEST, MONITOR
- priority: LOWEST
- #Script List
- scripts:
- - 'welcome'
-PlayerDrop:
- #Event Class Full Name
- class: org.bukkit.event.player.PlayerDropItemEvent
- #EventPriority Allow Value: LOWEST, LOW, NORMAL, HIGH, HIGHEST, MONITOR
- priority: LOWEST
- #Script List
- scripts:
- - 'checkDrop'
diff --git a/src/main/resources/js/welcome.js b/src/main/resources/js/welcome.js
deleted file mode 100644
index 1cad67c..0000000
--- a/src/main/resources/js/welcome.js
+++ /dev/null
@@ -1,7 +0,0 @@
-function handle(Event) {
- if (Player.getName() == "Mr_jtb") {
- Bukkit.broadcastMessage("&6[&a公告&6] &c热烈欢迎 &aMiaoScript &c作者 &b喵♂呜&c!");
- } else {
- Player.sendMessage("&6[&bMiaoScript&6] &c欢迎来到 &b" + Bukkit.getServerName() + " &c服务器!");
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/modules/bed/bed.js b/src/main/resources/modules/bed/bed.js
deleted file mode 100644
index 147ff28..0000000
--- a/src/main/resources/modules/bed/bed.js
+++ /dev/null
@@ -1,26 +0,0 @@
-function process(Player, Command, Args) {
- var path = "bed.def"
- var bname = "";
- if (Args.length > 0) {
- banem = Args[0];
- path = "bed." + bname;
- }
- var pconfig = PlayerConfig.get(Player.getName());
- switch (Command) {
- case "setbed":
- pconfig.set(path, Player.getLocation());
- pconfig.save();
- Player.sendMessage(Prefix + "&a您的家设置成功 使用&b/gobed " + bname + " &a即可回家!");
- return true;
- case "gobed":
- if (pconfig.isSet(path)) {
- Player.teleport(pconfig.getLocation(path));
- Player.sendMessage(Prefix + "&a已传送您回家!");
- } else {
- Player.sendMessage(Prefix + "&c请先使用 &b/setbed " + bname + " &c设置您的家!");
- }
- return true;
- default:
- return false;
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/modules/bed/main.yml b/src/main/resources/modules/bed/main.yml
deleted file mode 100644
index bfb4e2d..0000000
--- a/src/main/resources/modules/bed/main.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-#模块名称
-name: bed
-#模块描述
-description: 用于设置家 以及回家
\ No newline at end of file
diff --git a/src/main/resources/modules/bed/script.yml b/src/main/resources/modules/bed/script.yml
deleted file mode 100644
index 2d300f6..0000000
--- a/src/main/resources/modules/bed/script.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-#脚本名称
-bed:
- #脚本表达式
- expression: 'file: bed.js'
- #脚本绑定命令
- commands:
- - gobed
- - setbed
\ No newline at end of file
diff --git a/src/main/resources/modules/chatClear/config.yml b/src/main/resources/modules/chatClear/config.yml
deleted file mode 100644
index fc9d770..0000000
--- a/src/main/resources/modules/chatClear/config.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-dirList:
-- 日狗
-- 你妹
-- 我操
\ No newline at end of file
diff --git a/src/main/resources/modules/chatClear/event.yml b/src/main/resources/modules/chatClear/event.yml
deleted file mode 100644
index 51ac9f2..0000000
--- a/src/main/resources/modules/chatClear/event.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-PlayerChat:
- #Event Class Full Name
- class: org.bukkit.event.player.AsyncPlayerChatEvent
- #EventPriority Allow Value: LOWEST, LOW, NORMAL, HIGH, HIGHEST, MONITOR
- priority: LOWEST
- #Script List
- scripts:
- - 'checkChat'
\ No newline at end of file
diff --git a/src/main/resources/modules/chatClear/main.yml b/src/main/resources/modules/chatClear/main.yml
deleted file mode 100644
index 34318ec..0000000
--- a/src/main/resources/modules/chatClear/main.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-#模块名称
-name: chatClear
-#模块描述
-description: 清理玩家不文明的对话
\ No newline at end of file
diff --git a/src/main/resources/modules/chatClear/script.yml b/src/main/resources/modules/chatClear/script.yml
deleted file mode 100644
index 3d5771e..0000000
--- a/src/main/resources/modules/chatClear/script.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-#脚本名称
-checkChat:
- #脚本表达式
- expression: |
- function handle(Event){
- var dirs = Config.getStringList("dirList");
- var msg = Event.getMessage();
- for (i in dirs) {
- if (msg.contains(dirs[i])) {
- Event.setCancelled(true);
- Player.sendMessage("&6[&b警告&6] &c请不要讲脏话!");
- }
- }
- }
\ No newline at end of file
diff --git a/src/main/resources/modules/ext.js b/src/main/resources/modules/ext.js
new file mode 100644
index 0000000..268f053
--- /dev/null
+++ b/src/main/resources/modules/ext.js
@@ -0,0 +1,38 @@
+/**
+ * 菜单基础扩展脚本
+ * Created by 蒋天蓓 on 2017/2/8 0008.
+ */
+var ext = {};
+/**
+ * 获得静态类
+ * @param name 类名
+ * @returns {*}
+ */
+ext.getStatic = function (name) {
+ return base.getClass(name).static;
+};
+/**
+ * 获得随机数
+ * @param max 最大值
+ * @param min 最小值
+ */
+ext.random = function (max, min) {
+ min = min === undefined ? 0 : min;
+ return Math.floor(Math.random() * (max - min) + min);
+};
+/**
+ * 判断对象是否为Null
+ * @param obj 对象
+ * @returns {boolean} notNull返回True
+ */
+ext.notNull = function (obj) {
+ return obj !== undefined && obj !== null;
+};
+/**
+ * 判断对象是否为Null
+ * @param obj 对象
+ * @returns {boolean} Null返回True
+ */
+ext.isNull = function (obj) {
+ return obj === undefined || obj === null;
+};
\ No newline at end of file
diff --git a/src/main/resources/modules/init.js b/src/main/resources/modules/init.js
new file mode 100644
index 0000000..5f9ba86
--- /dev/null
+++ b/src/main/resources/modules/init.js
@@ -0,0 +1,9 @@
+'use strict';
+/*global require*/
+var global = this;
+load(rootDir + '/modules/ext.js');
+load(rootDir + '/modules/static.js');
+
+function init(plugin, engine) {
+ log.d("Version: %s", plugin.getDescription().getVersion());
+}
\ No newline at end of file
diff --git a/src/main/resources/modules/static.js b/src/main/resources/modules/static.js
new file mode 100644
index 0000000..6256b03
--- /dev/null
+++ b/src/main/resources/modules/static.js
@@ -0,0 +1,24 @@
+/**
+ * 基础静态类
+ * Created by 蒋天蓓 on 2017/2/9 0009.
+ */
+/**
+ * 日志类
+ */
+var log = base.getLog().static;
+/**
+ * ActionBar类
+ */
+var actionbar = base.getActionBar().static;
+/**
+ * Title类
+ */
+var title = base.getTitle().static;
+/**
+ * 玩家兼容类
+ */
+var cplayer = base.getPlayer().static;
+/**
+ * 工具类
+ */
+var mctools = base.getTools().static;
\ No newline at end of file
diff --git a/src/main/test/java/pw/yumc/MiaoScript/MiaoScriptTest.java b/src/main/test/java/pw/yumc/MiaoScript/MiaoScriptTest.java
new file mode 100644
index 0000000..58e89ef
--- /dev/null
+++ b/src/main/test/java/pw/yumc/MiaoScript/MiaoScriptTest.java
@@ -0,0 +1,37 @@
+package pw.yumc.MiaoScript;
+
+import java.io.FileReader;
+
+import javax.script.ScriptEngineManager;
+
+import org.junit.Test;
+
+import pw.yumc.YumCore.bukkit.Log;
+import pw.yumc.YumCore.engine.MiaoScriptEngine;
+
+/**
+ * Created with IntelliJ IDEA
+ *
+ * @author 喵♂呜
+ * Created on 2017/9/14 10:08.
+ */
+public class MiaoScriptTest {
+ private MiaoScriptEngine engine;
+
+ @Test
+ public void testBoot() {
+ Thread currentThread = Thread.currentThread();
+ ClassLoader previousClassLoader = currentThread.getContextClassLoader();
+ currentThread.setContextClassLoader(getClass().getClassLoader());
+ try {
+ ScriptEngineManager manager = new ScriptEngineManager();
+ this.engine = new MiaoScriptEngine(manager);
+ this.engine.eval(new FileReader("src/main/resources/bios.js"));
+ engine.invokeFunction("boot", this, engine);
+ } catch (Exception e) {
+ Log.w("脚本引擎初始化失败! %s:%s", e.getClass().getName(), e.getMessage());
+ } finally {
+ currentThread.setContextClassLoader(previousClassLoader);
+ }
+ }
+}
\ No newline at end of file