UNPKG

yoni-mcscripts-lib

Version:

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

74 lines (73 loc) 2.55 kB
// @ts-nocheck import { getIdentifierInfo } from "./Types.js"; /** * @deprecated 废弃,不再使用,请使用新的 {@link import("./v2/EventManager"). manager}。另外,如果你使用了此LegacyEvent中的自定义事件,webpack打包或者类似的操作将无法完成。 */ class Signal { #trigger; #callbacks = []; #identifier; get identifier() { return this.#identifier; } get namespace() { return getIdentifierInfo(this.#identifier).namespace; } get eventName() { return getIdentifierInfo(this.#identifier).name; } constructor(identifier, trigger) { if (identifier) { this.#identifier = getIdentifierInfo(identifier).id; } this.#trigger = trigger; trigger.getCallbacks = (() => { const f = () => this.#callbacks; return function getCallbacks() { if (this !== trigger) { throw new Error("invalid access"); } return f(); }; })(); } subscribe(callback, ...filters) { if (typeof callback !== "function") throw new Error("not a function in arguments[0]"); const trigger = this.#trigger; if ("onSubscribe" in trigger) // @ts-ignore trigger.onSubscribe(callback, filters); //触发 if (filters.length === 1) this.#callbacks.push({ callback, filters: filters[0] }); else if (filters.length === 0) this.#callbacks.push({ callback }); else this.#callbacks.push({ callback, filters }); if (this.#callbacks.length === 1 && "whenFirstSubscribe" in trigger) { // @ts-ignore trigger.whenFirstSubscribe(); } return callback; } unsubscribe(callback) { if (typeof callback !== "function") //检查参数是否为函数 throw new Error("not a function in arguments[0]"); const trigger = this.#trigger; if ("onUnsubscribe" in trigger) // @ts-ignore trigger.onUnsubscribe(callback); //触发 this.#callbacks = this.#callbacks.filter((e) => { return e.callback !== callback; }); if (this.#callbacks.length === 0 && "whenLastUnsubscribe" in trigger) { // @ts-ignore trigger.whenLastUnsubscribe(); //触发 } return callback; } } export { Signal }; export { Signal as EventSignal };