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