package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // 环境 NPC 的剧情 / 刺激事件收尾(2026-10-02 自 7k-v0.6 捐赠端 // GameRouter.Plot.cs 移植,三个全是 Notify)。 // ★ 它不驱动任务剧情,只维护一个账本 // WorldEntryState.StaticNpcPreparedPlotEvents[agentEntityId] // (= 这个环境 NPC 当前挂着哪条剧情事件,0 表示没有)。 // 这条账本主线早就有了(WorldEntryState.cs:27,注释里就写着 // "GameRouter.Plot uses it",但主线一直没有 Plot 文件 ⇒ 从来没人真正消费它)。 // 铺市民 / DonorNpc / FunctionalNpc / RosterNpc 在生成时都会 [id] = 0 播种, // 骰子对手离场时 Remove(id)。 // ★ 三条的语义: // // AskPreparePlotEvent(67966346):客户端说「这个 NPC 准备演 event X」⇒ 记账。 // AskEndPreparePlotEvent(67025961):准备结束 ⇒ 清账。 // AskTriggerPlotEvent(67895788):演完了,进入服务端反应阶段。 // 我们的环境 NPC 没有剧情后续,所以显式把它关掉 —— 发 // SyncPlotCurrentEvent(AgentEntityId, EventId=0),让客户端 // SelectStimOnline 不再拿「已经演完的那条事件」的优先级下限去压新的刺激。 // 只有账本里 pending 的那条对得上才发(TryCompleteStaticNpcPlot)。 // // ⛑ 游戏里的可见效果:环境 NPC 演完一次反应(被撞、被喊、盘查反应……)之后 // 能回到待机、能接受下一次刺激,而不是卡在那条已完成的反应上不理人。 // ⛑ 坐标必须是有限数(HasFinitePosition):捐赠端用这个挡掉 // 客户端偶尔发出来的 NaN / Infinity,避免日志和下游逻辑被脏数据带偏。 // ⛑ 回滚:把三个 MethodId.* 从 GameRouter.cs 的 // Enabled4229938MethodIds 里删掉即可 —— Notify 不回包, // 不注册只是回到 DefaultUnknownNotify4229938(接受 + 打日志),不会卡客户端。 // func GameRouter_Plot_AskPreparePlotEvent(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Plot_AskPreparePlotEvent var zero any; return zero } func GameRouter_Plot_AskEndPreparePlotEvent(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Plot_AskEndPreparePlotEvent var zero any; return zero } func GameRouter_Plot_AskTriggerPlotEvent(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Plot_AskTriggerPlotEvent var zero any; return zero } // // 账本里这条 NPC 挂着的确实是 就清成 0(表示「演完了」)。 // EventId == 0 或账本里没有这个 NPC ⇒ 返回 false(不关、不发 SyncPlotCurrentEvent), // 免得把服务端没参与过的反应误关掉。 // func GameRouter_Plot_TryCompleteStaticNpcPlot(ctx context.Context, state any, agentId uint64, eventId uint32) bool { // Router implementation for GameRouter_Plot_TryCompleteStaticNpcPlot return true } func GameRouter_Plot_HasFinitePosition(ctx context.Context, target any) bool { // Router implementation for GameRouter_Plot_HasFinitePosition return true } func GameRouter_Plot_FormatPlotTarget(ctx context.Context, target any) string { // Router implementation for GameRouter_Plot_FormatPlotTarget return "" }