yoni-mcscripts-lib
Version:
为 Minecraft Script API 中的部分接口创建了 wrapper,并提供简单的事件管理器和任务管理器,另附有一些便于代码编写的一些小工具。
131 lines (115 loc) • 3.58 kB
text/typescript
// @ts-nocheck
import { Types, getIdentifierInfo } from "./Types.js";
import { Event } from "./Event.js";
import { runTask } from "../basis.js";
import { IEventTrigger } from "./IEventTrigger.js";
async function callAsyncFunction(func, ...args){
return func(...args);
}
/**
* @deprecated 废弃,不再使用,请使用新的 {@link import("./v2/EventRegistry").EventRegistry}。另外,如果你使用了此LegacyEvent中的自定义事件,webpack打包或者类似的操作将无法完成。
*/
class Trigger {
constructor(identifier: string, signal = null){
this.#identifier = getIdentifierInfo(identifier).id;
this.signal = signal;
}
#identifier: string;
get identifier(){
return this.#identifier;
}
get namespace(){
return getIdentifierInfo(this.#identifier).namespace;
}
get eventName(){
return getIdentifierInfo(this.#identifier).name;
}
signal;
getCallbacks;
/**
* 同步的事件回调
* @param {Function[]} callbacks
* @param {*} eventClass
* @param {any[]} eventValues
*/
firebug(callbacks, eventClass, eventValues){
let proxy = Proxy.revocable(new eventClass(...eventValues), {
get(t, k){
let v = t[k];
if ("function" === typeof v){
return function proxyCallFunction(...args){ return t[k](...args); };
} else {
return v;
}
}
});
let event = proxy.proxy;
runTask(proxy.revoke);
callbacks.forEach(f => f(event) );
proxy.revoke();
}
/**
* 异步的事件回调
* @param {AsyncFunction[]} callbacks
* @param {*} eventClass
* @param {any[]} eventValues
*/
async firebugAsync(callbacks, eventClass, eventValues){
return Promise.allSettled(
callbacks.map(async (f)=>{
let proxy = Proxy.revocable(new eventClass(...eventValues), {});
let event = proxy.proxy;
return callAsyncFunction(f, event)
.finally(proxy.revoke);
})
);
}
/**
* @param {any[]} eventValues
* @param {any[]|any} filters
* @return {boolean}
*/
filterResolver(eventValues, filters){
return true;
};
getCallbacksByFilter(...args){
return this.getCallbacks().filter(e=>{
if (e.filters === undefined)
return true;
else if (this.filterResolver(args, e.filters))
return true;
else
return false;
}).map(e => e.callback );
}
fireEvent(...args){
let callbacks = this.getCallbacksByFilter(...args);
this.firebug(callbacks, this.eventClass, args);
};
async fireEventAsync(...args){
let callbacks = this.getCallbacksByFilter(...args);
return this.firebugAsync(callbacks, this.eventClass, args);
}
get triggerEvent(){
return this.fireEvent;
}
set triggerEvent(v){
this.fireEvent = v;
}
get triggerEventAsync(){
return this.fireEventAsync;
}
set triggerEventAsync(v){
this.fireEventAsync = v;
}
registerEvent(){
Types.register(this.identifier, this.signal);
return this;
}
unregisterEvent(){
Types.unregister(this.identifier);
return this;
}
}
export { Trigger };
export { Trigger as EventTrigger };