package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // Task (quest) publication. // Two things have to arrive together for anything to appear in the Mission / task panel: // 1. The rows. SyncTaskTitleGuideUnlock(64841491) reveals the panel tabs (its Lua impl calls // gMapSystem.taskUtils:SetTaskTitleGuide), SyncPlayerAllTask(64260853) carries TaskConfig rows, // and SyncPlayerAllTaskDebug(64423039) is the CSharpOnly twin that actually reaches the client's // native task manager (64260853 has its own Lua impl which only reads `currentTask`). // 2. The event list — eventPanelInfo.EventsInfo, and THIS is what the list renders. The // panel rows are TaskEventConfig rows, not TaskConfig rows: the evidence branch's own // investigation pinned it down by matching every visible row against both tables (7/7 hits in // TaskEventConfig, 0/7 in TaskConfig), and traced it to // L18.Spoon.Task.TaskManager.SyncPlayerAllEventPanel filling TaskManager.m_TaskEvents. Map // markers are unrelated — those come from the client's own local TaskEventConfig, which is why // the map always worked while the panel stayed empty. // This is why publishing all 4342 TaskConfig rows changed nothing on its own: without EventsInfo // the list has no data source at all. Everything is config-gated under gameplay.taskPanel // so any half of it can be switched off without a rebuild. // Known limit, not fixable here: accepting a task does not start any in-game flow, because the // task graph is a Spoon resource (GameRes/Spoon/HotRaid/*.rcp, GameRes/Spoon/Task/*.tcp) and the // local client has no hot-update layer for it. The list can show; the objectives cannot run. // func GameRouter_Tasks_PublishPlayerTasksAsync(ctx context.Context, rpcCtx *RpcContext) any { // Router implementation for GameRouter_Tasks_PublishPlayerTasksAsync var zero any; return zero } // // R238(2026-10-03 随赛车移植)—— 进世界时**只**发布赛车挑战那几条任务行, // 让客户端的 task manager 在玩家点「开始挑战」之前就拥有 60000147 的运行时节点。 // 刻意**不是** PublishTaskListAsync: // · 载荷只有赛车那几条(~23 行),不是 4342 行的全量表 —— 全量表会让客户端 // 挑中一个无关挑战(60029952)并把手机换成「结算挑战」弹窗。 // · 通道是 SyncPlayerAllTaskDebug(64423039)(CSharpOnly 孪生包)。64260853 有 // 客户端 Lua 实现会吞掉 taskInfos,而且它正是 R236 的崩因嫌疑包。 // 状态保持 Accepted:客户端把它读成「可以开始 / 正在追踪的挑战」。 // 回滚 = gameplay.taskPanel.primeRacingChallengeTasks = false。 // func GameRouter_Tasks_PublishRacingChallengeTasksAsync(ctx context.Context, rpcCtx *RpcContext) any { // Router implementation for GameRouter_Tasks_PublishRacingChallengeTasksAsync var zero any; return zero } // // Unlock every TaskTitle (panel tab / chapter group). Ids come from TaskTitleCatalog.json, // a projection of TaskTitleConfig.json (21 rows: 1..25 and 99). // func GameRouter_Tasks_PublishTaskTitleUnlocksAsync(ctx context.Context, session *GameSession) any { // Router implementation for GameRouter_Tasks_PublishTaskTitleUnlocksAsync var zero any; return zero } func GameRouter_Tasks_PublishTaskListAsync(ctx context.Context, session *GameSession) any { // Router implementation for GameRouter_Tasks_PublishTaskListAsync var zero any; return zero } // // Which TaskConfig rows to publish. "configured" publishes only the configured ids and is the // small shape the reference branch uses (one authored task that maps to one authored event); // "catalog" keeps the historical full dump. // func GameRouter_Tasks_ResolvePublishedEntries(ctx context.Context, panel any) []any { // Router implementation for GameRouter_Tasks_ResolvePublishedEntries return nil } func GameRouter_Tasks_ResolveTaskState(ctx context.Context, panel any) any { // Router implementation for GameRouter_Tasks_ResolveTaskState var zero any; return zero } // // eventPanelInfo — the actual list data source. TaskEvents are TaskEventConfig rows; // each row needs EventId, a TaskId pointing at a step the client recognises as started, // UnlockTime, and the status flags (Visible(1) is mandatory or nothing renders). // func GameRouter_Tasks_BuildEventPanelInfo(ctx context.Context, panel any, publishedTasks []any) any { // Router implementation for GameRouter_Tasks_BuildEventPanelInfo var zero any; return zero } func GameRouter_Tasks_ResolveEventTaskId(ctx context.Context, panel any, row any, publishedTasks []any) uint32 { // Router implementation for GameRouter_Tasks_ResolveEventTaskId return 0 } // // One panel row. CounterValues/Counters carry the objective progress: CounterValues[i] is the // current value and Counters[i] repeats it alongside the configured target, because the UI // renders "value/target" and skips rows that have neither. // func GameRouter_Tasks_BuildTaskInfo(ctx context.Context, e any) any { // Router implementation for GameRouter_Tasks_BuildTaskInfo var zero any; return zero }