package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // GM 控制台(ALT+F1)职业命令族 —— GmJobTake / GmJobStart / GmJobQuit / // GmJobPromote / GmSetJobLevel / GmJobEnd。 // 移植自捐赠端 DremkaPS(2026-09-24)。他们这一族里 GmTaskRecord4229938 的 TaskState 字节 // 标了 "verified in game",是整份捐赠材料里极少数实机验证过的东西;其余(钱包 / 台词 / 过场 / // 敌群)捐赠端自己承认"排队做完、都还没实机验证"。 // ⛑ 三条本服的取舍,与捐赠端不同: // 1. 推送是「合并」不是「替换」。捐赠端把 spiritJobs 整个换成 GM 记录,本服则把它 // 叠加在 RuntimePayloadFactory.SpiritJobInfo4229938 配置驱动的那份之上 —— // 否则玩家在控制台点一条职业命令,角色原本的职业就整片消失。 // 2. CurrentJob 默认 100(Jobless)不是 0。0 不是合法 UrbanJobConfig id,客户端 // SpiritJobManager 会去解引用一个不存在的配置(本服踩过,见 // RuntimePayloadFactory.DefaultSpiritJobInfo4229938 的注释)。 // 3. 职业记录带天赋。捐赠端因无表而填 TalentInfo = null / RegisterTime = 0; // 本服统一走 RuntimePayloadFactory.GmJobRecord4229938,与本服 7k 验证过的 wire 一致。 // 捐赠端注释还点明了一件关键事实:客户端自己在本地生成 GM 实体,GM invoke 的调用点根本不看 // 返回值。所以这些 handler 的价值是「服务端认得这条指令、不再掉进 unknown-methods.log,并且 // 能把职业变化真的推给客户端」,而不是「返回一个客户端会用的值」。 // func GameRouter_GmJobs_GmJobTake(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_GmJobs_GmJobTake var zero any; return zero } func GameRouter_GmJobs_GmJobStart(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_GmJobs_GmJobStart var zero any; return zero } func GameRouter_GmJobs_GmJobQuit(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_GmJobs_GmJobQuit var zero any; return zero } func GameRouter_GmJobs_GmJobPromote(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_GmJobs_GmJobPromote var zero any; return zero } func GameRouter_GmJobs_GmSetJobLevel(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_GmJobs_GmSetJobLevel var zero any; return zero } // // GmJobEnd(65110787) 是这一族里唯一不带参数的(客户端序列化器为空), // 结束的是「当前职业」而不是命令里点名的那个。 // func GameRouter_GmJobs_GmJobEnd(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_GmJobs_GmJobEnd var zero any; return zero } // ------------------------------------------------------------------ shared path func GameRouter_GmJobs_HandleGmJobAsync(ctx context.Context, conn any, msg any, action any) any { // Router implementation for GameRouter_GmJobs_HandleGmJobAsync var zero any; return zero } // // 解参数。契约解码失败时退回裸字节 —— GM 控制台的序列化器是客户端自己生成的, // 服务端这一侧的契约一旦和它对不齐,最坏情况应该是「还能读出 jobClassId」而不是整条丢弃。 // func GameRouter_GmJobs_ReadGmJobArgs(ctx context.Context, msg any) any { // Router implementation for GameRouter_GmJobs_ReadGmJobArgs var zero any; return zero } func GameRouter_GmJobs_ApplyGmJob(ctx context.Context, state any, jobClassId uint32, level byte, action any) any { // Router implementation for GameRouter_GmJobs_ApplyGmJob var zero any; return zero } // // 推 SyncSpiritJobInfo(64913222)。 // ⛑ 合并而非替换:以 RuntimePayloadFactory.SpiritJobInfo4229938 的配置结果为底, // GM 记录覆盖/追加在上面。currentJob 只有在 GM 真的动过职业之后才改用控制台的值。 // func GameRouter_GmJobs_PushGmJobInfoAsync(ctx context.Context, conn any, state any, trigger string) any { // Router implementation for GameRouter_GmJobs_PushGmJobInfoAsync var zero any; return zero }