package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // ★★ 第五条管线:**Plate(盘)演出** —— SyncPlateAddList(68554224)。 // 为什么需要它:可玩角色按日程站到跑步机 / 娃娃机 / 床旁边,但**不会真的用它们** // (只是站着玩手机)。官方的生活 NPC 是场景里 Spoon 图上的一个「盘」—— // SpoonAgentUnit 同时带 AgentDataSetsActivityCfgId / // ActivityPlateCreator / ActivityEnterPoint,而盘要由服务端推下来客户端才会建 // (硬规则 157)。光在出场包里填活动 id 是不够的。 // 客户端形状(`UX.Game.PlateInfo`,dump 的 06_RUNTIME_CODE/.../Auto.Client/UX/Game/PlateInfo.cs): // // ulong UniqueId; int GraphId; UXVector3 Position; UXVector3 Rotation; // Dictionary<int,ulong> GadgetDic / DestructibleDic / DynamicAgentDic / DynamicVehicleDic; // Dictionary<int,int> AgentDic / VehicleDic / StaticNpcDic / RoomDic; // uint FavorNpcActivityId; // 包尾再跟一个 uint taskId // // ⛑⛑ 68554224 在 RPCDeserializeAuto.lua 里是 CSharpOnly ⇒ 客户端 reader 是 // C# 生成的,我们拿不到它的线格式。所以这里手写字节,所有「有没有 0xFF 标记 / // count 用哪种写法」都做成配置开关 —— 试错不用重编译,改配置再推一次即可。 // 判据只有一条:客户端回 AskPlateLoadComplete(67658390) / // AskPlateResourceReady(67916920),这两个 ack 在 unknown-methods.log 里 // 从来没有出现过(它们是服务端先推盘之后才发的),一旦出现就说明线格式对了。 // // ================================================================================= // ① C2S ack:只要出现就是通关信号,全部接住并打日志(INVOKE 必须回执,否则客户端 await 卡死) // ================================================================================= // // C2S AskPlateLoadComplete(67658390) —— ★ 通关判据 ①:盘的图加载完了。 // func GameRouter_Plate_OnAskPlateLoadComplete(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Plate_OnAskPlateLoadComplete var zero any; return zero } // // C2S AskPlateResourceReady(67916920) —— ★ 通关判据 ②:盘要的资源(NPC / 物件)齐了。 // func GameRouter_Plate_OnAskPlateResourceReady(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Plate_OnAskPlateResourceReady var zero any; return zero } // // C2S AskPlateAgentCreateConfirmed(67163577) —— 盘上的 agent 造好了。 // func GameRouter_Plate_OnAskPlateAgentCreateConfirmed(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Plate_OnAskPlateAgentCreateConfirmed var zero any; return zero } // // C2S AskNotifyPlateGameStallEvent(67733503) —— 盘上的小游戏/摊位事件。 // func GameRouter_Plate_OnAskNotifyPlateGameStallEvent(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Plate_OnAskNotifyPlateGameStallEvent var zero any; return zero } func GameRouter_Plate_Hex(ctx context.Context, bytes []byte, max int32) string { // Router implementation for GameRouter_Plate_Hex return "" } // ================================================================================= // ② S2C:推盘 // ================================================================================= // HTTP / 世界就绪 两处共用的入口。返回 0 = 没发(配置关了)。 func GameRouter_Plate_PushPlateAsync(ctx context.Context, session *GameSession, cfg any) int32 { // Router implementation for GameRouter_Plate_PushPlateAsync return 0 } // 世界就绪钩子:配置 pushOnWorldReady=true 才推。 func GameRouter_Plate_EnsurePlateAsync(ctx context.Context, session *GameSession) any { // Router implementation for GameRouter_Plate_EnsurePlateAsync var zero any; return zero } // ================================================================================= // ③ 手写线格式(旋钮全在配置里) // ================================================================================= // // 包体 = [rootMarker] + 列表(1 个 PlateInfo) + taskId。 // ⛑ 顺序照抄 UX.Game.PlateInfo 的字段声明顺序,一个都不能挪。 // func GameRouter_Plate_BuildPlateAddListBody(ctx context.Context, cfg any, uniqueId uint64, rosterUid uint64, agentId uint32) []byte { // Router implementation for GameRouter_Plate_BuildPlateAddListBody return nil } func GameRouter_Plate_WriteVec3(ctx context.Context, w any, marker bool, x float32, y float32, z float32) any { // Router implementation for GameRouter_Plate_WriteVec3 var zero any; return zero } func GameRouter_Plate_WriteEmptyDict(ctx context.Context, w any, cfg any) any { // Router implementation for GameRouter_Plate_WriteEmptyDict var zero any; return zero } func GameRouter_Plate_WriteDictInt32(ctx context.Context, w any, cfg any, fill bool, slot int32, value int32) any { // Router implementation for GameRouter_Plate_WriteDictInt32 var zero any; return zero } func GameRouter_Plate_WriteDictUInt64(ctx context.Context, w any, cfg any, fill bool, slot int32, value uint64) any { // Router implementation for GameRouter_Plate_WriteDictUInt64 var zero any; return zero } func GameRouter_Plate_WriteCount(ctx context.Context, w any, encoding any, count int32) any { // Router implementation for GameRouter_Plate_WriteCount var zero any; return zero } func GameRouter_Plate_ParseUniqueId(ctx context.Context, raw string) uint64 { // Router implementation for GameRouter_Plate_ParseUniqueId return 0 }