4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -38,3 +38,7 @@
 | 
			
		||||
/atlassian-ide-plugin.xml
 | 
			
		||||
 | 
			
		||||
/src/main/resources/cache/
 | 
			
		||||
 | 
			
		||||
# ThinkPHP
 | 
			
		||||
vendor/
 | 
			
		||||
composer.lock
 | 
			
		||||
							
								
								
									
										21
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								pom.xml
									
									
									
									
									
								
							@@ -3,7 +3,7 @@
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
    <groupId>pw.yumc</groupId>
 | 
			
		||||
    <artifactId>MiaoScript</artifactId>
 | 
			
		||||
    <version>1.1.4</version>
 | 
			
		||||
    <version>1.1.5</version>
 | 
			
		||||
    <developers>
 | 
			
		||||
        <developer>
 | 
			
		||||
            <id>502647092</id>
 | 
			
		||||
@@ -49,7 +49,7 @@
 | 
			
		||||
                    </execution>
 | 
			
		||||
                </executions>
 | 
			
		||||
            </plugin>
 | 
			
		||||
            <plugin>
 | 
			
		||||
            <!--<plugin>
 | 
			
		||||
                <groupId>com.github.wvengen</groupId>
 | 
			
		||||
                <artifactId>proguard-maven-plugin</artifactId>
 | 
			
		||||
                <version>2.0.13</version>
 | 
			
		||||
@@ -71,7 +71,7 @@
 | 
			
		||||
                        </configuration>
 | 
			
		||||
                    </execution>
 | 
			
		||||
                </executions>
 | 
			
		||||
            </plugin>
 | 
			
		||||
            </plugin>-->
 | 
			
		||||
        </plugins>
 | 
			
		||||
    </build>
 | 
			
		||||
    <ciManagement>
 | 
			
		||||
@@ -94,6 +94,10 @@
 | 
			
		||||
            <id>yumc-repo</id>
 | 
			
		||||
            <url>http://repo.yumc.pw/content/groups/public/</url>
 | 
			
		||||
        </repository>
 | 
			
		||||
        <repository>
 | 
			
		||||
            <id>sponge</id>
 | 
			
		||||
            <url>https://repo.spongepowered.org/maven/</url>
 | 
			
		||||
        </repository>
 | 
			
		||||
    </repositories>
 | 
			
		||||
    <pluginRepositories>
 | 
			
		||||
        <pluginRepository>
 | 
			
		||||
@@ -114,6 +118,17 @@
 | 
			
		||||
            <artifactId>YumCore</artifactId>
 | 
			
		||||
            <type>jar</type>
 | 
			
		||||
            <version>[1.8,)</version>
 | 
			
		||||
            <exclusions>
 | 
			
		||||
                <exclusion>
 | 
			
		||||
                    <groupId>org.bukkit</groupId>
 | 
			
		||||
                    <artifactId>craftbukkit</artifactId>
 | 
			
		||||
                </exclusion>
 | 
			
		||||
            </exclusions>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>org.spongepowered</groupId>
 | 
			
		||||
            <artifactId>spongeapi</artifactId>
 | 
			
		||||
            <version>6.0.0</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
</project>
 | 
			
		||||
@@ -26,6 +26,9 @@
 | 
			
		||||
-keepclassmembers class * implements net.md_5.bungee.api.plugin.Listener {
 | 
			
		||||
	@net.md_5.bungee.event.EventHandler <methods>;
 | 
			
		||||
}
 | 
			
		||||
