UNPKG

yoni-mcscripts-lib

Version:

为 Minecraft Script API 中的部分接口创建了 wrapper,并提供简单的事件管理器和任务管理器,另附有一些便于代码编写的一些小工具。

115 lines (114 loc) 3.42 kB
// @ts-nocheck import { Types, getIdentifierInfo } from "./Types.js"; import { runTask } from "../basis.js"; async function callAsyncFunction(func, ...args) { return func(...args); } /** * @deprecated 废弃,不再使用,请使用新的 {@link import("./v2/EventRegistry").EventRegistry}。另外,如果你使用了此LegacyEvent中的自定义事件,webpack打包或者类似的操作将无法完成。 */ class Trigger { constructor(identifier, signal = null) { this.#identifier = getIdentifierInfo(identifier).id; this.signal = signal; } #identifier; 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 };