From 63d4d37ff331baae977fc0dd6db073f1751b7a94 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Wed, 9 Sep 2026 13:03:42 +0800 Subject: [PATCH] fix(event): finalize event reference changes --- packages-user/data-base/src/map/mapLayer.ts | 4 +- packages-user/data-base/src/map/types.ts | 5 ++ .../data-system/src/event/executor.ts | 50 +++++++++++-------- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/packages-user/data-base/src/map/mapLayer.ts b/packages-user/data-base/src/map/mapLayer.ts index ed34b7d..129c1ce 100644 --- a/packages-user/data-base/src/map/mapLayer.ts +++ b/packages-user/data-base/src/map/mapLayer.ts @@ -54,8 +54,6 @@ export class MapLayer /** 图层参考基准,用于存档压缩对比 */ private refArray: Uint32Array | null = null; - //#region 点事件操作 - /** 点事件视图,key = y * width + x */ private readonly pointEvents: Map = new Map(); @@ -125,6 +123,8 @@ export class MapLayer this.posTileMap.delete(tile); } + //#region 点事件操作 + /** * 将动态图块的事件同步回当前静态格点 * @param tile 动态图块 diff --git a/packages-user/data-base/src/map/types.ts b/packages-user/data-base/src/map/types.ts index 1bb7813..f659dd9 100644 --- a/packages-user/data-base/src/map/types.ts +++ b/packages-user/data-base/src/map/types.ts @@ -94,6 +94,11 @@ export interface IReadonlyEventView { */ get(): ReadonlyMap; + /** + * 获取当前事件的参考基准 + */ + ref(): ReadonlyMap; + /** * 当前事件是否与参考基准不同 */ diff --git a/packages-user/data-system/src/event/executor.ts b/packages-user/data-system/src/event/executor.ts index 49301bf..090f02c 100644 --- a/packages-user/data-system/src/event/executor.ts +++ b/packages-user/data-system/src/event/executor.ts @@ -25,10 +25,36 @@ export class EventExecutor implements IGameEventExecutor { this.reduce = reduce; } + /** + * 折叠事件的原始返回值 + * @param mode 折叠模式 + * @param results 原始返回值 + */ + private reduceResults(mode: EventReduceMode, results: any[]): any { + if (mode === EventReduceMode.OrReduce) { + return results.reduce((prev, curr) => { + if (typeof curr !== 'boolean') { + logger.warn(172, String(curr)); + } + return prev || curr; + }, false); + } else if (mode === EventReduceMode.AndReduce) { + return results.reduce((prev, curr) => { + if (typeof curr !== 'boolean') { + logger.warn(172, String(curr)); + } + return prev && curr; + }, true); + } else { + return results; + } + } + async execute( events: IGameEventInvocation[], param: IBlockEventParam ): Promise { + // 事件执行 const results: any[] = []; for (const invocation of events) { const id = invocation.id; @@ -47,13 +73,9 @@ export class EventExecutor implements IGameEventExecutor { if (event.trigger !== invocation.env.trigger) continue; const result = await event.execute(param, invocation.env); - if ( - this.reduce !== EventReduceMode.NoReduce && - typeof result !== 'boolean' - ) { - logger.warn(172, String(result)); - } results.push(result); + + // 执行模式 if (this.mode === EventExecuteMode.CutIfFalsy && !result) { break; } else if (this.mode === EventExecuteMode.CutIfTruthy && result) { @@ -61,20 +83,6 @@ export class EventExecutor implements IGameEventExecutor { } } - let reduced: any = results; - if (this.reduce === EventReduceMode.OrReduce) { - reduced = false; - for (const result of results) { - reduced ||= result; - if (reduced) break; - } - } else if (this.reduce === EventReduceMode.AndReduce) { - reduced = true; - for (const result of results) { - reduced &&= result; - if (!reduced) break; - } - } - return reduced; + return this.reduceResults(this.reduce, results); } }