using Ananta.SDK.Serialization; namespace Ananta.Server.Protocol.Client4229938; /// /// 手写字节的 SyncGameSwitchToClient_3(53940944) 载荷。 /// /// 为什么不能用 UxSerializer:payload 是 Dictionary<string, UXObject>, /// value 是多态静态对象(tp 单字节 + payload),UxSerializer 不支持。 /// /// 线格式由 donor 反汇编 UXRPCMethodArgs53940944.Read @ RVA 0x9AB5450 确认,别再改: /// /// [Int7 计数] // Read7BitEncodedInt(),无 0xFF、无终止符 /// 计数 × { [UxString key]; [tp:1][payload] } // value 前没有存在标记 /// /// tp = 2 是 bool(跳转表 RVA 0x1DAC878,tp∈[2,8]),payload 为 1 字节。 /// 203 项 → 约 4.9 KB。 /// /// ⛔⛔ 发送时必须走 Connection.NotifyRawAsync(methodId, byte[]): /// 用 NotifyAsync<T> 且 T = byte[] 会按 UX 缓冲区多写 3 字节(0xFF + varint(len+1)), /// 客户端把 FF 8A 26 当计数 ⇒ 整体错位。 /// internal static class GameSwitchCodec { private const byte TypeTagBool = 2; internal static byte[] Build() { var entries = GameSwitchCatalog.Entries; var writer = new UxWriter(); writer.Int7(entries.Length); foreach (var (name, value) in entries) { writer.UxString(name); writer.U8(TypeTagBool); writer.Bool(value); } return writer.ToArray(); } internal static byte[] Build(IEnumerable<(string Name, bool Value)> entries) { var list = entries as IReadOnlyCollection<(string Name, bool Value)> ?? entries.ToArray(); var writer = new UxWriter(); writer.Int7(list.Count); foreach (var (name, value) in list) { writer.UxString(name); writer.U8(TypeTagBool); writer.Bool(value); } return writer.ToArray(); } }