feat: Add metro transit, gadgets, shop, social apps, and traffic models checkpoint

This commit is contained in:
CAtlas0784 committed 2026-10-29 01:55:01 +07:00
1 parent caa42b84ed
commit 74e2963a12
79 files changed
+527962 -496

No files matched your search

@@ -73,6 +73,9 @@ internal sealed partial class GameRouter
await ctx.NotifyAsync(MethodId.SendServerTimeGame, LoginCodec.ServerTime());
await ctx.NotifyAsync(MethodId.SyncPlayerInfo, RuntimePayloadFactory.MinimalPlayerInfo4229938());
// Phone contacts book per character (summon numbers + real city NPC contacts) —
// the NETWORK OF CONTACTS app renders exactly this push.
await PushSpiritHandbookAsync(ctx.Session);
await SendEnterSceneIfNeeded(ctx);
}
@@ -378,16 +381,55 @@ internal sealed partial class GameRouter
});
}
// Initialize story task tracking
// Initialize story task tracking — the INTRO cutscene (train / name entry / gender
// select) is driven by the story root task 60004938 (PrivateServer1-proven): the
// client plays the opening when the current task is the story root.
const uint StoryRootTaskId = 60004938u;
await ctx.NotifyAsync(MethodId.SyncPlayerSingleTask, new SceneMethods.SyncPlayerSingleTask4229938
{
TaskId = StoryRootTaskId,
View = new SceneMethods.TaskViewData4229938
{
TaskId = StoryRootTaskId,
State = 1, // Accepted
},
State = new SceneMethods.TaskStateData4229938 { State = 1, Reason = 0 },
});
await ctx.NotifyAsync(MethodId.SyncCurrentTask, new SceneMethods.SyncCurrentTaskInfo
{
Type = 1,
TaskId = 10001,
TaskId = StoryRootTaskId,
EventId = 0,
FirstTime = true,
Reason = 0
});
// Establish the quest system with the current task and an empty furniture inventory
// (houses render clean instead of blocking on furniture state).
if (ctx.Session.Items.TryGetValue("taskStates", out var taskRaw) && taskRaw is Dictionary<uint, QuestEntry> taskStates)
{
foreach (var (taskId, entry) in taskStates.Where(kv => kv.Value.State == QuestStateAccepted))
{
await ctx.NotifyAsync(MethodId.SyncPlayerSingleTask, new SceneMethods.SyncPlayerSingleTask4229938
{
TaskId = taskId,
View = new SceneMethods.TaskViewData4229938
{
TaskId = taskId,
CounterValues = entry.Counters.ToList(),
State = entry.State,
},
State = new SceneMethods.TaskStateData4229938 { State = entry.State, Reason = 0 },
});
}
}
await ctx.NotifyAsync(MethodId.SyncPlayerAllTask, new SceneMethods.SyncPlayerAllTask4229938
{
CurrentTask = StoryRootTaskId,
LoginGameServer = true,
});
await ctx.NotifyAsync(MethodId.SyncHouseFurnitureInfo, new SceneMethods.SyncHouseFurnitureInfo4229938());
ctx.Session.Log.Info($"[WORLD-V7] ready generation={generation} scene={sceneId} session={sessionId} exactGuide=true sceneComplete=first actorPresentation=client-owned buffs=deferred-first-movement noStory=false noAOI=true");
}