-keepclassmembers class * {
 | 
			
		||||
  @org.spongepowered.api.event.Listener <methods>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# -----保护继承事件不被清理-----
 | 
			
		||||
-keep class ** extends org.bukkit.event.Event {*;}
 | 
			
		||||
@@ -46,6 +49,9 @@
 | 
			
		||||
-keepclassmembers class **.commands.annotation.** {<methods>;}
 | 
			
		||||
-keepclassmembers class * implements **.commands.interfaces.Executor {<methods>;}
 | 
			
		||||
 | 
			
		||||
# -----保护注解命令方法不被清理-----
 | 
			
		||||
-keep @org.spongepowered.api.plugin.Plugin class * {*;}
 | 
			
		||||
 | 
			
		||||
# -----保护注解NotProguard标记-----
 | 
			
		||||
-keep class **.NotProguard
 | 
			
		||||
-keep @**.NotProguard class * {*;}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,13 +6,8 @@ import java.nio.file.Files;
 | 
			
		||||
import java.nio.file.Path;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
 | 
			
		||||
import lombok.val;
 | 
			
		||||
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.mc.MinecraftTools;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -23,25 +18,15 @@ import pw.yumc.YumCore.mc.MinecraftTools;
 | 
			
		||||
 */
 | 
			
		||||
@NotProguard
 | 
			
		||||
public class Base {
 | 
			
		||||
    public Plugin getPlugin() {
 | 
			
		||||
        return P.instance;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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.fd("读取文件 %s ...", path);
 | 
			
		||||
        return new String(Files.readAllBytes(new File(path).toPath()), "UTF-8");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void save(String path, String content) throws IOException {
 | 
			
		||||
        Log.fd("保存文件 %s ...", path);
 | 
			
		||||
        File file = new File(path);
 | 
			
		||||
        file.getParentFile().mkdirs();
 | 
			
		||||
        Files.write(file.toPath(), content.getBytes("UTF-8"));
 | 
			
		||||
@@ -54,7 +39,6 @@ public class Base {
 | 
			
		||||
    public void delete(Path path) throws IOException {
 | 
			
		||||
        val file = path.toFile();
 | 
			
		||||
        if (!file.exists()) { return; }
 | 
			
		||||
        Log.fd("删除文件 %s ...", path);
 | 
			
		||||
        if (file.isDirectory()) {
 | 
			
		||||
            for (Path f : Files.list(file.toPath()).collect(Collectors.toList())) {
 | 
			
		||||
                delete(f);
 | 
			
		||||
@@ -63,18 +47,6 @@ public class Base {
 | 
			
		||||
        Files.delete(path);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,6 @@
 | 
			
		||||
package pw.yumc.MiaoScript;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
 | 
			
		||||
import javax.script.ScriptEngineManager;
 | 
			
		||||
import javax.script.ScriptException;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
@@ -19,7 +15,6 @@ import pw.yumc.YumCore.commands.CommandSub;
 | 
			
		||||
import pw.yumc.YumCore.commands.annotation.Cmd;
 | 
			
		||||
import pw.yumc.YumCore.commands.annotation.Help;
 | 
			
		||||
import pw.yumc.YumCore.commands.interfaces.Executor;
 | 
			
		||||
import pw.yumc.YumCore.engine.MiaoScriptEngine;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 喵式脚本
 | 
			
		||||
@@ -28,33 +23,34 @@ import pw.yumc.YumCore.engine.MiaoScriptEngine;
 | 
			
		||||
 * @since 2016年8月29日 上午7:50:39
 | 
			
		||||
 */
 | 
			
		||||
public class MiaoScript extends JavaPlugin implements Executor {
 | 
			
		||||
    private MiaoScriptEngine engine;
 | 
			
		||||
    private ScriptEngine engine;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @SneakyThrows
 | 
			
		||||
    public void onEnable() {
 | 
			
		||||
        new CommandSub("ms", this);
 | 
			
		||||
        saveScript();
 | 
			
		||||
        enableEngine();
 | 
			
		||||
        engine = new ScriptEngine(getDataFolder().getCanonicalPath(), getClassLoader(), getLogger());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Cmd
 | 
			
		||||
    @Help("执行 JS 代码")
 | 
			
		||||
    @SneakyThrows
 | 
			
		||||
    public void js(CommandSender sender, String script) {
 | 
			
		||||
        result(sender, engine.eval(script));
 | 
			
		||||
        result(sender, engine.getEngine().eval(script));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Cmd
 | 
			
		||||
    @Help("执行 JS 代码文件")
 | 
			
		||||
    @SneakyThrows
 | 
			
		||||
    public void file(CommandSender sender, String file) {
 | 
			
		||||
        result(sender, engine.eval("load('" + new File(getDataFolder(), file).getCanonicalPath() + "')"));
 | 
			
		||||
        result(sender, engine.getEngine().eval("load('" + new File(getDataFolder(), file).getCanonicalPath() + "')"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Cmd
 | 
			
		||||
    @Help("重启脚本引擎")
 | 
			
		||||
    public void reload(CommandSender sender) {
 | 
			
		||||
        disableEngine();
 | 
			
		||||
        engine.disableEngine();
 | 
			
		||||
        val server = Bukkit.getServer();
 | 
			
		||||
        try {
 | 
			
		||||
            server.getScheduler().cancelTasks(this);
 | 
			
		||||
@@ -65,7 +61,7 @@ public class MiaoScript extends JavaPlugin implements Executor {
 | 
			
		||||
        } catch (Exception ex) {
 | 
			
		||||
            Log.d("Error reload", ex);
 | 
			
		||||
        }
 | 
			
		||||
        enableEngine();
 | 
			
		||||
        engine.enableEngine();
 | 
			
		||||
        Log.sender(sender, "§bMiaoScript §eEngine §a重启完成!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -82,34 +78,8 @@ public class MiaoScript extends JavaPlugin implements Executor {
 | 
			
		||||
        P.saveFile("plugins");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void enableEngine() {
 | 
			
		||||
        Thread currentThread = Thread.currentThread();
 | 
			
		||||
        ClassLoader previousClassLoader = currentThread.getContextClassLoader();
 | 
			
		||||
        currentThread.setContextClassLoader(getClassLoader());
 | 
			
		||||
        try {
 | 
			
		||||
            ScriptEngineManager manager = new ScriptEngineManager();
 | 
			
		||||
            this.engine = new MiaoScriptEngine(manager, "nashorn");
 | 
			
		||||
            this.engine.put("base", new Base());
 | 
			
		||||
            this.engine.eval(new InputStreamReader(this.getResource("bios.js")));
 | 
			
		||||
            engine.invokeFunction("boot", this);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            Log.d(e);
 | 
			
		||||
        } finally {
 | 
			
		||||
            currentThread.setContextClassLoader(previousClassLoader);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void disableEngine() {
 | 
			
		||||
        try {
 | 
			
		||||
            engine.invokeFunction("disable");
 | 
			
		||||
        } catch (ScriptException | NoSuchMethodException e) {
 | 
			
		||||
            Log.w("脚本引擎关闭失败! %s:%s", e.getClass().getName(), e.getMessage());
 | 
			
		||||
            Log.d(e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onDisable() {
 | 
			
		||||
        disableEngine();
 | 
			
		||||
        engine.disableEngine();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										91
									
								
								src/main/java/pw/yumc/MiaoScript/MiaoScriptSponge.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								src/main/java/pw/yumc/MiaoScript/MiaoScriptSponge.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
			
		||||
package pw.yumc.MiaoScript;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.FileReader;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import javax.script.ScriptException;
 | 
			
		||||
 | 
			
		||||
import org.spongepowered.api.Sponge;
 | 
			
		||||
import org.spongepowered.api.command.CommandResult;
 | 
			
		||||
import org.spongepowered.api.command.args.GenericArguments;
 | 
			
		||||
import org.spongepowered.api.command.spec.CommandSpec;
 | 
			
		||||
import org.spongepowered.api.config.ConfigDir;
 | 
			
		||||
import org.spongepowered.api.event.Listener;
 | 
			
		||||
import org.spongepowered.api.event.game.state.GameInitializationEvent;
 | 
			
		||||
import org.spongepowered.api.event.game.state.GameStartedServerEvent;
 | 
			
		||||
import org.spongepowered.api.plugin.Plugin;
 | 
			
		||||
import org.spongepowered.api.text.Text;
 | 
			
		||||
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import lombok.SneakyThrows;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created with IntelliJ IDEA
 | 
			
		||||
 *
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 * Created on 2017/10/25 20:35.
 | 
			
		||||
 */
 | 
			
		||||
@Plugin(id = "miaoscript", name = "MiaoScript", version = "1.0", authors = "喵♂呜")
 | 
			
		||||
public class MiaoScriptSponge {
 | 
			
		||||
    private ScriptEngine engine;
 | 
			
		||||
    @Inject
 | 
			
		||||
    private Logger logger;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    @ConfigDir(sharedRoot = false)
 | 
			
		||||
    private File pluginConfigDir;
 | 
			
		||||
 | 
			
		||||
    @Listener
 | 
			
		||||
    public void onInit(GameInitializationEvent event) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private CommandSpec main() {
 | 
			
		||||
        return CommandSpec.builder()
 | 
			
		||||
                          .description(Text.of("喵式脚本主命令"))
 | 
			
		||||
                          .permission("MiaoScript.admin")
 | 
			
		||||
                          .child(js(), "js")
 | 
			
		||||
                          .child(file(), "file")
 | 
			
		||||
                          .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private CommandSpec js() {
 | 
			
		||||
        return CommandSpec.builder()
 | 
			
		||||
                          .description(Text.of("执行JS命令"))
 | 
			
		||||
                          .arguments(GenericArguments.onlyOne(GenericArguments.remainingJoinedStrings(Text.of("js"))))
 | 
			
		||||
                          .executor((src, args) -> {
 | 
			
		||||
                              try {
 | 
			
		||||
                                  engine.getEngine().eval(args.<String>getOne("js").orElse(""));
 | 
			
		||||
                              } catch (ScriptException e) {
 | 
			
		||||
                                  e.printStackTrace();
 | 
			
		||||
                              }
 | 
			
		||||
                              return CommandResult.success();
 | 
			
		||||
                          })
 | 
			
		||||
                          .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private CommandSpec file() {
 | 
			
		||||
        return CommandSpec.builder()
 | 
			
		||||
                          .description(Text.of("执行JS文件"))
 | 
			
		||||
                          .arguments(GenericArguments.onlyOne(GenericArguments.remainingJoinedStrings(Text.of("js"))))
 | 
			
		||||
                          .executor((src, args) -> {
 | 
			
		||||
                              try {
 | 
			
		||||
                                  engine.getEngine().eval(new FileReader(new File(pluginConfigDir, args.<String>getOne("js").orElse(""))));
 | 
			
		||||
                              } catch (ScriptException | IOException e) {
 | 
			
		||||
                                  e.printStackTrace();
 | 
			
		||||
                              }
 | 
			
		||||
                              return CommandResult.success();
 | 
			
		||||
                          })
 | 
			
		||||
                          .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Listener
 | 
			
		||||
    @SneakyThrows
 | 
			
		||||
    public void onStart(GameStartedServerEvent event) {
 | 
			
		||||
        Sponge.getServer().getConsole();
 | 
			
		||||
        Sponge.getCommandManager().register(this, main(), "ms", "mscript", "MiaoScript");
 | 
			
		||||
        engine = new ScriptEngine(pluginConfigDir.getCanonicalPath(), Thread.currentThread().getContextClassLoader(), logger);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										54
									
								
								src/main/java/pw/yumc/MiaoScript/ScriptEngine.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/main/java/pw/yumc/MiaoScript/ScriptEngine.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
package pw.yumc.MiaoScript;
 | 
			
		||||
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import javax.script.ScriptEngineManager;
 | 
			
		||||
import javax.script.ScriptException;
 | 
			
		||||
 | 
			
		||||
import pw.yumc.YumCore.engine.MiaoScriptEngine;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created with IntelliJ IDEA
 | 
			
		||||
 *
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 * Created on 2017/10/25 21:01.
 | 
			
		||||
 */
 | 
			
		||||
public class ScriptEngine {
 | 
			
		||||
    private String root;
 | 
			
		||||
    private ClassLoader classLoader;
 | 
			
		||||
    private Logger logger;
 | 
			
		||||
    private MiaoScriptEngine engine;
 | 
			
		||||
 | 
			
		||||
    public ScriptEngine(String root, ClassLoader classLoader, Logger logger) {
 | 
			
		||||
        this.root = root;
 | 
			
		||||
        this.classLoader = classLoader;
 | 
			
		||||
        this.logger = logger;
 | 
			
		||||
        enableEngine();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void enableEngine() {
 | 
			
		||||
        try {
 | 
			
		||||
            ScriptEngineManager manager = new ScriptEngineManager(null);
 | 
			
		||||
            this.engine = new MiaoScriptEngine(manager, "nashorn");
 | 
			
		||||
            this.engine.put("base", new Base());
 | 
			
		||||
            this.engine.eval(new InputStreamReader(classLoader.getResourceAsStream("bios.js")));
 | 
			
		||||
            engine.invokeFunction("boot", root, logger);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            logger.log(Level.SEVERE, "MiaoScript 启动失败!", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void disableEngine() {
 | 
			
		||||
        try {
 | 
			
		||||
            engine.invokeFunction("disable");
 | 
			
		||||
        } catch (ScriptException | NoSuchMethodException e) {
 | 
			
		||||
            logger.log(Level.SEVERE, "MiaoScript 关闭失败!", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public MiaoScriptEngine getEngine() {
 | 
			
		||||
        return engine;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,26 +1,62 @@
 | 
			
		||||
'use strict';
 | 
			
		||||
var log = base.getLog().static;
 | 
			
		||||
var log;
 | 
			
		||||
var boot;
 | 
			
		||||
var disable;
 | 
			
		||||
/**
 | 
			
		||||
 * 初始化框架引擎
 | 
			
		||||
 */
 | 
			
		||||
(function () {
 | 
			
		||||
    boot = function (plugin) {
 | 
			
		||||
    boot = function (root, logger) {
 | 
			
		||||
        log = logger;
 | 
			
		||||
        // 开发环境下初始化
 | 
			
		||||
        var root = "src/main/resources";
 | 
			
		||||
        if (plugin !== null) {
 | 
			
		||||
            // noinspection JSUnresolvedVariable
 | 
			
		||||
            root = plugin.dataFolder.canonicalPath;
 | 
			
		||||
        }
 | 
			
		||||
        root = root || "src/main/resources";
 | 
			
		||||
        // 解压文件到根目录
 | 
			
		||||
        release(root, "[core|modules]/.*", true);
 | 
			
		||||
        release(root, "plugins/.*");
 | 
			
		||||
        load(root + '/core/init.js');
 | 
			
		||||
        try {
 | 
			
		||||
            init(root);
 | 
			
		||||
        } catch (ex) {
 | 
			
		||||
            log.w("MiaoScript 初始化失败! %s", ex);
 | 
			
		||||
            throw ex;
 | 
			
		||||
        } finally {
 | 
			
		||||
            disable = disablePlugins
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    function release(root, regex, replace) {
 | 
			
		||||
        print(Array.prototype.join.call(arguments, ' '));
 | 
			
		||||
        var Files = Java.type("java.nio.file.Files");
 | 
			
		||||
        var Paths = Java.type("java.nio.file.Paths");
 | 
			
		||||
        var StandardCopyOption = Java.type("java.nio.file.StandardCopyOption");
 | 
			
		||||
 | 
			
		||||
        var classLoader = java.lang.Thread.currentThread().getContextClassLoader();
 | 
			
		||||
        var url = classLoader.getResource("plugin.yml");
 | 
			
		||||
        if (url === null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        var upath = url.getFile().substring(url.getFile().indexOf("/") + 1);
 | 
			
		||||
        var jarPath = java.net.URLDecoder.decode(upath.substring(0, upath.indexOf('!')));
 | 
			
		||||
        if (!Files.exists(Paths.get(jarPath))) {
 | 
			
		||||
            jarPath = "/" + jarPath;
 | 
			
		||||
        }
 | 
			
		||||
        try {
 | 
			
		||||
            var jar = new java.util.jar.JarFile(jarPath);
 | 
			
		||||
            var r = new RegExp(regex);// "[core|modules]/.*"
 | 
			
		||||
            jar.stream().forEach(function (entry) {
 | 
			
		||||
                if (!entry.isDirectory()) {
 | 
			
		||||
                    if (r.test(entry.name)) {
 | 
			
		||||
                        var path = Paths.get(root, entry.name);
 | 
			
		||||
                        var parentFile = path.toFile().parentFile;
 | 
			
		||||
                        if (!parentFile.exists()) {
 | 
			
		||||
                            parentFile.mkdirs();
 | 
			
		||||
                        }
 | 
			
		||||
                        Files.copy(classLoader.getResourceAsStream(entry.name), path, StandardCopyOption[replace ? 'REPLACE_EXISTING' : 'ATOMIC_MOVE']);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
        } catch (ex) {
 | 
			
		||||
 | 
			
		||||
        } finally {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
})();
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
(function (global) {
 | 
			
		||||
    var Arrays = Java.type('java.util.Arrays');
 | 
			
		||||
    var Level = Java.type('java.util.logging.Level');
 | 
			
		||||
    var String = Java.type('java.lang.String');
 | 
			
		||||
    var Console = function (name) {
 | 
			
		||||
        Object.defineProperty(this, 'name', {
 | 
			
		||||
            get: function () {
 | 
			
		||||
@@ -17,38 +18,66 @@
 | 
			
		||||
        });
 | 
			
		||||
        this.name = name;
 | 
			
		||||
        this.log = function () {
 | 
			
		||||
            log.i(this.name + Array.prototype.join.call(arguments, ' '));
 | 
			
		||||
        },
 | 
			
		||||
            log.info(this.name + Array.prototype.join.call(arguments, ' '));
 | 
			
		||||
        };
 | 
			
		||||
        this.warn = function () {
 | 
			
		||||
            log.w(this.name + Array.prototype.join.call(arguments, ' '));
 | 
			
		||||
        },
 | 
			
		||||
            log.warning(this.name + Array.prototype.join.call(arguments, ' '));
 | 
			
		||||
        };
 | 
			
		||||
        this.error = function () {
 | 
			
		||||
            log.log(Level.SEVERE, this.name + Array.prototype.join.call(arguments, ' '));
 | 
			
		||||
        },
 | 
			
		||||
        this.debug = function () {
 | 
			
		||||
            log.d(this.name + Array.prototype.join.call(arguments, ' '));
 | 
			
		||||
        }
 | 
			
		||||
        };
 | 
			
		||||
        switch (DetectServerType) {
 | 
			
		||||
            case ServerType.Bukkit:
 | 
			
		||||
                this.sender = function () {
 | 
			
		||||
                    var sender = arguments[0];
 | 
			
		||||
            if (!(sender instanceof org.bukkit.command.CommandSender)) { console.error("第一个参数未实现 org.bukkit.command.CommandSender 无法发送消息!") }
 | 
			
		||||
                    if (!(sender instanceof org.bukkit.command.CommandSender)) {
 | 
			
		||||
                        console.error("第一个参数未实现 org.bukkit.command.CommandSender 无法发送消息!")
 | 
			
		||||
                    }
 | 
			
		||||
                    var args = Array.prototype.slice.call(arguments, 1);
 | 
			
		||||
                    sender.sendMessage(this.prefix + args.join(' '));
 | 
			
		||||
                };
 | 
			
		||||
                this.console = function () {
 | 
			
		||||
                    this.sender(MServer.consoleSender, Array.prototype.join.call(arguments, ' '));
 | 
			
		||||
                };
 | 
			
		||||
                break;
 | 
			
		||||
            case ServerType.Sponge:
 | 
			
		||||
                this.sender = function () {
 | 
			
		||||
                    var Text = Java.type("org.spongepowered.api.text.Text");
 | 
			
		||||
                    var sender = arguments[0];
 | 
			
		||||
                    if (!(sender instanceof org.spongepowered.api.command.CommandSource)) {
 | 
			
		||||
                        console.error("第一个参数未实现 org.spongepowered.api.command.CommandSource 无法发送消息!")
 | 
			
		||||
                    }
 | 
			
		||||
                    var args = Array.prototype.slice.call(arguments, 1);
 | 
			
		||||
                    sender.sendMessage(Text.of(this.prefix + args.join(' ')));
 | 
			
		||||
                };
 | 
			
		||||
                this.console = function () {
 | 
			
		||||
                    this.sender(MServer.server.console, Array.prototype.join.call(arguments, ' '));
 | 
			
		||||
                };
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                this.sender = function () {
 | 
			
		||||
                    throw Error("console.sender 不支持的服务器类型: " + DetectServerType);
 | 
			
		||||
                };
 | 
			
		||||
                this.console = function () {
 | 
			
		||||
                    throw Error("console.console 不支持的服务器类型: " + DetectServerType);
 | 
			
		||||
                };
 | 
			
		||||
        }
 | 
			
		||||
        this.debug = this.log;
 | 
			
		||||
        this.ex = function (ex) {
 | 
			
		||||
            log.console('§4' + ex);
 | 
			
		||||
            this.console('§4' + ex);
 | 
			
		||||
            var track = ex.getStackTrace();
 | 
			
		||||
            if (track.class) { track = Arrays.asList(track) }
 | 
			
		||||
            if (track.forEach) {
 | 
			
		||||
            if (track.class) {
 | 
			
		||||
                track = Arrays.asList(track)
 | 
			
		||||
            }
 | 
			
		||||
            track.forEach(function (stack) {
 | 
			
		||||
                if (stack.className.startsWith('<')) {
 | 
			
		||||
                        log.console('    §e位于 §c%s => §c%s §4行%s', stack.fileName, stack.methodName, stack.lineNumber);
 | 
			
		||||
                    this.console(String.format('    §e位于 §c%s => §c%s §4行%s', stack.fileName, stack.methodName, stack.lineNumber));
 | 
			
		||||
                } else {
 | 
			
		||||
                        log.console('    §e位于 §c%s.%s(§4%s:%s§c)', stack.className, stack.methodName, stack.fileName, stack.lineNumber);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
                    this.console(String.format('    §e位于 §c%s.%s(§4%s:%s§c)', stack.className, stack.methodName, stack.fileName, stack.lineNumber));
 | 
			
		||||
                }
 | 
			
		||||
            }.bind(this));
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    global.Console = Console;
 | 
			
		||||
    global.console = new Console();
 | 
			
		||||
})(global)
 | 
			
		||||
})(global);
 | 
			
		||||
							
								
								
									
										22
									
								
								src/main/resources/core/detect.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/main/resources/core/detect.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
/**
 | 
			
		||||
 * 服务器探测类
 | 
			
		||||
 */
 | 
			
		||||
/*global base*/
 | 
			
		||||
var ServerType = {
 | 
			
		||||
    Bukkit: 1,
 | 
			
		||||
    Sponge: 2
 | 
			
		||||
};
 | 
			
		||||
var MServer;
 | 
			
		||||
var DetectServerType = ServerType.Bukkit;
 | 
			
		||||
try {
 | 
			
		||||
    MServer = Java.type("org.bukkit.Bukkit");
 | 
			
		||||
    DetectServerType = ServerType.Bukkit;
 | 
			
		||||
} catch (ex) {
 | 
			
		||||
    // IGNORE
 | 
			
		||||
}
 | 
			
		||||
try {
 | 
			
		||||
    MServer = Java.type("org.spongepowered.api.Sponge");
 | 
			
		||||
    DetectServerType = ServerType.Sponge;
 | 
			
		||||
} catch (ex) {
 | 
			
		||||
    // IGNORE
 | 
			
		||||
}
 | 
			
		||||
@@ -18,6 +18,7 @@ function init(root) {
 | 
			
		||||
function loadCore() {
 | 
			
		||||
    // 加载基础模块
 | 
			
		||||
    load(root + '/core/ext.js');
 | 
			
		||||
    load(root + '/core/detect.js');
 | 
			
		||||
    load(root + '/core/console.js');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    'use strict';
 | 
			
		||||
    var File = Java.type("java.io.File");
 | 
			
		||||
    var separatorChar = File.separatorChar;
 | 
			
		||||
    var paths = [parent, '', parent + separatorChar + 'core', parent + separatorChar + 'modules'];
 | 
			
		||||
    var paths = [parent, parent + separatorChar + 'core', parent + separatorChar + 'modules'];
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 解析模块名称为文件
 | 
			
		||||
@@ -17,6 +17,7 @@
 | 
			
		||||
     * 核心目录 /core
 | 
			
		||||
     * 模块目录 /modules
 | 
			
		||||
     * @param name 模块名称
 | 
			
		||||
     * @param parent 父目录
 | 
			
		||||
     */
 | 
			
		||||
    function resolve(name, parent) {
 | 
			
		||||
        if (_canonical(name)) {
 | 
			
		||||
@@ -43,7 +44,7 @@
 | 
			
		||||
     * @returns {*}
 | 
			
		||||
     */
 | 
			
		||||
    function resolveAsFile(dir, file) {
 | 
			
		||||
        var file = ext.notNull(dir) ? new File(dir, file) : new File(file);
 | 
			
		||||
        file = ext.notNull(dir) ? new File(dir, file) : new File(file);
 | 
			
		||||
        if (file.isFile()) {
 | 
			
		||||
            return file;
 | 
			
		||||
        }
 | 
			
		||||
@@ -58,7 +59,7 @@
 | 
			
		||||
     * @returns {*}
 | 
			
		||||
     */
 | 
			
		||||
    function resolveAsDirectory(dir, file) {
 | 
			
		||||
        var dir = ext.notNull(dir) ? new File(dir, file) : new File(file);
 | 
			
		||||
        dir = ext.notNull(dir) ? new File(dir, file) : new File(file);
 | 
			
		||||
        var _package = new File(dir, 'package.json');
 | 
			
		||||
        if (_package.exists()) {
 | 
			
		||||
            var json = JSON.parse(base.read(_package));
 | 
			
		||||
@@ -80,7 +81,8 @@
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 预编译模块
 | 
			
		||||
     * @param file
 | 
			
		||||
     * @param file JS文件
 | 
			
		||||
     * @param optional 附加选项
 | 
			
		||||
     * @returns {Object}
 | 
			
		||||
     */
 | 
			
		||||
    function compileJs(file, optional) {
 | 
			
		||||
@@ -98,13 +100,14 @@
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 编译模块
 | 
			
		||||
     * @param id
 | 
			
		||||
     * @param name
 | 
			
		||||
     * @param file
 | 
			
		||||
     * @param id 模块ID
 | 
			
		||||
     * @param name 模块名称
 | 
			
		||||
     * @param file 模块文件
 | 
			
		||||
     * @param optional 附加选项
 | 
			
		||||
     * @returns {Object}
 | 
			
		||||
     */
 | 
			
		||||
    function compileModule(id, name, file, optional) {
 | 
			
		||||
        log.fd('加载模块 %s 位于 %s Optional %s', name, id, optional.toJson());
 | 
			
		||||
        console.debug('加载模块 %s 位于 %s Optional %s', name, id, optional.toJson());
 | 
			
		||||
        // noinspection JSUnresolvedVariable
 | 
			
		||||
        var module = {
 | 
			
		||||
            id: id,
 | 
			
		||||
@@ -117,11 +120,11 @@
 | 
			
		||||
            compiledWrapper.apply(module.exports, [
 | 
			
		||||
                module, module.exports, module.require, file.parentFile, file
 | 
			
		||||
            ]);
 | 
			
		||||
            log.fd('模块 %s 编译成功!', name);
 | 
			
		||||
            console.debug('模块 %s 编译成功!', name);
 | 
			
		||||
            module.loaded = true;
 | 
			
		||||
        } catch (ex) {
 | 
			
		||||
            log.console("§4警告! §b模块 §a%s §4编译失败! ERR: %s", name, ex);
 | 
			
		||||
            log.d(ex);
 | 
			
		||||
            console.console("§4警告! §b模块 §a%s §4编译失败! ERR: %s", name, ex);
 | 
			
		||||
            console.ex(ex);
 | 
			
		||||
        }
 | 
			
		||||
        return module;
 | 
			
		||||
    }
 | 
			
		||||
@@ -145,16 +148,17 @@
 | 
			
		||||
     * 加载模块
 | 
			
		||||
     * @param name 模块名称
 | 
			
		||||
     * @param path 路径
 | 
			
		||||
     * @param optional 附加选项
 | 
			
		||||
     * @returns {*}
 | 
			
		||||
     * @private
 | 
			
		||||
     */
 | 
			
		||||
    function _require(name, path, optional) {
 | 
			
		||||
        var file = _canonical(name) ? name : resolve(name, path);
 | 
			
		||||
        if (file === undefined) {
 | 
			
		||||
            log.console("§c模块 §a%s §c加载失败! §4未找到该模块!", name);
 | 
			
		||||
            console.console("§c模块 §a%s §c加载失败! §4未找到该模块!", name);
 | 
			
		||||
            return {exports: {}};
 | 
			
		||||
        }
 | 
			
		||||
        if (!optional) optional = { cache: true }
 | 
			
		||||
        if (!optional) optional = {cache: true};
 | 
			
		||||
        // 重定向文件名称和类型
 | 
			
		||||
        name = file.name.split(".")[0];
 | 
			
		||||
        var id = _canonical(file);
 | 
			
		||||
@@ -185,6 +189,6 @@
 | 
			
		||||
        parent = new File(parent);
 | 
			
		||||
    }
 | 
			
		||||
    var cacheModules = [];
 | 
			
		||||
    log.d("初始化 require 模块组件 父目录 %s", _canonical(parent));
 | 
			
		||||
    console.debug("初始化 require 模块组件 父目录 %s", _canonical(parent));
 | 
			
		||||
    return exports(parent);
 | 
			
		||||
});
 | 
			
		||||
@@ -19,10 +19,10 @@ exports.nmsVersion = Bukkit.server.class.name.split('.')[3];
 | 
			
		||||
 */
 | 
			
		||||
exports.nmsCls = function (name) {
 | 
			
		||||
    return Java.type(['net.minecraft.server', exports.nmsVersion, name].join('.'));
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
exports.command = function (name) {
 | 
			
		||||
    return Server.getPluginCommand(name);
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
/**
 | 
			
		||||
 * 获取玩家
 | 
			
		||||
 */
 | 
			
		||||
@@ -35,7 +35,7 @@ exports.player = function(){
 | 
			
		||||
        default:
 | 
			
		||||
            return Bukkit.getPlayerExtra(arguments[0]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
/**
 | 
			
		||||
 * 获取在线玩家
 | 
			
		||||
 */
 | 
			
		||||
@@ -46,7 +46,7 @@ exports.players = function(){
 | 
			
		||||
        default:
 | 
			
		||||
            return Bukkit.onlinePlayers;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
/**
 | 
			
		||||
 * 插件管理
 | 
			
		||||
 * @type {{manager: *, get: exports.plugin.get, load: exports.plugin.load}}
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ var PluginCommand = Java.type('org.bukkit.command.PluginCommand');
 | 
			
		||||
var StringUtil = Java.type('org.bukkit.util.StringUtil');
 | 
			
		||||
 | 
			
		||||
var ArrayList = Java.type('java.util.ArrayList');
 | 
			
		||||
var Arrays = Java.type('java.util.Arrays')
 | 
			
		||||
var Arrays = Java.type('java.util.Arrays');
 | 
			
		||||
 | 
			
		||||
function enable(jsp) {
 | 
			
		||||
    var commands = jsp.description.commands;
 | 
			
		||||
@@ -29,7 +29,7 @@ function enable(jsp){
 | 
			
		||||
            if (command.permission) newCmd.setPermission(command.permission);
 | 
			
		||||
            if (command['permission-message']) newCmd.setPermissionMessage(command['permission-message']);
 | 
			
		||||
            pluginCmds.push(newCmd);
 | 
			
		||||
            log.d('插件 %s 注册命令 %s ...', jsp.description.name, name);
 | 
			
		||||
            console.debug('插件 %s 注册命令 %s ...', jsp.description.name, name);
 | 
			
		||||
        }
 | 
			
		||||
        commandMap.registerAll(jsp.description.name, Arrays.asList(pluginCmds));
 | 
			
		||||
    }
 | 
			
		||||
@@ -59,13 +59,13 @@ function register(jsp, cmd){
 | 
			
		||||
 | 
			
		||||
function on(jsp, name, exec) {
 | 
			
		||||
    var c = get(name) || create(jsp, name);
 | 
			
		||||
    log.d('插件 %s 设置命令 %s(%s) 执行器 ...', jsp.description.name, name, c);
 | 
			
		||||
    console.debug('插件 %s 设置命令 %s(%s) 执行器 ...', jsp.description.name, name, c);
 | 
			
		||||
    if (exec.cmd) {
 | 
			
		||||
        c.setExecutor(function (sender, cmd, command, args) {
 | 
			
		||||
            try {
 | 
			
		||||
                return exec.cmd(sender, command, args);
 | 
			
		||||
            } catch (ex) {
 | 
			
		||||
                log.console('§6玩家 §a%s §6执行 §b%s §6插件 §d%s %s §6命令时发生异常 §4%s', sender.name, jsp.description.name, command, Java.from(args).join(' '), ex);
 | 
			
		||||
                console.console('§6玩家 §a%s §6执行 §b%s §6插件 §d%s %s §6命令时发生异常 §4%s', sender.name, jsp.description.name, command, Java.from(args).join(' '), ex);
 | 
			
		||||
                console.ex(ex);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
@@ -78,14 +78,14 @@ function on(jsp, name, exec) {
 | 
			
		||||
                StringUtil.copyPartialMatches(token, Arrays.asList(exec.tab(sender, command, args)), completions);
 | 
			
		||||
                return completions;
 | 
			
		||||
            } catch (ex) {
 | 
			
		||||
                log.console('§6玩家 §a%s §6执行 §b%s §6插件 §d%s %s §6补全时发生异常 §4%s',sender.name ,jsp.description.name, command, Java.from(args).join(' '), ex);
 | 
			
		||||
                console.console('§6玩家 §a%s §6执行 §b%s §6插件 §d%s %s §6补全时发生异常 §4%s', sender.name, jsp.description.name, command, Java.from(args).join(' '), ex);
 | 
			
		||||
                console.ex(ex);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
exports.enable = enable
 | 
			
		||||
exports.enable = enable;
 | 
			
		||||
 | 
			
		||||
exports.on = on;
 | 
			
		||||
exports.off = function () {
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ function mapEventName() {
 | 
			
		||||
                        if (isVaildEvent(clz)) {
 | 
			
		||||
                            // noinspection JSUnresolvedVariable
 | 
			
		||||
                            var simpleName = clz.simpleName.toLowerCase();
 | 
			
		||||
                            log.fd("Mapping Event [%s] => %s", clz.name, simpleName);
 | 
			
		||||
                            console.debug("Mapping Event [%s] => %s", clz.name, simpleName);
 | 
			
		||||
                            mapEvent[simpleName] = clz;
 | 
			
		||||
                            count++;
 | 
			
		||||
                        }
 | 
			
		||||
@@ -90,7 +90,7 @@ function listen(jsp, event, exec, priority, ignoreCancel) {
 | 
			
		||||
        try {
 | 
			
		||||
            eventCls = base.getClass(eventCls);
 | 
			
		||||
        } catch (ex) {
 | 
			
		||||
            log.w("事件 %s 未找到!", event);
 | 
			
		||||
            console.warn("事件 %s 未找到!", event);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -118,7 +118,7 @@ function listen(jsp, event, exec, priority, ignoreCancel) {
 | 
			
		||||
                try {
 | 
			
		||||
                    exec(event);
 | 
			
		||||
                } catch (ex) {
 | 
			
		||||
                    log.console('§6插件 §b%s §6处理 §d%s §6事件时发生异常 §4%s', name, event.class.simpleName, ex);
 | 
			
		||||
                    console.console('§6插件 §b%s §6处理 §d%s §6事件时发生异常 §4%s', name, event.class.simpleName, ex);
 | 
			
		||||
                    console.ex(ex);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -133,18 +133,18 @@ function listen(jsp, event, exec, priority, ignoreCancel) {
 | 
			
		||||
        listener: listener,
 | 
			
		||||
        off: function () {
 | 
			
		||||
            ref.on(this.event).call('getHandlerList').get().unregister(this.listener);
 | 
			
		||||
            log.d('插件 %s 注销事件 %s', name, this.event.simpleName);
 | 
			
		||||
            console.debug('插件 %s 注销事件 %s', name, this.event.simpleName);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    listeners.push(off);
 | 
			
		||||
    // noinspection JSUnresolvedVariable
 | 
			
		||||
    log.d('插件 %s 注册事件 %s 方法 %s', name, eventCls.simpleName, exec.name === '' ? '匿名方法' : exec.name);
 | 
			
		||||
    console.debug('插件 %s 注册事件 %s 方法 %s', name, eventCls.simpleName, exec.name === '' ? '匿名方法' : exec.name);
 | 
			
		||||
    return off;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var mapEvent = [];
 | 
			
		||||
// 映射事件名称
 | 
			
		||||
log.i('Bukkit 事件映射完毕 共计 %s 个事件!', mapEventName().toFixed(0));
 | 
			
		||||
console.info('Bukkit 事件映射完毕 共计 %s 个事件!', mapEventName().toFixed(0));
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    on: listen,
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ function enable (plugin) {
 | 
			
		||||
            } catch (ex) {
 | 
			
		||||
                // ignore eg: java.lang.IllegalArgumentException: The permission xxxxxx.default is already defined!
 | 
			
		||||
            }
 | 
			
		||||
           log.d('插件 %s 注册权限 %s Default %s ...', plugin.description.name, name, def);
 | 
			
		||||
            console.debug('插件 %s 注册权限 %s Default %s ...', plugin.description.name, name, def);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -39,10 +39,10 @@ function disable (plugin) {
 | 
			
		||||
            } catch (ex) {
 | 
			
		||||
                // ignore eg: java.lang.IllegalArgumentException: The permission xxxxxx.default is already defined!
 | 
			
		||||
            }
 | 
			
		||||
           log.d('插件 %s 注销权限 %s ...', plugin.description.name, name);
 | 
			
		||||
            console.debug('插件 %s 注销权限 %s ...', plugin.description.name, name);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
exports.enable = enable
 | 
			
		||||
exports.disable = disable
 | 
			
		||||
exports.enable = enable;
 | 
			
		||||
exports.disable = disable;
 | 
			
		||||
@@ -18,9 +18,9 @@ var permission = require('./permission');
 | 
			
		||||
function loadPlugins(dir) {
 | 
			
		||||
    var plugin = fs.file(root, dir);
 | 
			
		||||
    if (!plugin) {
 | 
			
		||||
        log.i("首次加载 创建文件夹 %s ...", plugin);
 | 
			
		||||
        console.info("首次加载 创建文件夹 %s ...", plugin);
 | 
			
		||||
    } else {
 | 
			
		||||
        log.i("开始扫描 %s 下的插件 ...", plugin);
 | 
			
		||||
        console.info("开始扫描 %s 下的插件 ...", plugin);
 | 
			
		||||
        createUpdate(plugin);
 | 
			
		||||
        var files = [];
 | 
			
		||||
        fs.list(plugin).forEach(function (file) {
 | 
			
		||||
@@ -71,7 +71,7 @@ function loadJsPlugins(files) {
 | 
			
		||||
function loadPlugin(file) {
 | 
			
		||||
    var update = fs.file(fs.file(file.parentFile, 'update'), file.name);
 | 
			
		||||
    if (update.exists()) {
 | 
			
		||||
        log.i('自动升级插件 %s', file.name);
 | 
			
		||||
        console.info('自动升级插件 %s', file.name);
 | 
			
		||||
        fs.move(update, file, true);
 | 
			
		||||
    }
 | 
			
		||||
    var plugin = require(file, {
 | 
			
		||||
@@ -80,16 +80,16 @@ function loadPlugin(file) {
 | 
			
		||||
            return beforeLoadHook(origin);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
    log.d("插件编译结果: %s", plugin.toJson());
 | 
			
		||||
    console.debug("插件编译结果: %s", plugin.toJson());
 | 
			
		||||
    var desc = plugin.description;
 | 
			
		||||
    if (!desc || !desc.name) {
 | 
			
		||||
        log.w("文件 %s 不存在 description 描述信息 无法加载插件!", file);
 | 
			
		||||
        console.warn("文件 %s 不存在 description 描述信息 无法加载插件!", file);
 | 
			
		||||
    } else {
 | 
			
		||||
        initPlugin(file, plugin);
 | 
			
		||||
        afterLoadHook(plugin);
 | 
			
		||||
        plugins.push(plugin);
 | 
			
		||||
        plugins[plugin.description.name] = plugin;
 | 
			
		||||
        log.i('载入插件 %s 版本 %s By %s', desc.name, desc.version || '未知', desc.author || '未知');
 | 
			
		||||
        console.info('载入插件 %s 版本 %s By %s', desc.name, desc.version || '未知', desc.author || '未知');
 | 
			
		||||
    }
 | 
			
		||||
    return plugin;
 | 
			
		||||
}
 | 
			
		||||
@@ -124,9 +124,13 @@ function initPlugin(file, plugin){
 | 
			
		||||
    // 初始化 __DATA__
 | 
			
		||||
    plugin.__DATA__ = fs.file(file.parentFile, plugin.description.name);
 | 
			
		||||
    // 初始化 getDataFolder()
 | 
			
		||||
    plugin.getDataFolder = function() { return plugin.__DATA__; }
 | 
			
		||||
    plugin.getDataFolder = function () {
 | 
			
		||||
        return plugin.__DATA__;
 | 
			
		||||
    };
 | 
			
		||||
    // 初始化 getFile()
 | 
			
		||||
    plugin.getFile = function(name) { return fs.file(plugin.getDataFolder(), name); }
 | 
			
		||||
    plugin.getFile = function (name) {
 | 
			
		||||
        return fs.file(plugin.getDataFolder(), name);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // 初始化插件配置相关方法
 | 
			
		||||
    initPluginConfig(plugin);
 | 
			
		||||
@@ -157,7 +161,7 @@ function initPluginConfig(plugin){
 | 
			
		||||
                }
 | 
			
		||||
                return yaml.safeLoad(base.read(file));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    };
 | 
			
		||||
    /**
 | 
			
		||||
     * 重载配置文件
 | 
			
		||||
     * @constructor
 | 
			
		||||
@@ -165,7 +169,7 @@ function initPluginConfig(plugin){
 | 
			
		||||
     */
 | 
			
		||||
    plugin.reloadConfig = function () {
 | 
			
		||||
        plugin.config = plugin.getConfig(plugin.configFile);
 | 
			
		||||
    }
 | 
			
		||||
    };
 | 
			
		||||
    /**
 | 
			
		||||
     * 保存配置文件
 | 
			
		||||
     * @constructor
 | 
			
		||||
@@ -174,14 +178,14 @@ function initPluginConfig(plugin){
 | 
			
		||||
    plugin.saveConfig = function () {
 | 
			
		||||
        switch (arguments.length) {
 | 
			
		||||
            case 0:
 | 
			
		||||
                plugin.configFile.parentFile.mkdirs()
 | 
			
		||||
                plugin.configFile.parentFile.mkdirs();
 | 
			
		||||
                base.save(plugin.configFile, plugin.config.toYaml());
 | 
			
		||||
                break;
 | 
			
		||||
            case 2:
 | 
			
		||||
                base.save(arguments[0], arguments[1].toYaml());
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    };
 | 
			
		||||
    if (plugin.configFile.isFile()) {
 | 
			
		||||
        plugin.config = plugin.getConfig('config.yml');
 | 
			
		||||
    } else if (plugin.description.config) {
 | 
			
		||||
@@ -195,20 +199,28 @@ function runAndCatch(jsp, exec, ext) {
 | 
			
		||||
        try {
 | 
			
		||||
            // 绑定方法的this到插件自身
 | 
			
		||||
            exec.bind(jsp)();
 | 
			
		||||
            if (ext) { ext(); }
 | 
			
		||||
            if (ext) {
 | 
			
		||||
                ext();
 | 
			
		||||
            }
 | 
			
		||||
        } catch (ex) {
 | 
			
		||||
            log.console('§6插件 §b%s §6执行 §d%s §6方法时发生错误 §4%s', jsp.description.name, exec.name, ex.message);
 | 
			
		||||
            console.console('§6插件 §b%s §6执行 §d%s §6方法时发生错误 §4%s', jsp.description.name, exec.name, ex.message);
 | 
			
		||||
            console.ex(ex);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function checkAndGet(args) {
 | 
			
		||||
    if (args.length === 0) { return plugins; }
 | 
			
		||||
    if (args.length === 0) {
 | 
			
		||||
        return plugins;
 | 
			
		||||
    }
 | 
			
		||||
    var name = args[0];
 | 
			
		||||
    // 如果是插件 则直接返回
 | 
			
		||||
    if (name.description) { return [name]; }
 | 
			
		||||
    if (!exports.plugins[name]) { throw new Error("插件 " + name + " 不存在!"); }
 | 
			
		||||
    if (name.description) {
 | 
			
		||||
        return [name];
 | 
			
		||||
    }
 | 
			
		||||
    if (!exports.plugins[name]) {
 | 
			
		||||
        throw new Error("插件 " + name + " 不存在!");
 | 
			
		||||
    }
 | 
			
		||||
    return [exports.plugins[name]];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -220,7 +232,7 @@ exports.init = function (plugin, path) {
 | 
			
		||||
    if (plugin !== null) {
 | 
			
		||||
        // 如果过plugin不等于null 则代表是正式环境
 | 
			
		||||
        exports.$ = plugin;
 | 
			
		||||
        log.i("初始化 MiaoScript 插件系统 版本: %s", plugin.description.version);
 | 
			
		||||
        console.info("初始化 MiaoScript 插件系统 版本: %s", plugin.description.version);
 | 
			
		||||
    }
 | 
			
		||||
    loadPlugins(path);
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ function enable() {
 | 
			
		||||
        tab: function tab(sender, command, args) {
 | 
			
		||||
            return ['reload'];
 | 
			
		||||
        }
 | 
			
		||||
    })
 | 
			
		||||
    });
 | 
			
		||||
    bukkit.players(function (p) fakeTag.set(p));
 | 
			
		||||
    event.on(self, 'PlayerJoin', function (event) fakeTag.set(event.player));
 | 
			
		||||
    var entityUpdate = function (event) {
 | 
			
		||||
@@ -118,7 +118,7 @@ function FakeTag(name) {
 | 
			
		||||
        sendPacket(player, cache.objective);
 | 
			
		||||
        sendPacket(player, cache.display);
 | 
			
		||||
        this.update(player);
 | 
			
		||||
    }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    this.update = function (player) {
 | 
			
		||||
        var score = mainScoreboard.getPlayerScoreForObjective(player.name, objective);
 | 
			
		||||
@@ -127,13 +127,13 @@ function FakeTag(name) {
 | 
			
		||||
        //把其他玩家缓存的包发给这个玩家
 | 
			
		||||
        bukkit.players(function (t) {
 | 
			
		||||
            sendPacket(t, scorePack);
 | 
			
		||||
            if (t.name != player.name) {
 | 
			
		||||
            if (t.name !== player.name) {
 | 
			
		||||
                var outher = mainScoreboard.getPlayerScoreForObjective(t.name, objective);
 | 
			
		||||
                outher.setScore(t.getHealth());
 | 
			
		||||
                sendPacket(player, new PacketPlayOutScoreboardScore(outher));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    this.disable = function () {
 | 
			
		||||
        // 注销tag对象
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user