5
src/main/resources/modules/command.js
Normal file
5
src/main/resources/modules/command.js
Normal file
@ -0,0 +1,5 @@
|
||||
'use strict';
|
||||
/**
|
||||
* Bukkit 命令相关类
|
||||
*/
|
||||
/*global Java, base, module, exports, require, __FILE__*/
|
@ -10,13 +10,13 @@ var Modifier = Java.type("java.lang.reflect.Modifier");
|
||||
var BukkitEvent = Java.type("org.bukkit.event.Event");
|
||||
var EventPriority = Java.type("org.bukkit.event.EventPriority");
|
||||
var EventExecutor = Java.type("org.bukkit.plugin.EventExecutor");
|
||||
var IllegalStateException = Java.type("java.lang.IllegalStateException");
|
||||
|
||||
var mapEvent = [];
|
||||
|
||||
var plugin = require('plugin').$;
|
||||
|
||||
/**
|
||||
* 映射事件名称 org.bukkit.event.player.PlayerLoginEvent => playerloginevent
|
||||
* 扫描包 org.bukkit.event 下的所有事件
|
||||
* 映射简写名称 org.bukkit.event.player.PlayerLoginEvent => playerloginevent
|
||||
*/
|
||||
function mapEventName() {
|
||||
var eventPackageDir = "org/bukkit/event";
|
||||
@ -32,10 +32,12 @@ function mapEventName() {
|
||||
while (entries.hasMoreElements()) {
|
||||
var entry = entries.nextElement();
|
||||
var name = entry.name;
|
||||
// 以 org/bukkit/event 开头 并且以 .class 结尾
|
||||
if (name.startsWith(eventPackageDir) && name.endsWith(".class")) {
|
||||
var i = name.replaceAll('/', '.');
|
||||
try {
|
||||
var clz = base.getClass(i.substring(0, i.length - 6));
|
||||
// 继承于 org.bukkit.event.Event 访问符为Public
|
||||
if (isVaildEvent(clz)) {
|
||||
// noinspection JSUnresolvedVariable
|
||||
var simpleName = clz.simpleName.toLowerCase();
|
||||
@ -51,9 +53,18 @@ function mapEventName() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为一个有效的事件类
|
||||
* @param clz
|
||||
* @returns {*|boolean}
|
||||
*/
|
||||
function isVaildEvent(clz) {
|
||||
// noinspection JSUnresolvedVariable
|
||||
return BukkitEvent.class.isAssignableFrom(clz) && Modifier.isPublic(clz.getModifiers()) && !Modifier.isAbstract(clz.getModifiers());
|
||||
// noinspection JSUnresolvedVariable 继承于 org.bukkit.event.Event
|
||||
return BukkitEvent.class.isAssignableFrom(clz) &&
|
||||
// 访问符为Public
|
||||
Modifier.isPublic(clz.getModifiers()) &&
|
||||
// 不是抽象类
|
||||
!Modifier.isAbstract(clz.getModifiers());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -70,8 +81,8 @@ function listen(event, exec, priority, ignoreCancel) {
|
||||
eventCls = base.getClass(eventCls);
|
||||
} catch (ex) {
|
||||
log.w("事件 %s 未找到!");
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (priority === undefined) {
|
||||
priority = 'NORMAL'
|
||||
@ -79,6 +90,7 @@ function listen(event, exec, priority, ignoreCancel) {
|
||||
if (ignoreCancel === undefined) {
|
||||
ignoreCancel = false;
|
||||
}
|
||||
var listener = new Listener({});
|
||||
// noinspection JSUnusedGlobalSymbols
|
||||
/**
|
||||
* @param event Event type to register
|
||||
@ -90,30 +102,41 @@ function listen(event, exec, priority, ignoreCancel) {
|
||||
*/
|
||||
Bukkit.getPluginManager().registerEvent(
|
||||
eventCls,
|
||||
new Listener({}),
|
||||
listener,
|
||||
EventPriority[priority],
|
||||
new Java.extend(EventExecutor, {
|
||||
new EventExecutor({
|
||||
execute: function (listener, event) {
|
||||
exec(event);
|
||||
}
|
||||
}),
|
||||
plugin,
|
||||
require('plugin').$,
|
||||
ignoreCancel);
|
||||
// noinspection JSUnresolvedVariable
|
||||
log.d('注册事件 %s 方法 %s', eventCls.simpleName, exec.name === '' ? '匿名方法' : exec.name);
|
||||
return {
|
||||
event: eventCls,
|
||||
listener: listener
|
||||
}
|
||||
}
|
||||
|
||||
// 映射事件名称
|
||||
mapEventName();
|
||||
|
||||
exports.on = listen;
|
||||
/**
|
||||
* 取消事件监听
|
||||
* @param listener 监听结果
|
||||
*/
|
||||
exports.off = function (listener) {
|
||||
function unlisten(listener) {
|
||||
if (!listener.event || !listener.listener) {
|
||||
throw new IllegalStateException("非法的监听器对象 无法取消事件!");
|
||||
}
|
||||
listener.event.getMethod("getHandlerList").invoke(null).unregister(listener.listener);
|
||||
// noinspection JSUnresolvedVariable
|
||||
listener.event.handlerList.unregister(listener.listener);
|
||||
log.d('注销事件 %s', eventCls.simpleName);
|
||||
}
|
||||
|
||||
// 映射事件名称
|
||||
mapEventName();
|
||||
log.i('Bukkit 事件映射完毕 共计 %s 个事件!', mapEvent.length);
|
||||
|
||||
module.exports = {
|
||||
on: listen,
|
||||
off: unlisten
|
||||
};
|
@ -15,7 +15,7 @@ if (bukkit.plugin.load("PlaceholderAPI")) {
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.$ = function (player, str) {
|
||||
exports.$ = function () {
|
||||
if (arguments.length > 1) {
|
||||
return PlaceholderAPI.setPlaceholders(arguments[0], arguments[1]);
|
||||
} else {
|
||||
|
@ -3,7 +3,7 @@
|
||||
* MiaoScript脚本插件加载类
|
||||
*/
|
||||
/*global Java, base, module, exports, require, __FILE__*/
|
||||
var zip = require("core/zip");
|
||||
// var zip = require("core/zip");
|
||||
var fs = require('core/fs');
|
||||
|
||||
/**
|
||||
@ -56,37 +56,74 @@ function loadJsPlugin(files) {
|
||||
return file.name.endsWith(".js")
|
||||
}).forEach(function (file) {
|
||||
var p = require(file);
|
||||
log.d("插件编译结果: %s", JSON.stringify(p));
|
||||
if (!p.description || !p.description.name) {
|
||||
log.w("文件 %s 不存在 description 描述信息 无法加载插件!");
|
||||
log.w("文件 %s 不存在 description 描述信息 无法加载插件!", file);
|
||||
} else {
|
||||
exports.plugins.push(p);
|
||||
plugins.push(p);
|
||||
plugins[p.description.name] = p;
|
||||
log.i('插件 %s 版本 %s 加载成功!', p.description.name, p.description.version);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function runAndCatch(name, exec) {
|
||||
if (exec) {
|
||||
try {
|
||||
exec();
|
||||
} catch (ex) {
|
||||
log.w('插件 %s 执行 %s 发生错误: %s', name, exec.name, ex.message);
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkAndGet(name) {
|
||||
if (!exports.plugins[name]) {
|
||||
throw new Error("插件 " + name + "不存在!");
|
||||
}
|
||||
return exports.plugins[name];
|
||||
}
|
||||
|
||||
var plugins = [];
|
||||
|
||||
exports.$ = undefined;
|
||||
exports.plugins = [];
|
||||
exports.plugins = plugins;
|
||||
exports.init = function (plugin, path) {
|
||||
if (plugin !== null) {
|
||||
// 如果过plugin不等于null 则代表是正式环境
|
||||
exports.$ = plugin;
|
||||
log.i("Init MiaoScript Engine Version: %s", plugin.description.version);
|
||||
require('./event');
|
||||
log.i("初始化 MiaoScript 插件系统 版本: %s", plugin.description.version);
|
||||
}
|
||||
loadPlugins(path);
|
||||
};
|
||||
exports.load = function () {
|
||||
exports.plugins.forEach(function (p) {
|
||||
p.load();
|
||||
})
|
||||
if (arguments.length === 0) {
|
||||
plugins.forEach(function (p) {
|
||||
runAndCatch(p.description.name, p.load);
|
||||
})
|
||||
} else {
|
||||
var p = checkAndGet(arguments[0]);
|
||||
runAndCatch(p.description.name, p.load);
|
||||
}
|
||||
};
|
||||
exports.enable = function () {
|
||||
exports.plugins.forEach(function (p) {
|
||||
p.enable();
|
||||
})
|
||||
if (arguments.length === 0) {
|
||||
plugins.forEach(function (p) {
|
||||
runAndCatch(p.description.name, p.enable);
|
||||
})
|
||||
} else {
|
||||
var p = checkAndGet(arguments[0]);
|
||||
runAndCatch(p.description.name, p.enable);
|
||||
}
|
||||
};
|
||||
exports.disable = function () {
|
||||
exports.plugins.forEach(function (p) {
|
||||
p.disable();
|
||||
})
|
||||
if (arguments.length === 0) {
|
||||
plugins.forEach(function (p) {
|
||||
runAndCatch(p.description.name, p.disable);
|
||||
})
|
||||
} else {
|
||||
var p = checkAndGet(arguments[0]);
|
||||
runAndCatch(p.description.name, p.disable);
|
||||
}
|
||||
};
|
71
src/main/resources/modules/task.js
Normal file
71
src/main/resources/modules/task.js
Normal file
@ -0,0 +1,71 @@
|
||||
'use strict';
|
||||
/*global Java, base, module, exports, require, __FILE__*/
|
||||
/**
|
||||
* 任务计划
|
||||
* Created by 蒋天蓓 on 2017/2/9 0009.
|
||||
*/
|
||||
var plugin = require('modules/plugin').$;
|
||||
var BukkitRunnable = Java.type("org.bukkit.scheduler.BukkitRunnable");
|
||||
/**
|
||||
* 创建任务对象
|
||||
* @param func 任务
|
||||
*/
|
||||
exports.create = function (func) {
|
||||
return new BukkitRunnable(func);
|
||||
};
|
||||
/**
|
||||
* 运行任务
|
||||
* @param func 任务
|
||||
*/
|
||||
exports.run = function (func) {
|
||||
return exports.create(func).runTask(plugin);
|
||||
};
|
||||
/**
|
||||
* 延时运行任务
|
||||
* @param func 任务
|
||||
* @param time 延时时间
|
||||
*/
|
||||
exports.later = function (func, time) {
|
||||
return exports.create(func).runTaskLater(plugin, time);
|
||||
};
|
||||
/**
|
||||
* 运行循环任务
|
||||
* @constructor (任务,执行间隔).
|
||||
* @constructor (任务,首次延时,执行间隔)
|
||||
*/
|
||||
exports.timer = function () {
|
||||
switch (arguments.length) {
|
||||
case 2:
|
||||
return exports.create(arguments[0]).runTaskTimer(plugin, 0, arguments[1]);
|
||||
case 3:
|
||||
return exports.create(arguments[0]).runTaskTimer(plugin, arguments[1], arguments[2]);
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 运行异步任务
|
||||
* @param func function 任务
|
||||
*/
|
||||
exports.async = function (func) {
|
||||
return exports.create(func).runTaskAsynchronously(plugin);
|
||||
};
|
||||
/**
|
||||
* 延时运行异步任务
|
||||
* @param func 任务
|
||||
* @param time 延时时间
|
||||
*/
|
||||
exports.laterAsync = function (func, time) {
|
||||
return exports.create(func).runTaskLaterAsynchronously(plugin, time);
|
||||
};
|
||||
/**
|
||||
* 运行异步循环任务
|
||||
* @constructor (任务,执行间隔).
|
||||
* @constructor (任务,首次延时,执行间隔)
|
||||
*/
|
||||
exports.timerAsync = function () {
|
||||
switch (arguments.length) {
|
||||
case 2:
|
||||
return exports.create(arguments[0]).runTaskTimerAsynchronously(plugin, 0, arguments[1]);
|
||||
case 3:
|
||||
return exports.create(arguments[0]).runTaskTimerAsynchronously(plugin, arguments[1], arguments[2]);
|
||||
}
|
||||
};
|
Reference in New Issue
Block a user