From f7d8b7b7b004065a7b788b275211909f36f90425 Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Tue, 16 Dec 2025 20:16:56 +0800 Subject: [PATCH] refector(EventBus): splite EventBus type definition and its implemention --- src/startup_scripts/EventBus.js | 43 +++++++++ src/startup_scripts/event_register.js | 124 -------------------------- types/EventBus.d.ts | 65 ++++++++++++++ 3 files changed, 108 insertions(+), 124 deletions(-) create mode 100644 src/startup_scripts/EventBus.js delete mode 100644 src/startup_scripts/event_register.js create mode 100644 types/EventBus.d.ts diff --git a/src/startup_scripts/EventBus.js b/src/startup_scripts/EventBus.js new file mode 100644 index 0000000..d8f6ac9 --- /dev/null +++ b/src/startup_scripts/EventBus.js @@ -0,0 +1,43 @@ +/** + * Create a simple event bus for handling custom events in KubeJS environment. + * @returns {EventBus} + */ +function createEventBus() { + /** + * @type {EventBus} + */ + const bus = { + eventMap: {}, + + register: function (eventName, callback) { + this.eventMap[eventName] = callback; + }, + + emit: function (eventName, event) { + const callback = this.eventMap[eventName]; + if (callback) { + return callback(event); + } + }, + }; + + return bus; +} + +global["eventBus"] = createEventBus(); + +// ==================== Forge Event Listeners ==================== + +ForgeEvents.onEvent( + "net.minecraftforge.event.entity.living.LivingEntityUseItemEvent$Finish", + (event) => { + eventBus.emit("LivingEntityUseItemEvent$Finish", event); + }, +); + +ForgeEvents.onEvent( + "net.minecraftforge.event.entity.player.ItemFishedEvent", + (event) => { + eventBus.emit("PlayerItemFishedEvent", event); + }, +); diff --git a/src/startup_scripts/event_register.js b/src/startup_scripts/event_register.js deleted file mode 100644 index 1d109db..0000000 --- a/src/startup_scripts/event_register.js +++ /dev/null @@ -1,124 +0,0 @@ -/** - * @typedef {{ - * level: Internal.Level, - * blockPos: {x: number, y: number, z: number}, - * player: Internal.Player, - * explosionTime: number, - * explosionPower: number - * }} C4ActivatedEvent - */ - -/** - * @typedef {( - * "PlayerItemFishedEvent" | - * "LivingEntityUseItemEvent$Finish" | - * "C4Activated" - * )} EventName - */ - -/** - * @typedef {( - * ((event: Internal.ItemFishedEvent) => any) | - * ((event: Internal.LivingEntityUseItemEvent$Finish) => any) | - * ((event: C4ActivatedEvent) => any) - * )} EventCallback - */ - -/** - * A simple event bus for handling custom events in KubeJS environment. - * @namespace - */ -const eventBus = { - /** - * Map storing event names and their corresponding callback functions. - * @type {{[key: string]: Function}} - */ - eventMap: {}, - - /** - * Registers a callback function for a specific event. - * @overload - * @param {"PlayerItemFishedEvent"} eventName - The name of the event to listen for. - * @param {(event: Internal.ItemFishedEvent) => any} callback - The callback function. - * @returns {void} - */ - /** - * Registers a callback function for a specific event. - * @overload - * @param {"LivingEntityUseItemEvent$Finish"} eventName - The name of the event to listen for. - * @param {(event: Internal.LivingEntityUseItemEvent$Finish) => any} callback - The callback function. - * @returns {void} - */ - /** - * Registers a callback function for a specific event. - * @overload - * @param {"C4Activated"} eventName - The name of the event to listen for. - * @param {(event: C4ActivatedEvent) => any} callback - The callback function. - * @returns {void} - */ - /** - * Registers a callback function for a specific event. - * @param {EventName} eventName - The name of the event to listen for. - * @param {EventCallback} callback - The callback function to execute when the event is emitted. - * @returns {void} - */ - register: function (eventName, callback) { - this.eventMap[eventName] = callback; - }, - - /** - * Emits an event, calling the registered callback function if it exists. - * @overload - * @param {"PlayerItemFishedEvent"} eventName - The name of the event to emit. - * @param {Internal.ItemFishedEvent} event - The event data. - * @returns {any} - */ - /** - * Emits an event, calling the registered callback function if it exists. - * @overload - * @param {"LivingEntityUseItemEvent$Finish"} eventName - The name of the event to emit. - * @param {Internal.LivingEntityUseItemEvent$Finish} event - The event data. - * @returns {any} - */ - /** - * Emits an event, calling the registered callback function if it exists. - * @overload - * @param {"C4Activated"} eventName - The name of the event to emit. - * @param {C4ActivatedEvent} event - The event data. - * @returns {any} - */ - /** - * Emits an event, calling the registered callback function if it exists. - * @param {string} eventName - The name of the event to emit. - * @param {*} event - The event data to pass to the callback function. - * @returns {*} The return value of the callback function, or undefined if no callback is registered. - */ - emit: function (eventName, event) { - const callback = this.eventMap[eventName]; - if (callback) { - return callback(event); - } - }, -}; - -/** - * @typedef {typeof eventBus} EventBus - */ - -global["eventBus"] = eventBus; - -// ==================== Forge Event Listeners ==================== - -ForgeEvents.onEvent( - "net.minecraftforge.event.entity.living.LivingEntityUseItemEvent$Finish", - (event) => { - eventBus.emit("LivingEntityUseItemEvent$Finish", event); - }, -); - -ForgeEvents.onEvent( - "net.minecraftforge.event.entity.player.ItemFishedEvent", - (event) => { - eventBus.emit("PlayerItemFishedEvent", event); - }, -); diff --git a/types/EventBus.d.ts b/types/EventBus.d.ts new file mode 100644 index 0000000..b1b7af9 --- /dev/null +++ b/types/EventBus.d.ts @@ -0,0 +1,65 @@ +/** + * Event data for C4 use started events. + */ +interface C4UseStartedEvent { + player: Internal.Player; +} + +/** + * Event data for C4 activation events. + */ +interface C4ActivatedEvent { + level: Internal.Level; + blockPos: { x: number; y: number; z: number }; + player: Internal.Player; + explosionTime: number; + explosionPower: number; +} + +/** + * Mapping of event names to their corresponding event types. + */ +interface EventMap { + PlayerItemFishedEvent: Internal.ItemFishedEvent; + LivingEntityUseItemEvent$Finish: Internal.LivingEntityUseItemEvent$Finish; + C4Activated: C4ActivatedEvent; + C4UseStarted: C4UseStartedEvent; +} + +/** + * Union type of all valid event names. + */ +type EventName = keyof EventMap; + +/** + * Callback function type for a specific event. + */ +type EventCallback = (event: EventMap[T]) => any; + +/** + * A simple event bus for handling custom events in KubeJS environment. + */ +interface EventBus { + /** + * Map storing event names and their corresponding callback functions. + */ + eventMap: { [key: string]: Function }; + + /** + * Registers a callback function for a specific event. + * @param eventName - The name of the event to listen for. + * @param callback - The callback function to execute when the event is emitted. + */ + register( + eventName: T, + callback: EventCallback, + ): void; + + /** + * Emits an event, calling the registered callback function if it exists. + * @param eventName - The name of the event to emit. + * @param event - The event data to pass to the callback function. + * @returns The return value of the callback function, or undefined if no callback is registered. + */ + emit(eventName: T, event: EventMap[T]): any; +}