diff --git a/TankiOffline/app/src/jsMain/kotlin/App/Main.kt b/TankiOffline/app/src/jsMain/kotlin/App/Main.kt index 93b74eb..b2c17d6 100644 --- a/TankiOffline/app/src/jsMain/kotlin/App/Main.kt +++ b/TankiOffline/app/src/jsMain/kotlin/App/Main.kt @@ -69,6 +69,7 @@ private class Stats { var HeaderErrors = 0 var ShortCommands = 0 var UnknownMethods = 0 + val UnknownIds = ArrayList() val Failures = ArrayList() } @@ -79,6 +80,8 @@ private fun RunOne(Path: String, Registry: Map, S: Stats) { S.BadFrames++ return } + // 别名表按文件(同一次连接的一段抓包)维护;_setModelCommandAlias 解码后会填充 + val Aliases = HashMap>() for (F in Frames) { S.Frames++ val Body = try { @@ -88,10 +91,11 @@ private fun RunOne(Path: String, Registry: Map, S: Stats) { if (S.Failures.size < 12) S.Failures.add("$Path 解压失败:${E.message}") continue } - val R = SpaceFrame.DecodeBody(Body, Registry) + val R = SpaceFrame.DecodeBody(Body, Registry, Aliases) S.Records += R.Records.size S.ShortCommands += R.ShortCommandCount S.UnknownMethods += R.UnknownMethodIds.size + for (Id in R.UnknownMethodIds) if (S.UnknownIds.size < 8) S.UnknownIds.add(Id) val Err = R.Error if (Err != null) { if (Err.startsWith("记录头截断")) S.HeaderErrors++ @@ -161,6 +165,9 @@ fun main() { println("回编码一致 ${S.RoundTripOk}|不一致 ${S.RoundTripBad}") println("短命令 ${S.ShortCommands}|未知 methodId ${S.UnknownMethods}|记录头截断 ${S.HeaderErrors}|其它解码错误 ${S.DecodeErrors}|坏帧 ${S.BadFrames}") println("下行注册 ${DownlinkRegistry.ByMethodId.size}|上行注册 ${UplinkRegistry.ByMethodId.size}") + if (S.UnknownIds.isNotEmpty()) { + println("未知 methodId 样例:" + S.UnknownIds.joinToString(",")) + } if (S.Failures.isNotEmpty()) { println("前若干失败:") for (F in S.Failures) println(" · $F") diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module10283.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module10283.kt index 4748c1d..9234d9c 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module10283.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module10283.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 1798193036336198760|module_10283 data class Down10283Xt8760( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module1510.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module1510.kt index a13ee0a..9600870 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module1510.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module1510.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 3001647159444627062|module_1510 data class Down1510Gn7062( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module25377.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module25377.kt index 57a05d2..a917166 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module25377.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module25377.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 1246109053620123806|module_25377 data class UidNotifierData3806( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module29554.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module29554.kt index 44fa2fe..eff7f62 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module29554.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module29554.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 8179162314198150518|module_29554 data class ZnM88693Lt0518( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module31908.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module31908.kt index fe31611..acc6b2a 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module31908.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module31908.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 1661920281800548495|module_31908 data class StatisticsTeamCC8495( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module37504.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module37504.kt index dc58dfc..3404514 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module37504.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module37504.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 246376163847464422|module_37504 data class ClanUserCC4422( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module47243.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module47243.kt index 13fe8b6..1e5e905 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module47243.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module47243.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 73478093585084631|module_47243 data class Down47243K4631( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module54199.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module54199.kt index b5efa78..49a6d6e 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module54199.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module54199.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 314983404410424222|module_54199 data class NewsShowingCC4222( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85183.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85183.kt index f8414dc..be670e6 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85183.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85183.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 28608551882350617|module_85183 data class ModerationToolInteropCC0617( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85196.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85196.kt index f9d0730..b7ffbf6 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85196.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85196.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 7615142300796401818|module_85196 data class Down85196Ch1818( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85667.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85667.kt index 1abd7a3..7df0704 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85667.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module85667.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 756296912352966419|module_85667 data class CaptchaCC6419( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module88693.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module88693.kt index b33f1aa..45592d2 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module88693.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module88693.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 2997538417603420748|module_88693 data class Down88693Pt0748( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module89803.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module89803.kt index 265a8a7..724f5b1 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module89803.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Downlink/Module89803.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 下行 1480424224583906965|module_89803 data class TeamBattleInfoCC6965( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module01510.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module01510.kt index 6623c3d..e60b980 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module01510.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module01510.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // FacebookPaymentCC|module_01510 data class FacebookPaymentCC( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module10283.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module10283.kt index 509800a..a5f22da 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module10283.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module10283.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // AntiAddictionRealNameValidatorModelCC|module_10283 data class AntiAddictionRealNameValidatorModelCC( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module16100.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module16100.kt index 4ec332c..24f433a 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module16100.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module16100.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // Atlas|module_16100 data class Atlas( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module24635.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module24635.kt index bbd8b5a..11cba34 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module24635.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module24635.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // codec module_24635::Ht|module_24635 data class F24635Ht( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module25377.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module25377.kt index a418458..86309dc 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module25377.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module25377.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // UserNotifierCC|module_25377 data class UserNotifierCC( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module31908.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module31908.kt index b139543..6b71bfa 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module31908.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module31908.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // BattleCreateParameters|module_31908 data class BattleCreateParameters( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module37504.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module37504.kt index 9907283..a111ed0 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module37504.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module37504.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // ClanFriendsCC|module_37504 data class ClanFriendsCC( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module45686.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module45686.kt index 0ced2de..743c719 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module45686.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module45686.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // at|module_45686 data class At( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module47243.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module47243.kt index 4944e22..2c8ce9e 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module47243.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module47243.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // Hc|module_47243 data class Hc( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module54199.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module54199.kt index a731abe..1533c24 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module54199.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module54199.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // ChannelSidAndName|module_54199 data class ChannelSidAndName( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module61860.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module61860.kt index d2d6340..9e79c51 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module61860.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module61860.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // Lt|module_61860 data class Lt( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module67222.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module67222.kt index 6b124c2..f4cf256 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module67222.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module67222.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // SocialNetworkParametersCC|module_67222 data class SocialNetworkParametersCC( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module71105.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module71105.kt index b67ee4e..3cbd43e 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module71105.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module71105.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // codec module_71105::ps|module_71105 class F71105Ps diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85183.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85183.kt index 40b2e84..d651f5d 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85183.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85183.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // FlagBattleSFXCC|module_85183 data class FlagBattleSFXCC( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85196.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85196.kt index 50c6af9..3a77e60 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85196.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85196.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // AvailableForAllCC|module_85196 data class AvailableForAllCC( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85667.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85667.kt index 22ff711..95df9ff 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85667.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85667.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // bu|module_85667 data class Bu( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85745.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85745.kt index 713b8bd..660955b 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85745.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module85745.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // E|module_85745 data class EM85745X( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module87072.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module87072.kt index 05bb2e7..e740452 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module87072.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module87072.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // TankState|module_87072 class TankStateM87072T5 diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module88693.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module88693.kt index 4d48faa..1924db8 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module88693.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module88693.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // FriendsCC|module_88693 data class FriendsCC( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module89803.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module89803.kt index 592f4dc..ce43979 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module89803.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module89803.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // BattleInfoCC|module_89803 data class BattleInfoCC( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module99527.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module99527.kt index c54d72a..2ef1f26 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module99527.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Models/Module99527.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // DescriptionModelCC|module_99527 data class DescriptionModelCC( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Registry.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Registry.kt index 0ec6592..959177f 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Registry.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Registry.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec object DownlinkRegistry { val ByMethodId: Map = mapOf( @@ -602,7 +606,6 @@ object DownlinkRegistry { 8164325377073720540L to F24635WtCodec, 8171556272533651970L to F24635WtCodec, 8171778085109430386L to UserNotifierCCCodec, - 8179162314198150518L to ZnM88693Lt0518Codec, 8188577464406062306L to PaymentRequestVariableCodec, 8201829668071386439L to F24635WtCodec, 8230065716229425028L to Down47243Jg5028Codec, @@ -677,7 +680,6 @@ object DownlinkRegistry { 8981778623033134120L to UserNotifierCCCodec, 8992960192854306015L to Down47243Iv6015Codec, 9006618999845515525L to UserNotifierCCCodec, - 9038756763225879447L to ClanOutgoingCCCodec, 9045061171239007459L to FacebookPaymentCCCodec, 9047763868814832699L to DemomanSfxCC2699Codec, 9052673731308612681L to FacebookPaymentCCCodec, @@ -693,6 +695,10 @@ object DownlinkRegistry { 9187558822227119790L to TCodec, 9187558822227614985L to F24635WtCodec, 9198230959529402310L to DonationAlertCC0661Codec, + 9038756763225879447L to LtCodec, + 7640916300855664666L to PtCodec, + 3216143066888387731L to ZtCodec, + 8179162314198150518L to AliasCodec, ) } @@ -1061,3 +1067,365 @@ object UplinkRegistry { 9221299643007466131L to TCodec, ) } + +object ModelRegistry { + val ByModelId: Map = mapOf( + 3000206000964343740L to FacebookPaymentCCCodec, + 7245225301789542308L to SonyProductToItemIdMapCCCodec, + 7838366943662257567L to AntiAddictionRealNameValidatorModelCCCodec, + 6791702738669939115L to LoaderBackgroundModelCCCodec, + 4065909569861626318L to ServerHaltEntranceCCCodec, + 466296741210741928L to ExternalEntranceCCCodec, + 9117714962311439886L to InviteEntranceCCCodec, + 5457907984000701384L to NotificationsByCountryModelCCCodec, + 513176302374590130L to CompositePartnerCCCodec, + 8618289906968528240L to RegistrationModelCCCodec, + 2474458842977623992L to RegistrationModelCCCodec, + 7300500077035374704L to EntranceResourcesCCCodec, + 6627517808336136295L to MaterialsCodec, + 6403067749608679876L to UserNotifierCCCodec, + 1850509145998626828L to UserActionsLoggerCCCodec, + 258682513334072065L to RankNotifierDataCodec, + 4255726087158005051L to UidNotifierDataCodec, + 3527205014716342329L to RankInfoCodec, + 216902005816818019L to SpectatorsModelCCCodec, + 2085529474881905981L to StatisticsModelCCCodec, + 787936358514072261L to StatisticsDMCCCodec, + 2472262160204144219L to StatisticsDMCCCodec, + 8115862559097350286L to ClanFriendsCCCodec, + 7076997842038370798L to ClanMembersCCCodec, + 3413041240691998182L to ClanIncomingCCCodec, + 8762499949521628954L to ClanInfoCCCodec, + 6048708024205731750L to ClanOutgoingCCCodec, + 6882547137659234022L to ClanPermissionsCCCodec, + 6768558945605412944L to ContainerCCCodec, + 871785774630866042L to ContainerCCCodec, + 6220257539261493170L to ContainerCCCodec, + 2023935033691193766L to ContainerCCCodec, + 5297988375509642470L to ContainerCCCodec, + 4813819753066546054L to ContainerCCCodec, + 649690707811173020L to ContainerCCCodec, + 881620222948704326L to ContainerCCCodec, + 8495889215182031654L to LicenseClanUserCCCodec, + 7949064601138261608L to ClanNotifierDataCodec, + 2547093126916834195L to ClanEditPriceCCCodec, + 6247612331185889342L to ClanLoadingPanelCCCodec, + 2606798949852309286L to ClanPanelNotificationCCCodec, + 6042266992054445914L to ClanCreateCCCodec, + 1115275516484037832L to ClanUserCCCodec, + 1986821874929333245L to UserAccountRemovalModelCCCodec, + 1298753286651761171L to F45686JtCodec, + 7588919819099098108L to BattleInviteCCCodec, + 2855626038259597130L to BattlePassPurchaseNotifierCCCodec, + 7805766859473669177L to ChallengeClientCCCodec, + 3349786357139026014L to TierCodec, + 8237913720896985151L to TierItemCodec, + 1987602940683756146L to StarsInfoCCCodec, + 8677996546985988365L to StarsInfoCCCodec, + 6514486185481319524L to CreatorTagCCCodec, + 965113061940997187L to CreatorTagsCCCodec, + 7341286352739641155L to DebtInfoCCCodec, + 3395764563215792356L to DonationAlertCCCodec, + 2108103923322474513L to DonationDataCodec, + 8464700182634408374L to UserDroppableGoldSettingsCCCodec, + 3503382027414679973L to TankHasGrenadeCCCodec, + 5801057999588514016L to ResistancesCCCodec, + 6820688895043695030L to GSWarningInfoModelCCCodec, + 7822174537018024954L to GSWarningInfoModelCCCodec, + 3152693668290247629L to IconsProviderCCCodec, + 6726403008449784914L to KeysInfoCCCodec, + 1417398836682569292L to PaymentCCCodec, + 3031864034871022835L to PaymentLoaderCCCodec, + 1009501302658881534L to PaymentLoaderCCCodec, + 4748522118519647527L to PayModeCCCodec, + 5952355564848177159L to AndroidPayCCCodec, + 6169263949965533624L to AppleAppStoreCCCodec, + 5156898764211343104L to AppleAppStoreCCCodec, + 8083057704493864984L to BottomDescriptionCCCodec, + 6144768774251946863L to BottomDescriptionCCCodec, + 2951667042968033849L to JwCodec, + 4905763060352702216L to PayPalPayModelCCCodec, + 7860106430129114440L to RuStorePayCCCodec, + 3158124838791669092L to PaymentButtonCCCodec, + 213661725715747381L to PeriodicRewardCCCodec, + 3620520388804703780L to PeriodicRewardCCCodec, + 5780017129265868734L to PresentsSettingsCCCodec, + 7307951074626252633L to PresentsSettingsCCCodec, + 9028066746998427457L to PaidRenameCCCodec, + 3179861497615625536L to UserEmailCCCodec, + 1893408944113965505L to UserPropertiesCCCodec, + 9006361281849290638L to UserPushNotificationSettingsModelCCCodec, + 5895522515282663537L to UserAchievementCCCodec, + 7295738902766942560L to MainQuestBattleProgressCodec, + 701801920209410257L to MainQuestUserModelCCCodec, + 7105110962241677955L to MainQuestUserModelCCCodec, + 5167916989664044333L to ReferralEventUserModelCCCodec, + 4038465370530850950L to QuestCategoriesModelCCCodec, + 462434031489766566L to QuestCategoriesModelCCCodec, + 6680653332718076818L to QuestCategoryStatisticCodec, + 6966229709169193455L to RewardedVideosCCCodec, + 8659306545527654916L to RubyInfoCCCodec, + 2767408225195389970L to RubyInfoCCCodec, + 1456475022890566348L to RulesUpdateShowingCCCodec, + 3714146481313901316L to ShopCardCCCodec, + 5172585086901412996L to ShopCardDiscountCCCodec, + 5817682208733860186L to ShowcaseViewCCCodec, + 1535852183188388854L to BattlePassPackageCCCodec, + 889485403566576664L to KitBundleViewCCCodec, + 4186634155763928467L to CoinPackageCCCodec, + 6484910309342792771L to ContractShopCCCodec, + 2789386002514731022L to CrystalPackageCCCodec, + 7810820263988615290L to ShopItemAdditionalDescriptionCCCodec, + 8458424802385151068L to ShopDiscountCCCodec, + 6744857484209767976L to EmailRequiredCCCodec, + 8853923292505519798L to RestrictionByPayModeCCCodec, + 6091707767266836975L to ShopItemFeaturingCCCodec, + 6899642532024252493L to GoldBoxPackageCCCodec, + 806128205466208462L to GoldBoxPackageCCCodec, + 6395651505226788750L to GoodsCCCodec, + 7786222713213880898L to GoodsCCCodec, + 7935550480449821024L to IndemnityCCCodec, + 8629995567796005946L to KeysPackageCCCodec, + 2103303438297476110L to KitPackageCCCodec, + 3985896237583754666L to KitViewResourceCCCodec, + 4440355418204561498L to KitViewResourceLocalizedCCCodec, + 8755539534673619516L to LootBoxPackageCCCodec, + 5004566952388327414L to LootboxAndPaintCCCodec, + 6841476710481576918L to ShopItemOneTimePurchaseCCCodec, + 7949842549440362353L to ShopItemOneTimePurchaseCCCodec, + 9121776538033375678L to PaintPackageCCCodec, + 7881181052304665842L to PaintPackageCCCodec, + 5138794050233567698L to PremiumPackageCCCodec, + 693025797100292228L to ShopItemCCCodec, + 8048067679617995470L to ShopCategoryCCCodec, + 4268132139764766386L to ShopItemCategoryCCCodec, + 6192892501890483066L to SpecialKitPackageCCCodec, + 1036461397335537760L to StarsPackageCCCodec, + 2168011188167752629L to ContextTutorialModelCCCodec, + 4782427880403395260L to LobbyTutorialModelCCCodec, + 5256681735304582291L to TwitchAccountModelCCCodec, + 2252704231082045810L to TwoStepVerificationModelCCCodec, + 2080556892932195426L to UserCountryCCCodec, + 1851605205665890036L to RewardInfoDataCodec, + 8517963146836182364L to RewardsInfoCCCodec, + 6071565290933648049L to ChatCCCodec, + 891137447706578619L to ClanChatCCCodec, + 868364325972433765L to NewsShowingCCCodec, + 7970528904804811572L to OiCodec, + 7267982595724632282L to MiM61860FrCodec, + 6359692933626160397L to SocialNetworkParametersCCCodec, + 7762582768388221832L to FlagBattleSFXCCCodec, + 7401419333842694749L to BattlefieldCCCodec, + 2101100305743734614L to BillboardCCCodec, + 5958419804845264849L to BotNavigationCCCodec, + 2464705242400585109L to FacilitySphericalZoneCCCodec, + 5242494537362061802L to CommonFacilityCCCodec, + 8109298281939714429L to BattleLockingCCCodec, + 9172358609541951983L to MeteorStormCCCodec, + 2057320715890332864L to BattleMineCCCodec, + 8980131978880882207L to BattleStartDelayCCCodec, + 5385894712778438726L to BattleChatCCCodec, + 6445399806655453890L to InventoryCCCodec, + 3364392936313775902L to TargetHighlightingCCCodec, + 7874327015886119466L to JuggernautCCCodec, + 5123834867188931684L to KillStreakCCCodec, + 2648029304025111838L to CaptureTheFlagCCCodec, + 2618111250571302204L to RugbyCCCodec, + 2269636304551395302L to BallExplosionCCCodec, + 6141842138930446750L to StatusEffectBattleCCCodec, + 1475210252818583689L to BattleTutorialCCCodec, + 9114375113924783411L to BattleTutorialCCCodec, + 2145315487377727727L to BattlefieldBonusesCCCodec, + 5215232257096838692L to BonusRegionsCCCodec, + 3339617300033754420L to GoldBonusCCCodec, + 510571369984788727L to BattleGoldBonusCCCodec, + 8966480724474352542L to BonusCommonCCCodec, + 3305376498517733218L to NotificationBonusCCCodec, + 7484749077586587376L to BonusLightCCCodec, + 5968651969329902265L to ColorAdjustCCCodec, + 1661364280719338177L to DemomanSfxCCCodec, + 8316165996190533130L to DroneIndicatorCCCodec, + 4553925959338838726L to CrisisEffectCCCodec, + 5207857306014573244L to XCCodec, + 6424605984954645392L to TankEffectSFXCCCodec, + 8166810800706377715L to ActiveAfterDeathCCCodec, + 5779075235189237790L to EffectDescriptionCCCodec, + 3157947224668485277L to EffectLevelCCCodec, + 2078544146946392301L to GrenadeCCCodec, + 9169475278259220023L to GrenadeCommonSFXCCCodec, + 8082047509383246662L to BazookaExplosionCCCodec, + 6729312304988255776L to FoamBazookaCCCodec, + 2046257084008991040L to MagnetBazookaCCCodec, + 2360640997000854496L to RepairGrenadeCCCodec, + 3385611214280288146L to TeslaBazookaCCCodec, + 7336962025965257296L to HeatTrapBazookaCCCodec, + 4985274885530276227L to InventoryItemCCCodec, + 2173939047300893281L to InventorySfxCCCodec, + 4693095212037357021L to BattleMapCCCodec, + 1688856467034284073L to MapBonusLightCCCodec, + 4885574251230758729L to ModerationToolInteropCCCodec, + 7894174029759745197L to ClassicParachuteCCCodec, + 4778752313022424015L to RadarCCCodec, + 3719295044981767592L to StatusEffectCCCodec, + 8889030940127130747L to StatusEffectCCCodec, + 5215458949573069793L to SuppliesTutorialModelCCCodec, + 3535248640055401164L to TrackedChassisCCCodec, + 9175894397021160571L to HullCommonCCCodec, + 3966050316678844327L to TankRankUpEffectCCCodec, + 6638615717159906637L to TankRankUpEffectCCCodec, + 4875657231924274329L to SimpleArmorCCCodec, + 7912514999422640843L to SimpleArmorCCCodec, + 1090112775751802907L to ColorTransformCCCodec, + 7968893209278436962L to ColorTransformCCCodec, + 844040023906032853L to FreezeSFXCCCodec, + 5745114335268581493L to IsisSFXCCCodec, + 2368553937090306741L to RailgunShootSFXCCCodec, + 5257069799854314780L to RicochetSFXCCCodec, + 9094843804380507187L to ShaftShootSFXCCCodec, + 1748249573394295263L to SmokyShootSFXCCCodec, + 6623392760536649465L to TeslaShootSFXCCCodec, + 8191021443726008799L to ThunderShootSFXCCCodec, + 7692437363459179503L to TwinsShootSFXCCCodec, + 6641568549549264883L to HullSmokeCCCodec, + 2638139599268780529L to AimAssistCCCodec, + 7883218652624289568L to VerticalAnglesCCCodec, + 1237976996871886061L to WeaponCommonCCCodec, + 4444006910106229297L to FlameThrowerCCCodec, + 9105939015977236209L to FreezeCCCodec, + 1782954502314814229L to GaussCCCodec, + 3075844226211230705L to GaussSFXCCCodec, + 7068168268219022867L to IsisCCCodec, + 5194655544597440038L to LaserPointerCCCodec, + 7266201540452328992L to LaserPointerCCCodec, + 1663344340563853103L to RailgunCCCodec, + 1092307613749405757L to RicochetCCCodec, + 1130027771466355435L to ScorpioCCCodec, + 313670832122918648L to ScorpioSfxCCCodec, + 732152133982227177L to ShaftCCCodec, + 7700337090161867199L to ShotCCCodec, + 2172139419072369403L to SmokyCCCodec, + 2544465990449691855L to SplashCCCodec, + 2235965200289058033L to SplashCCCodec, + 8345039896357067195L to StreamWeaponCCCodec, + 2057487026153364495L to StreamWeaponCCCodec, + 6855550629220038001L to TerminatorCCCodec, + 6210980129845088505L to TerminatorSFXCCCodec, + 573691036321759779L to TeslaCCCodec, + 8212033390179430143L to TsunamiCCCodec, + 5604117679922858821L to TsunamiShootSFXCCCodec, + 2803166101624878775L to RotatingTurretCCCodec, + 8384919755051909877L to TwinsCCCodec, + 6384655869260380731L to WeaponWeakeningCCCodec, + 6642061974307112160L to ArtilleryCCCodec, + 8754295211549969729L to ArtilleryElevatingBarrelCCCodec, + 4499337062875496540L to ArtillerySfxCCCodec, + 7235761383767133268L to BonkWeaponCCCodec, + 7022952987062772048L to MachineGunCCCodec, + 6596471917520283782L to MachineGunSFXCCCodec, + 8784137528831277530L to MachineGunSFXCCCodec, + 6528115483341986769L to RocketLauncherCCCodec, + 4045733714401632272L to RocketLauncherCCCodec, + 770654516236272028L to ShotgunSFXCCCodec, + 5867914731324680416L to ShotgunShotCCCodec, + 2660691061343351669L to TeamLightCCCodec, + 171896995500198357L to TeamLightCCCodec, + 1500120709087433677L to TeamLightColorParamsCodec, + 6455142242556985012L to UltimateCCCodec, + 7899544742191273818L to AresUltimateProjectileCCCodec, + 6210079079280471693L to CrusaderEffectCCCodec, + 3907559303616283277L to CrusaderUltimateCCCodec, + 6590506277285284269L to DictatorUltimateCCCodec, + 6668012086939621459L to HopperUltimateCCCodec, + 8738779591519195597L to HornetUltimateCCCodec, + 7214131179703676563L to HornetUltimateCCCodec, + 920233600808088339L to BattleUltimateRadarCCCodec, + 4406836274649365203L to HunterUltimateCCCodec, + 7257138969919985658L to TankStunCCCodec, + 887431150717814637L to JuggernautUltimateCCCodec, + 1997576349992148053L to MammothUltimateCCCodec, + 4658911146867546991L to PaladinAuraVisualCCCodec, + 4388979890807820236L to TankSuperchargeCCCodec, + 973781565169577734L to TankSuperchargeCCCodec, + 7551602984488625261L to VikingUltimateCCCodec, + 3137250957878113145L to WaspUltimateBombCCCodec, + 3248199557469599724L to NuclearRechargeCCCodec, + 5055746953759097716L to BossStateCCCodec, + 3317051239895575278L to TankConfigurationCCCodec, + 1838248562944554574L to TankCritCCCodec, + 1767155986856291742L to TankPointersCCCodec, + 5543162332469864498L to TankInfoCCCodec, + 260111248825415414L to BattleBotControlCCCodec, + 2560105521800470759L to RemoteTankStateUpdatingCCCodec, + 4206032257972775630L to TankResistanceCodec, + 7127632667958387441L to TankResistancesCCCodec, + 2104999573658810427L to TankSpawnerCCCodec, + 7163171834328288344L to SpeedCharacteristicsCCCodec, + 2271787261806799336L to SuicideCCCodec, + 2150802556932617880L to TankCCCodec, + 6589716392600418185L to AvailableForAllCCCodec, + 9168562037264832365L to PassToShopCCCodec, + 3122964582367261689L to TemperatureCCCodec, + 3730185794267514852L to GaragePreviewModelCCCodec, + 2769268442698022653L to BuyableCCCodec, + 2114179554921095892L to ItemCategoryCCCodec, + 120961863156462946L to CountableItemCCCodec, + 7391892068905080676L to DelayMountCategoryCCCodec, + 7109632754421804521L to DelayMountCategoryCCCodec, + 7640081207058999117L to DevicePropertiesCCCodec, + 6111098822553419499L to PaCodec, + 4692610703461978415L to ProAbonementRankDiscountCCCodec, + 6430862429652735997L to EmissionColorCCCodec, + 1534251830977989099L to EmissionColorCCCodec, + 1865478986390468300L to GroupedCCCodec, + 658797348514407988L to ItemModelCCCodec, + 3438505192580052999L to ItemModelCCCodec, + 7472019549033825785L to Item3DCCCodec, + 5219530271535770658L to GarageKitCCCodec, + 4309274349580876968L to ItemSaleByKitCCCodec, + 2494628067134376039L to ModificationCCCodec, + 4245000165576407500L to Object3DSCCCodec, + 1139677084511624062L to PremiumItemCCCodec, + 8153652471440648359L to RelativePropertiesCCCodec, + 5724298620794499870L to MountedResistancesCCCodec, + 6628468327090974523L to ResistanceBackgroundCCCodec, + 712090483864327130L to HullSkinModelCCCodec, + 5738770490413536673L to TankPartSkinModelCCCodec, + 481504601146841174L to TankPartSkinModelCCCodec, + 4234781414353452329L to TurretSkinModelCCCodec, + 3893855999545616334L to TemporaryItemCCCodec, + 4743567393313674375L to UpgradeParamsCCCodec, + 6117306895090150422L to ItemViewCategoryCCCodec, + 4817031001612283794L to ProtectionSlotsCCCodec, + 2433120830275396692L to PresentsCCCodec, + 5988756521593027564L to DwCodec, + 7563487786199453443L to OverdriveDescriptionCCCodec, + 149643551432886459L to TurretMechanismCCCodec, + 905970599512839002L to MountedSkinCCCodec, + 834829861153964627L to MountedSkinCCCodec, + 1164458258646872337L to AvailableShotSkinsCCCodec, + 7175193612424807833L to VuCodec, + 4068618447512888231L to ColoringCCCodec, + 5255782026414758079L to BsCodec, + 1259328549938381181L to VoCodec, + 7272122855372520854L to FriendsCCCodec, + 7286757952195114814L to UserContainerCCCodec, + 433350986715773690L to UserContainerCCCodec, + 6666386288157781248L to UserContainerCCCodec, + 6165842138816273510L to UserContainerCCCodec, + 4806152428066355053L to ContainersInfoCCCodec, + 2396069765491056127L to UserReportsModelCCCodec, + 5111180848188020047L to NotificationEnabledCCCodec, + 821863604528384663L to ZnM88693LtCodec, + 2913056477936031270L to BattleInfoCCCodec, + 994751080759166914L to BattleDMInfoCCCodec, + 6282101613166902704L to BattleParamInfoCCCodec, + 6652129902375288094L to TeamBattleInfoCCCodec, + 7185560430911351668L to FormatBattleOptionsCCCodec, + 5412538083071671358L to MapInfoCCCodec, + 104562115846147942L to MatchmakingGroupCCCodec, + 5932347630672640435L to MatchmakingLayoutCCCodec, + 3935107155251354407L to DescriptionModelCCCodec, + 1472449384337994019L to DescriptionModelCCCodec, + 8032192927455575509L to TimePeriodModelCCCodec, + ) +} diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module10283.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module10283.kt index 6c7aa8f..30e833e 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module10283.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module10283.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 上行 108605496059850042|module_10283 data class Up10283On( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module25377.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module25377.kt index 9bc7089..18df07f 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module25377.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module25377.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 上行 2522279596878141909|module_25377 data class Up25377Mn( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module37504.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module37504.kt index fb9db2a..e3a2b40 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module37504.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module37504.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 上行 1923257295373322726|module_37504 data class Up37504Mi( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module47243.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module47243.kt index 2be1e6c..0972f1d 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module47243.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module47243.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 上行 545646835775802391|module_47243 data class Up47243Xd( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module54199.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module54199.kt index f0b92e1..9f6152a 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module54199.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module54199.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 上行 3122753540375943279|module_54199 data class Up54199Nn( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85183.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85183.kt index 13f83d8..23b3992 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85183.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85183.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 上行 242594788112599303|module_85183 data class Up85183GL( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85196.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85196.kt index 5136bfb..685d12e 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85196.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85196.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 上行 3992138268563757275|module_85196 data class Up85196A( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85667.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85667.kt index 6418bf1..ae78815 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85667.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module85667.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 上行 3312562673813486434|module_85667 data class Up85667Hu( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module89803.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module89803.kt index c4d4d29..4a93936 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module89803.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Generated/Uplink/Module89803.kt @@ -11,6 +11,10 @@ import Net.Wire.ModelCodec import Net.Wire.Wire import Net.Wire.ErasedCodec import Net.Protocol.TankStateCodec +import Net.Protocol.LtCodec +import Net.Protocol.PtCodec +import Net.Protocol.ZtCodec +import Net.Protocol.AliasCodec // 上行 1389350490037720721|module_89803 data class Up89803Kr( diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Protocol/Containers.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Protocol/Containers.kt new file mode 100644 index 0000000..aa80a26 --- /dev/null +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Protocol/Containers.kt @@ -0,0 +1,164 @@ +// Containers.kt —— ModelService 4 条容器命令的真实布局 +// +// 依据(逐字节标定过):3DTank/tools/server/container.js + module_29554.js 的 U.u7j: +// _unloadObjects (9038756763225879447) → lt:varint 个数 + 个数 × i64 +// _loadObjectsData (7640916300855664666) → pt:i32 对象数 + 对象表 + i32 项数 + 项表 +// _loadDependencies (3216143066888387731) → zt:i32 X + i32 批次数 + 批次 + i32 项数 + 项表 +// _setModelCommandAlias (8179162314198150518) → i32 alias + i64 + i64 +// +// pt 的每一项:i64 id;id == 0 → 再读 i64 当值;否则 id 是 modelId,就地展开该模型的字段。 +// modelId → codec 由生成的 ModelRegistry.ByModelId 提供。 +package Net.Protocol + +import Core.ByteReader +import Core.ByteWriter +import Core.NullmapCursor +import Core.NullmapWriter +import Core.ProtocolException +import Net.Generated.ModelRegistry +import Net.Wire.ModelCodec + +// ---------------- lt ---------------- +class LtPayload(val Ids: List) + +object LtCodec : ModelCodec { + override fun Decode(R: ByteReader, N: NullmapCursor): LtPayload { + val Count = R.ReadVarint() + if (Count < 0 || Count > 1 shl 20) throw ProtocolException("lt 个数不合法:$Count") + val Ids = ArrayList(Count) + repeat(Count) { Ids.add(R.ReadLong()) } + return LtPayload(Ids) + } + + override fun Encode(W: ByteWriter, N: NullmapWriter, V: LtPayload) { + W.WriteVarint(V.Ids.size) + for (Id in V.Ids) W.WriteLong(Id) + } +} + +// ---------------- pt ---------------- +class PtObject(val ObjectId: Long, val GameTypeId: Long) +class PtItem(val Id: Long, val Value: Any) +class PtPayload(val Objects: List, val Items: List) + +object PtCodec : ModelCodec { + override fun Decode(R: ByteReader, N: NullmapCursor): PtPayload { + val CObjects = R.ReadInt() + if (CObjects < 0 || CObjects > 1 shl 20) throw ProtocolException("pt 对象数不合法:$CObjects") + val Objects = ArrayList(CObjects) + repeat(CObjects) { Objects.add(PtObject(R.ReadLong(), R.ReadLong())) } + + val CItems = R.ReadInt() + if (CItems < 0 || CItems > 1 shl 20) throw ProtocolException("pt 项数不合法:$CItems") + val Items = ArrayList(CItems) + repeat(CItems) { + val Id = R.ReadLong() + if (Id == 0L) { + Items.add(PtItem(Id, R.ReadLong())) + } else { + val Codec = ModelRegistry.ByModelId[Id] + ?: throw ProtocolException("pt 项 modelId=$Id 没有 codec") + Items.add(PtItem(Id, Codec.DecodeAny(R, N))) + } + } + return PtPayload(Objects, Items) + } + + override fun Encode(W: ByteWriter, N: NullmapWriter, V: PtPayload) { + W.WriteInt(V.Objects.size) + for (O in V.Objects) { + W.WriteLong(O.ObjectId) + W.WriteLong(O.GameTypeId) + } + W.WriteInt(V.Items.size) + for (Item in V.Items) { + W.WriteLong(Item.Id) + if (Item.Id == 0L) { + W.WriteLong(Item.Value as Long) + } else { + val Codec = ModelRegistry.ByModelId[Item.Id] + ?: throw ProtocolException("pt 项 modelId=${Item.Id} 没有 codec") + Codec.EncodeAny(W, N, Item.Value) + } + } + } +} + +// ---------------- zt ---------------- +class ZtBatch(val ObjectId: Long, val ModelIds: List) +class ZtItem( + val R: Long, + val E: Short, + val U: Short, + val S: Long, + val O: Byte, + val Skipped: List, +) +class ZtPayload(val X: Int, val Batches: List, val Items: List) + +object ZtCodec : ModelCodec { + override fun Decode(R: ByteReader, N: NullmapCursor): ZtPayload { + val X = R.ReadInt() + val CBatches = R.ReadInt() + if (CBatches < 0 || CBatches > 1 shl 20) throw ProtocolException("zt 批次数不合法:$CBatches") + val Batches = ArrayList(CBatches) + repeat(CBatches) { + val ObjectId = R.ReadLong() + val Count = R.ReadInt() + if (Count < 0 || Count > 1 shl 20) throw ProtocolException("zt 批次 modelId 数不合法:$Count") + val Ids = ArrayList(Count) + repeat(Count) { Ids.add(R.ReadLong()) } + Batches.add(ZtBatch(ObjectId, Ids)) + } + val CItems = R.ReadInt() + if (CItems < 0 || CItems > 1 shl 20) throw ProtocolException("zt 项数不合法:$CItems") + val Items = ArrayList(CItems) + repeat(CItems) { + val R0 = R.ReadLong() + val E = R.ReadShort() + val U = R.ReadShort() + val S = R.ReadLong() + val O = R.ReadByte() + val Skip = R.ReadByte().toInt() + if (Skip < 0) throw ProtocolException("zt 跳过个数不合法:$Skip") + val Skipped = ArrayList(Skip) + repeat(Skip) { Skipped.add(R.ReadLong()) } + Items.add(ZtItem(R0, E, U, S, O, Skipped)) + } + return ZtPayload(X, Batches, Items) + } + + override fun Encode(W: ByteWriter, N: NullmapWriter, V: ZtPayload) { + W.WriteInt(V.X) + W.WriteInt(V.Batches.size) + for (B in V.Batches) { + W.WriteLong(B.ObjectId) + W.WriteInt(B.ModelIds.size) + for (Id in B.ModelIds) W.WriteLong(Id) + } + W.WriteInt(V.Items.size) + for (Item in V.Items) { + W.WriteLong(Item.R) + W.WriteShort(Item.E.toInt()) + W.WriteShort(Item.U.toInt()) + W.WriteLong(Item.S) + W.WriteByte(Item.O.toInt()) + W.WriteByte(Item.Skipped.size) + for (Id in Item.Skipped) W.WriteLong(Id) + } + } +} + +// ---------------- alias ---------------- +class AliasPayload(val Alias: Int, val A: Long, val B: Long) + +object AliasCodec : ModelCodec { + override fun Decode(R: ByteReader, N: NullmapCursor): AliasPayload = + AliasPayload(R.ReadInt(), R.ReadLong(), R.ReadLong()) + + override fun Encode(W: ByteWriter, N: NullmapWriter, V: AliasPayload) { + W.WriteInt(V.Alias) + W.WriteLong(V.A) + W.WriteLong(V.B) + } +} diff --git a/TankiOffline/net/src/jsMain/kotlin/Net/Protocol/SpaceFrame.kt b/TankiOffline/net/src/jsMain/kotlin/Net/Protocol/SpaceFrame.kt index b4d60fb..832f723 100644 --- a/TankiOffline/net/src/jsMain/kotlin/Net/Protocol/SpaceFrame.kt +++ b/TankiOffline/net/src/jsMain/kotlin/Net/Protocol/SpaceFrame.kt @@ -33,7 +33,14 @@ class DecodeBodyResult( object SpaceFrame { - fun DecodeBody(Body: ByteArray, Registry: Map): DecodeBodyResult { + // _setModelCommandAlias 的 methodId:解码到它时把「别名 → (objectId, methodId)」写进会话表 + private const val AliasMethodId = 8179162314198150518L + + fun DecodeBody( + Body: ByteArray, + Registry: Map, + Aliases: MutableMap>? = null, + ): DecodeBodyResult { val Records = ArrayList() val Unknown = ArrayList() var ShortCount = 0 @@ -45,19 +52,26 @@ object SpaceFrame { val R = ByteReader(Body, NullmapSize) while (R.Remaining > 0) { val Form = Cursor.ReadBit() - if (Form) { - // 短命令:后面还有 1 字节别名 + 未知长度负载,S2 不猜,停在第一条短命令 - ShortCount++ - break - } val ObjectId: Long val MethodId: Long - try { - ObjectId = R.ReadLong() - MethodId = R.ReadLong() - } catch (E: Throwable) { - // 不是空间帧(常见于入口/登录帧),或帧体在记录头处截断:如实中止 - return DecodeBodyResult(Records, ShortCount, Unknown, "记录头截断:${E.message}") + if (Form) { + // 短命令:1 字节别名 → 会话别名表;表里没有就如实停下(不猜) + val Alias = R.ReadByte().toInt() and 0xff + val Entry = Aliases?.get(Alias) + if (Entry == null) { + ShortCount++ + break + } + ObjectId = Entry.first + MethodId = Entry.second + } else { + try { + ObjectId = R.ReadLong() + MethodId = R.ReadLong() + } catch (E: Throwable) { + // 不是空间帧(常见于入口/登录帧),或帧体在记录头处截断:如实中止 + return DecodeBodyResult(Records, ShortCount, Unknown, "记录头截断:${E.message}") + } } val Codec = Registry[MethodId] if (Codec == null) { @@ -81,6 +95,9 @@ object SpaceFrame { "methodId=$MethodId 回编码失败:${E.message}") } Records.add(DecodedRecord(ObjectId, MethodId, Value, Payload, W.ToByteArray())) + if (MethodId == AliasMethodId && Value is AliasPayload) { + Aliases?.set(Value.Alias and 0xff, Value.A to Value.B) + } } return DecodeBodyResult(Records, ShortCount, Unknown, null) } diff --git a/TankiOffline/tools/GenerateProtocol.py b/TankiOffline/tools/GenerateProtocol.py index 617771c..cda2afb 100644 --- a/TankiOffline/tools/GenerateProtocol.py +++ b/TankiOffline/tools/GenerateProtocol.py @@ -28,6 +28,15 @@ OUT = ROOT / "net" / "src" / "jsMain" / "kotlin" / "Net" / "Generated" # 这些 codec 的线形不能由字段表直译,改由 Net/Protocol 下手写(数据类仍由生成器产出)。 # module_85183::jq = TankState 的「字段表版」;真正上线的是 module_87072 注册的 T5(23 字节位打包) OVERLAY_CODECS = {"module_85183::jq"} +OVERLAY_NAMES = {"module_85183::jq": "TankStateCodec"} + +# ModelService 的 4 条容器命令:布局由 Net/Protocol/Containers.kt 手写,直接覆盖注册表 +REGISTRY_OVERRIDES = { + "9038756763225879447": "LtCodec", # _unloadObjects + "7640916300855664666": "PtCodec", # _loadObjectsData + "3216143066888387731": "ZtCodec", # _loadDependencies + "8179162314198150518": "AliasCodec", # _setModelCommandAlias +} PRIMS = { "bool": ("Boolean", "R.ReadBool()", "W.WriteBool({})"), @@ -349,7 +358,8 @@ def Main(): "import Core.ByteReader\nimport Core.ByteWriter\nimport Core.NullmapCursor\n" "import Core.NullmapWriter\nimport Core.Vector3\n" "import Net.Wire.ModelCodec\nimport Net.Wire.Wire\nimport Net.Wire.ErasedCodec\n" - "import Net.Protocol.TankStateCodec\n\n") + "import Net.Protocol.TankStateCodec\nimport Net.Protocol.LtCodec\n" + "import Net.Protocol.PtCodec\nimport Net.Protocol.ZtCodec\nimport Net.Protocol.AliasCodec\n\n") def EmitClass(Def: ClassDef, Nodes): Names = UniqueFieldNames(Def.Fields) @@ -409,17 +419,40 @@ def Main(): Lines = [f"object {Title} {{", " val ByMethodId: Map = mapOf("] Seen = set() for Mid, Name in Entries: - if Name not in Emitted or Mid in Seen: + if Name not in Emitted or Mid in Seen or Mid in REGISTRY_OVERRIDES: continue Seen.add(Mid) Lines.append(f" {Mid}L to {Name}Codec,") + if Title == "DownlinkRegistry": + for Mid, Expr in REGISTRY_OVERRIDES.items(): + Lines.append(f" {Mid}L to {Expr},") + Lines.append(" )") + Lines.append("}") + return Lines + + def RegistryWithModelIds(ResolvedMap, NameMap): + Lines = ["object ModelRegistry {", " val ByModelId: Map = mapOf("] + Seen = set() + for Key, (Def, Nodes) in ResolvedMap.items(): + C = Codecs[Key] + Expr = OVERLAY_NAMES.get(Key, NameMap[Key] + "Codec") + Ids = [] + if C.get("ModelId"): + Ids.append(str(C["ModelId"])) + Ids += [str(M) for M in (C.get("ModelIds") or [])] + for Mid in Ids: + if Mid in Seen: + continue + Seen.add(Mid) + Lines.append(f" {Mid}L to {Expr},") Lines.append(" )") Lines.append("}") return Lines (OUT / "Registry.kt").write_text( Header + "\n".join(Registry(DownRegistry, "DownlinkRegistry")) + "\n\n" + - "\n".join(Registry(UpRegistry, "UplinkRegistry")) + "\n", "utf-8") + "\n".join(Registry(UpRegistry, "UplinkRegistry")) + "\n\n" + + "\n".join(RegistryWithModelIds(Resolved, CodecKeyToName)) + "\n", "utf-8") # ---------- 6. 元数据 ---------- def MetaEntry(Def: ClassDef, Nodes):