JSEngineNK - 在 Nukkit 中加载 JavaScript!
JSEngineNK 是一款 Nukkit 插件,能够加载 JavaScript 模块!借助 Nashorn 引擎的强大功能,创建系统变得非常简单!
Nukkit 插件功能:
- 允许加载 JavaScript 模块!运行 ES6 版本(部分功能使用 polyfill,尤其是类,请参阅创建方式)。其他 JavaScript 版本部分支持。
- 原插件作者:https://cloudburstmc.org/resources/modloader.108/
如何使用?
- 创建 JavaScript 文件,例如:`mod.js`。
- 将文件放入 `plugins/JSEngineNK/mod.js`。
- 编写代码!
- 启动服务器!代码将立即运行。
- 示例代码可在此处查看:https://github.com/Trollhunters501/JSEngineNK/tree/master/examples
已加载的基本 JavaScript API:
JavaScript:
var server; return getServer();
var plugin; return JSEngineNK Plugin MainClass;
var global; return JSEngineNK Plugin MainClass;
var self; return JSEngineNK Plugin MainClass;
var manager; return FunctionManager Class, 用于创建命令和循环
var script; return 注册脚本和事件的类
var logger; return 控制台日志输入
var console; return 控制台日志输入
var window; return 控制台日志输入
var players; return 所有在线玩家
创建基本命令:
JavaScript:
manager.createCommand("name", "description", "functionUsed", "usage", ["aliase1", "aliase2"], "perm.nk");
function functionUsed(sender, args, label, manageCMD){
if(args.length < 1){ // 检查参数是否存在
sender.sendMessage('使用方式错误!');
return;
}
let name = args[0];
sender.sendMessage("你输入了: " + name); // 向发送者发送消息
// sender.sendMessage(manager.format("你输入了: %s", name)); // 格式化消息
}
创建基本任务(第二个参数为等待的 Minecraft 刻数):
JavaScript:
manager.createTask("tasknormal", 20);
manager.createLoopTask("taskloop", 20); // 如果需要传递参数,可以在时间参数后添加
manager.createAsyncTask("taskAsync"); // 如果需要传递参数,也可以在定义函数名后添加
function tasknormal(currentTick){
print('我是 tasknormal!');
}
function taskloop(currentTick){
print('我是 taskloop');
}
function taskAsync(){
print('我是 taskasync');
}
运行事件:
JavaScript:
script.addEventListener("PlayerJoinEvent", function(event){
let player = event.getPlayer();
player.sendMessage("欢迎来到服务器!");
});
// 完成,启动服务器并测试!
创建配置文件:
JavaScript:
var config = manager.createConfig(manager.getFile("folder", "archive"), 2); // 2 = Config.YAML
config.set("key", "value");
config.save();
注册脚本:
JavaScript:
script.registerScript({
name: "TestScript",
version: "1.0",
description: "测试脚本!",
website: "https://github.com/Trollhunters501/JSEngineNK/",
authors: ["Creadores Program & RedstoneAlmeida"]
});
// 您可以注册脚本,使其出现在 `/scripts` 命令的脚本列表中,或通过 `/version script` 或 `/ver script` 命令查看。
// 必填参数:author 或 authors、name、version 和 description,可选参数:website。
使用 Nukkit 和 Java Vanilla 的包:
JavaScript:
var playertest = Java.type("cn.nukkit.Player");
// 您可以在 Nukkit 官方文档中查看如何使用 Player 文件!(建议使用难以复制的变量,因为其他脚本可能使用相同的变量)
var IOExeptionTest = Java.type("java.io.IOException");
// Java Vanilla
var ContentType = Packages.org.apache.http.entity.ContentType;
// 非 Java Vanilla 或 Nukkit 的包(需要安装这些包)
按名称查看脚本(建议在所有脚本加载完成后使用):
JavaScript:
script.getScriptByName("脚本名称");
隔离或私有函数(变量或函数不会全局化,无法注册事件或任务):
JavaScript:
(function(){
// 代码...
})();
通过 Maven 导入 Java 外部库:
JavaScript:
// 定义脚本的 Maven 依赖
var MAVEN_DEPENDENCIES = ['com.h2database:h2:1.4.192', 'org.apache.commons:commons-dbcp2:2.1.1'];
// 创建类加载器实例
var L = new NnClassLoader({ maven: MAVEN_DEPENDENCIES });
// 查看类加载器解析的实际 jar 列表
for each(var url in L.getUrls()) print(url);
// 类似于 Java.type 导入类
var BasicDataSource = L.type('org.apache.commons.dbcp2.BasicDataSource');
// 像往常一样使用导入的类
var ds = new BasicDataSource();
// ...
通过 URL 导入 JavaScript 外部库:
JavaScript:
// 如何从网页导入 JavaScript 文件:
load("https://example.com/exam.js");
// 完成!
查看所有 manager 函数:
请访问:https://github.com/Trollhunters501/JSEngineNK/blob/master/Manager info/ManagerFunc.md如何创建 JavaScript 类:
JavaScript:
// 您必须使用 Class() 函数创建一个 const 变量,并带有 2 个参数。变量名称将是您的类名!
// 第一个参数始终是 Object,除非您想扩展另一个 JavaScript 类。在这种情况下,只需将 Object 更改为类名(该类应已定义)。
// 第二个参数是类函数!(如果扩展任何类,请不要将函数命名为与扩展类相同的名称(JavaScript 引擎会混淆并崩溃))
const Says = Class(Object, {
say: function(){
console.info('Hello');
}
});
// 创建类的实例:
var Hey = new Says();
// 调用函数:
Hey.say();
// 输出:Hello
// 扩展类:
// 扩展之前的类
const Greeting = Class(Says, {
// 确保函数不重复,此处不能重复 say()
hi: function(){
// 调用扩展类:
this.say();
// 额外代码
console.info('Console!');
}
});
// 像之前一样调用类
var HiCon = new Greeting();
HiCon.hi();
// 输出:Hello
// Console!
// 完成!
扩展 Java 类:
JavaScript:
var ClassExample = Java.type("class.extend.java");
var extendC = Java.extend(ClassExample); // 也适用于使用 Nnclassloader 库导入的类
var myclassextend = new extendC(){
onEnable: function(){
aFunctionOfTheExtendedClass("hello!");
} // 适用于在 JSEngineNK 中使用 @ 而不直接在 Java 中编码并保持类为空的情况!
}
插件中的默认库:
- Fetch: https://raw.githubusercontent.com/C...ain/Creadores Program/Nashorn NK/Fetch API.js
- Normalize Polyfill: https://cdn.jsdelivr.net/npm/unorm@1.6.0/lib/unorm.min.js
- UnderScoreJS: https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.6/underscore-min.js
- Loadash: https://cdn.jsdelivr.net/npm/lodash@4/lodash.min.js
- RequireAPI: https://raw.githubusercontent.com/p...845efae6d13ec5/src/main/javascript/jvm-npm.js
- Base64: https://raw.githubusercontent.com/Trollhunters501/JSEngineNK/master/libs/base64.js
- Adder: https://raw.githubusercontent.com/m...ain/java/java8Group/java8Artifact/js/adder.js
- NnClassLoader: https://cdn.rawgit.com/NashornTools/NnClassLoader/master/NnClassLoader.js
- ES6 from Nashorn: https://raw.githubusercontent.com/aesteve/nashorn-es6/master/src/main/resources/es6-shim.js
- ES6 Sham: https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.35.5/es6-sham.min.js
- Class from Nashorn: https://raw.githubusercontent.com/Trollhunters501/JSEngineNK/master/libs/Clases.js
- Polyfills from Nashorn Extra: https://raw.githubusercontent.com/Trollhunters501/JSEngineNK/master/libs/NewPolifills.js