闲的没事,把Bugin导出的Jar包里的boot.js研究并注释了一下



  • 感觉 boot.js 真的可以修改很多东西 /偷笑 :100:
    我闲的没事花了半个下午的时间把差不多每行代码都注释了一遍,欢迎观看2333

    // 初始化 __scboot
    var __scboot = null;
    (function () {
        // 初始化几个变量赋值到java,初始化jsPlugins为PVPIN文件夹(io.File),初始化initScript为解压后的lib/load.js。
        var File = java.io.File, FileReader = java.io.FileReader, FileOutputStream = java.io.FileOutputStream, ZipInputStream = java.util.zip.ZipInputStream, jsPlugins = new File("pvpin"/*文件夹名称*/),
            initScript = "lib/load.js";
        // unzip,用于 line 65 解压缩PVPIN归档文件,例如pvpin_js_rt.zip。zis 为 classLoader.getResourceAsStream(归档文件名称) 即从Jar资源里调用相对路径"归档文件名称"。
        // logger 在 line 54 被赋值为 plugin.logman/plugin.logger,应该就是一个日志记录器,这个函数里貌似也没调用,不知道是干嘛的。/掀桌
        var unzip = function (zis, logger) {
            // 初始化几个接下来会用到的变量,
            var entry, reason = null, unzipFile = false, zTime = 0, fTime = 0, fout = null, c, newFile;
            // 这个因为也是java新手,不太了解,nectEntry猜测是java.util.zip.zipEntry中的内容。
            // (猜测) 赋值entry为zis(pvpin资源归档文件)这个归档文件中的下一个文件,如果非空,则:
            while ((entry = zis.nextEntry) != null) {
                // newFile 赋值为新的 io.File,于jsPlugin(line 17 PVPIN根文件夹)。用于新建 entry 文件(line 26 中归档文件中的文件)
                newFile = new File(jsPlugins, entry.name);
                // 如果 entry 是一个文件夹就新建该文件夹在newFile中(line 28),然后关闭该entry,继续continue下一步(别忘了这是个while)
                if (entry.isDirectory()) {
                    newFile.mkdirs();
                    zis.closeEntry();
                    continue
                }
                // 如果不是文件夹呢,先把几个变量准备好,reason很迷,不懂,可能是调试用吧,zTime是该entry(line 26 中归档文件中的文件)的修改日期。之后用于替换。
                // unzipFile 表明是否解压缩并替换entry(line 26 中归档文件中的文件)。
                reason = null;
                zTime = entry.time;
                unzipFile = false;
                // 如果该文件不存在那就很舒服,reason设一下,等着解压2333
                if (!newFile.exists()) {
                    reason = "NE";
                    unzipFile = true
                } else {
                    // 竟然存在?/掀桌
                    // fTime 设置那个存在的文件最后的修改时间
                    fTime = newFile.lastModified();
                    // 如果entry(line 26 中归档文件中的文件)最后的修改时间比原来存在的文件要晚
                    // (说明存在的那个是老文件)
                    if (zTime > fTime) {
                        // reason 设置为entry比原来那个存在的文件晚修改的小时数
                        reason = ((zTime - fTime) / 3600000) + "h";
                        // 很舒服,那就继续解压
                        unzipFile = true
                    }
                }
                // 如果允许解压,别忘了初始咱们的unzipFile是false,所以只要没有指定 unzipFile = true 那就不会解压
                if (unzipFile) {
                    // 替换文件,貌似很高深,看不太懂 awa
                    // fout 设置为newFile(别忘了,newFile是我们待解压文件在现实的碎碎念<???>qwq)的Output流
                    fout = new FileOutputStream(newFile);
                    // 然后循环读取、写入到真实的硬盘(就是解压缩了 /掀桌)
                    for (c = zis.read(); c != -1; c = zis.read()) {
                        fout.write(c)
                    }
                    // 很舒服,做完了,关掉
                    fout.close()
                }
                // 很舒服,这个循环就做完了,咱们下个while见
                zis.closeEntry()
            }
            // woc!竟然没了!
            // 最后close掉zis,防止碎碎念
            zis.close()
        };
        // 貌似是启动时候执行的函数。
        // plugin不知道哎,engine也不知道,唯一知道classLoader是line 18里的 initScript = "lib/load.js";
        __scboot = function (plugin, engine, classLoader) {
            // 赋值一大堆变量,第一个应该是日志记录器。emm,这个判断力的plugin.canary可能是是否测试版吧,反正如果它是true就赋值plugin.logman,否则赋值plugin.logger。
            // intiScriptFile 就是 lib/load.js(line 18 里的)具象化到 io.File。
            // zips 一个数组里面是所有要解压的PVPIN依赖的文件名,包含在Jar里,具体看 line 14 解压缩函数。
            // i = 0 zis len=2 不用解释了吧,后面会有 /偷懒2333
            var logger = plugin.canary ? plugin.logman : plugin.logger, initScriptFile = new File(jsPlugins, initScript), zips = ["pvpin_js_rt.zip", "pvpin-player.zip"], i = 0, zis, len = zips.length;
            // 如果PVPIN文件夹不存在,
            if (!jsPlugins.exists()) {
                // 下面的中文是我改的2333
                logger.info("PVPIN 所需文件夹 " + jsPlugins.canonicalPath + " 尚未被创建。");
                logger.info("开始创建 " + jsPlugins.canonicalPath + " 并解压该JAR文件所需归档文件。");
                // 然后创建一下
                jsPlugins.mkdirs()
            }
            // 接下来和unzip函数有关系,请看 line 14 解压缩函数
            for (i = 0; i < len; i++) {
                try {
                    if (plugin.canary) {
                        zis = new ZipInputStream(classLoader.getResourceAsStream(zips[i]));
                        unzip(zis, logger)
                    } else {
                        // if (plugin.config.getBoolean("extract-js." + zips[i])) {
                        zis = new ZipInputStream(plugin.getResource(zips[i]));
                        unzip(zis, logger)
                        // }
                    }
                } catch (e) {
                    // plugin.canary ? logger.error(zips[i]+" " + e) : logger.severe(zips[i]+" " + e)
                }
            }
    
            try {
                // 不知道什么意思唉 /摊手
                engine.eval(new FileReader(initScriptFile));
                __onEnable(engine, plugin, initScriptFile)
            } catch (e) {
                var msg = "Error evaluating " + initScriptFile + ": " + e;
                plugin.canary ? logger.error(msg) : logger.severe(msg);
                throw e
            }
        }
    })();
    

    That's what you knows.
    All what you knows about me have is what me knows what's me.

    1


  • 可啪

    不要点它→ 不要点我

    2


  • eval就是从字符串运行js代码…



  • 呵呵,今天才看完整个pvpin插件的运行系统,包括java代码和js代码

    return null;
    
    2


  • plugin,PVPIN Java代码执行函数时传递进来的plugin对象,也就是pvpin的插件对象
    engine 是PVPIN传递的js运行环境,为

    jdk.nashorn.api.scripting.NashornScriptEngine
    

    engint.eval
    执行js代码,也就是load.js的内容

    return null;
    
    1


  • @GYHHY闲的没事,把Bugin导出的Jar包里的boot.js研究并注释了一下 中说:

    engine 是PVPIN传递的js运行环境,为
    jdk.nashorn.api.scripting.NashornScriptEngine

    原来bugin运行时只是一个補助(滑稽)
    nashorn



  • nashorn是 Java8版本以后的 Javascript解释器


登录后回复