yoni-mcscripts-lib
Version:
为 Minecraft Script API 中的部分接口创建了 wrapper,并提供简单的事件管理器和任务管理器,另附有一些便于代码编写的一些小工具。
74 lines (73 loc) • 2.55 kB
JavaScript
// @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 };