UNPKG

yoni-mcscripts-lib

Version:

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

95 lines (77 loc) 2.98 kB
// @ts-nocheck import { getIdentifierInfo } from "./Types.js"; import { IEventTrigger } from "./IEventTrigger.js"; import { IEventSignal } from "./IEventSignal.js"; import { Trigger } from "./Trigger.js"; import { EventCallbacks } from "./Event.js"; /** * @deprecated 废弃,不再使用,请使用新的 {@link import("./v2/EventManager"). manager}。另外,如果你使用了此LegacyEvent中的自定义事件,webpack打包或者类似的操作将无法完成。 */ class Signal implements IEventSignal { #trigger: IEventTrigger | Trigger; #callbacks = []; #identifier: string; get identifier(): string { return this.#identifier; } get namespace(): string{ return getIdentifierInfo(this.#identifier).namespace; } get eventName(): string{ return getIdentifierInfo(this.#identifier).name; } constructor(identifier, trigger: IEventTrigger | 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 };