feat: Add metro transit, gadgets, shop, social apps, and traffic models checkpoint
This commit is contained in:
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");
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user