From 670b7e14a885336e222d410b57090e3fa2446234 Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Sun, 21 Dec 2025 21:30:37 +0800 Subject: [PATCH] feat(c4): improve C4 timer and add type definitions --- src/client_scripts/Test.js | 18 +++++ src/server_scripts/C4.js | 1 + src/startup_scripts/C4.js | 138 +++++++++++++++++++++++-------------- types/C4.d.ts | 16 +++++ types/EventBus.d.ts | 17 ----- types/global.d.ts | 8 +++ 6 files changed, 130 insertions(+), 68 deletions(-) create mode 100644 src/client_scripts/Test.js create mode 100644 src/server_scripts/C4.js create mode 100644 types/C4.d.ts create mode 100644 types/global.d.ts diff --git a/src/client_scripts/Test.js b/src/client_scripts/Test.js new file mode 100644 index 0000000..3136adf --- /dev/null +++ b/src/client_scripts/Test.js @@ -0,0 +1,18 @@ +let isFirstTime = true; +ClientEvents.tick((event) => { + if (!isFirstTime) return; + + const player = event.player; + const lookAngle = player.lookAngle; + console.log(`Player Pos: ${player.x}, ${player.y}, ${player.z}`); + // console.log( + // `LookAngle(property): ${lookAngle.x}, ${lookAngle.y}, ${lookAngle.z}`, + // ); + console.log( + `LookAngle(method): ${lookAngle.x()}, ${lookAngle.y()}, ${lookAngle.z()}`, + ); + console.log( + `LookAngle(get method): ${lookAngle.get("x")}, ${lookAngle.get("y")}, ${lookAngle.get("z")}`, + ); + isFirstTime = false; +}); diff --git a/src/server_scripts/C4.js b/src/server_scripts/C4.js new file mode 100644 index 0000000..be85205 --- /dev/null +++ b/src/server_scripts/C4.js @@ -0,0 +1 @@ +BlockEvents.broken((event) => {}); diff --git a/src/startup_scripts/C4.js b/src/startup_scripts/C4.js index 5792a1e..265cdd9 100644 --- a/src/startup_scripts/C4.js +++ b/src/startup_scripts/C4.js @@ -1,4 +1,3 @@ -/** @type {JClass_<$TickEvent$PlayerTickEvent_>} */ const $TickEvent$PlayerTickEvent = Java.loadClass( "net.minecraftforge.event.TickEvent$PlayerTickEvent", ); @@ -7,7 +6,7 @@ const $ServerStartedEvent = Java.loadClass( "net.minecraftforge.event.server.ServerStartedEvent", ); -const C4_EXPLOSION_TIME = 3 * 20; // 3 seconds in ticks +const C4_EXPLOSION_TIME = 7 * 20; // 7 seconds in ticks const C4_EXPLOSION_POWER = 128; // Explosion power (TNT is 4) const C4_USE_TIME = 5 * 20; // 5 seconds in ticks @@ -29,6 +28,12 @@ let operationKeyMapping; */ const lastPlayerInfoMap = {}; +/** + * @type {{[key:string]: boolean}} + */ +const toExplosionC4Map = {}; +global["toExplosionC4Map"] = toExplosionC4Map; + /** * Helper function to compare floating point numbers with tolerance * @param {number} a @@ -253,26 +258,35 @@ ClientEvents.init(() => { }); // Send data to the server when the key is pressed -ForgeEvents.onEvent($TickEvent$PlayerTickEvent, (event) => { - if (operationKeyMapping === undefined) { - console.warn("Not in client platform"); - return; - } - - while (operationKeyMapping.consumeClick()) { - const player = event.player; - const level = player.level; - if (!shouldStartUseC4(player, level)) continue; - - /** @type {EventBus} */ - const eventBus = /** @type {any} */ (global["eventBus"]); - if (eventBus !== null) { - eventBus.emit("C4UseStarted", { player: player }); - } else { - console.warn("EventBus is not available"); +ForgeEvents.onEvent( + // @ts-ignore + $TickEvent$PlayerTickEvent, + /** + * + * @param {Internal.TickEvent$PlayerTickEvent} event + * @returns + */ + (event) => { + if (operationKeyMapping === undefined) { + console.warn("Not in client platform"); + return event; } - } -}); + + while (operationKeyMapping.consumeClick()) { + const player = event.player; + const level = player.level; + if (!shouldStartUseC4(player, level)) continue; + + /** @type {EventBus} */ + const eventBus = /** @type {any} */ (global["eventBus"]); + if (eventBus !== null) { + eventBus.emit("C4UseStarted", { player: player }); + } else { + console.warn("EventBus is not available"); + } + } + }, +); // ==================== Server Side Logic ==================== @@ -357,27 +371,40 @@ function handleC4Activated(event) { const newBlock = level.getBlock(c4BlockPos.x, c4BlockPos.y, c4BlockPos.z); newBlock.set(/** @type {any} */ ("kubejs:c4")); + // Add record + const newBlockPosString = newBlock.pos.toShortString(); + toExplosionC4Map[newBlockPosString] = true; + /** * TODO: It should use reschedule to replace several schedules * But reschedule not work at current time. * Relative Issue: https://github.com/KubeJS-Mods/KubeJS/issues/763 */ - for (let i = 0; i < explosionTime; i += 20) { - server.scheduleInTicks(i, (scheduledEvent) => { - const remainingSeconds = - (explosionTime - scheduledEvent.timer) / 20; - server.players.forEach((p) => { - p.tell( - /** @type {any} */ ( - Component.literal(`C4还剩 ${remainingSeconds} 秒爆炸`) - ), - ); - }); + let remainingSeconds = explosionTime / 20; + server.scheduleRepeatingInTicks(20, (scheduledEvent) => { + // Assert C4 exsiting + if (toExplosionC4Map[newBlockPosString] === null) return; + + remainingSeconds -= 1; + if (remainingSeconds <= 0) { + scheduledEvent.clear(); + return scheduledEvent; + } + + server.players.forEach((p) => { + p.tell( + /** @type {any} */ ( + Component.literal(`C4还剩 ${remainingSeconds} 秒爆炸`) + ), + ); }); - } + }); // Create explosion after countdown server.scheduleInTicks(explosionTime, (_) => { + // Assert C4 exsiting + if (toExplosionC4Map[newBlockPosString] === null) return; + level.explode( /** @type {any} */ (null), c4BlockPos.x + 0.5, @@ -389,26 +416,35 @@ function handleC4Activated(event) { }); } -ForgeEvents.onEvent($ServerStartedEvent, (event) => { +ForgeEvents.onEvent( + //@ts-ignore + $ServerStartedEvent, /** - * WARNING: Must Do!!! - * Because Kubejs scheduler is not stable - * And need to fire once at first time - * Relative Issue: https://github.com/KubeJS-Mods/KubeJS/issues/763 + * + * @param {Internal.ServerStartedEvent} event + * @returns */ - event.server.scheduleInTicks(1, (_) => { - console.log("Init Scheduler"); - }); + (event) => { + /** + * WARNING: Must Do!!! + * Because Kubejs scheduler is not stable + * And need to fire once at first time + * Relative Issue: https://github.com/KubeJS-Mods/KubeJS/issues/763 + */ + event.server.scheduleInTicks(1, (_) => { + console.log("Init Scheduler"); + }); - /** @type {EventBus} */ - const eventBus = /** @type {any} */ (global["eventBus"]); + /** @type {EventBus} */ + const eventBus = /** @type {any} */ (global["eventBus"]); - if (eventBus === null) { - console.error("C4 Handler: eventBus is not available"); - return; - } + if (eventBus === null) { + console.error("C4 Handler: eventBus is not available"); + return event; + } - eventBus.register("C4Activated", handleC4Activated); - eventBus.register("C4UseStarted", handleC4UseStarted); - console.log("C4 Handler: Registered C4Activated event handler"); -}); + eventBus.register("C4Activated", handleC4Activated); + eventBus.register("C4UseStarted", handleC4UseStarted); + console.log("C4 Handler: Registered C4Activated event handler"); + }, +); diff --git a/types/C4.d.ts b/types/C4.d.ts new file mode 100644 index 0000000..4a98550 --- /dev/null +++ b/types/C4.d.ts @@ -0,0 +1,16 @@ +/** + * Event data for C4 use started events. + */ +interface C4UseStartedEvent { + player: Internal.Player; +} + +/** + * Event data for C4 activation events. + */ +interface C4ActivatedEvent { + level: Internal.Level; + player: Internal.Player; + explosionTime: number; + explosionPower: number; +} diff --git a/types/EventBus.d.ts b/types/EventBus.d.ts index 87cb396..afe82d5 100644 --- a/types/EventBus.d.ts +++ b/types/EventBus.d.ts @@ -1,20 +1,3 @@ -/** - * Event data for C4 use started events. - */ -interface C4UseStartedEvent { - player: Internal.Player; -} - -/** - * Event data for C4 activation events. - */ -interface C4ActivatedEvent { - level: Internal.Level; - player: Internal.Player; - explosionTime: number; - explosionPower: number; -} - /** * Mapping of event names to their corresponding event types. */ diff --git a/types/global.d.ts b/types/global.d.ts new file mode 100644 index 0000000..cc1388a --- /dev/null +++ b/types/global.d.ts @@ -0,0 +1,8 @@ +export {}; // Mark the file as a module, do not remove unless there are other import/exports! +// Override the global type +declare global { + export type ProbeJS$$ResolvedGlobal = { + eventBus: EventBus; + toExplosionC4Map: { [key: string]: boolean }; + }; +}