feat(session): 静态解析 modelId 注册表,补齐大厅容器模型名

This commit is contained in:
TermiNexus committed 2026-10-25 00:16:33 +08:00
1 parent 87539a9645
commit b8fb22f401
6 files changed
+2712

No files matched your search

+12
View File
@@ -476,6 +476,18 @@
说明现有 modelId→codec 绑定只覆盖 363 个模型;需要补「modelId → 模块/类」的运行时注册表,
才能把大厅容器的模型路由进状态层。当前 `RunSessionTest.ps1` 只断言「会话解码 + 回编码」,
路由计数(已派发/未覆盖)作为诊断输出。
- modelId 注册表(继续补):
- 新增 `tools/gen_model_registry.js`:静态解析各模块构造函数里的
`this.<slot> = new X(lo, hi)` + `ModelReg.n7o(this.<slot>, … new W(b(ModelClass), …))`,
得到 **362 个 modelId**(361 个解析出语义名,如 `ItemCategoryCC` / `BuyableCC` / `UserPropertiesCC`)。
产物:`names/model_registry.json` + `App/State/ModelRegistry.kt`(`ModelNamesByModelId`)。
- `SessionRouter` 把它用于诊断:`RunSessionTest.ps1` 现在会打印「未覆盖协议模型」TOP。
抓包实测:`plain` 目录前 8000 个 s2c 里未覆盖的主要是
`ItemCategoryCC×1918`、`DescriptionModelCC×1883`、`BuyableCC×1879`、`TimePeriodModelCC×1879`、
`ItemModelCC×1879`、`ItemRarityCC×1879`、`PremiumItemCC×1879`、`ItemViewCategoryCC×1879`
—— 即车库 / 商店的物品配置容器,不是用户属性。
- 下一步:给这 8 个 CC 写「CC → 动作」适配器(原包在 module_47243 的模型层里聚合后派发),
用户属性那条链路(`UserPropertiesCC` → `SetUserPropertiesAction`)已经可用。
- 委派表里的已知形态:`shop` / `home` / `localBattleUserState` / `partner` 是内联 IIFE,
已按字段具名为 `(inline@<field>)` 并从函数体抓到顶层动作名(69 / 1 / 2 / 11 个);
`launchParams` 是纯透传(`(pass-through)`,无 reducer),已把字段收口为 `Map<String, String>`。
File diff suppressed because it is too large. Load diff
+135
View File
@@ -0,0 +1,135 @@
// gen_model_registry.js —— 静态解析「modelId → 模块 / 模型类 / 语义名」
//
// 问题:names/model_binding.json 只有 363 条,且抓包 Pt 容器里的 modelId 大多不在里面
// (那批只覆盖了「运行时 dump 到的 codec」)。但客户端在每个模块的构造函数里都会调用
// `ModelReg.n7o(modelId, codec)` 注册模型,注册点本身就带模块与模型类,可以静态挖出来。
//
// 形态(module_10283 例):
// (this.vgw_1 = new R(-1339607649, 1825012020)),
// Rt(this).n7o(this.vgw_1, At(this).r7g(new p(b(Mt), !1)))
// → modelId = (hi << 32) | (lo & 0xffffffff),lo 在前、hi 在后(按无符号 lo 处理)
// → 模块 = 文件,模型类 = `b(<Class>)` 里的 Class
// → 语义名 = codec_fields.json 里同模块、ModelClassLocal 相同的 codec 的 ModelName
//
// 输出:names/model_registry.json
// { Note, Count, WithName, Rows: [{ ModelId, Module, ModelClass, ModelName }] }
//
// 用法:cd 3DTank/tools && node gen_model_registry.js
'use strict';
const fs = require('fs');
const path = require('path');
const P = path.resolve(__dirname, '..');
const SrcDir = path.join(P, 'src');
const Names = path.join(P, 'names');
const Codecs = JSON.parse(fs.readFileSync(path.join(Names, 'codec_fields.json'), 'utf8')).Codecs;
// module -> (ModelClassLocal -> ModelName[])
const NameByModuleClass = new Map();
for (const C of Object.values(Codecs)) {
if (!C.ModelClassLocal) continue;
const Key = C.Module + '::' + C.ModelClassLocal;
if (!NameByModuleClass.has(Key)) NameByModuleClass.set(Key, new Set());
if (C.ModelName) NameByModuleClass.get(Key).add(C.ModelName);
}
function ReadParen(S, Start) {
let D = 0, I = Start;
for (; I < S.length; I++) {
if (S[I] === '(') D++;
else if (S[I] === ')') { D--; if (!D) { I++; break; } }
}
return S.slice(Start, I);
}
function ModelIdOf(Hi, Lo) {
const H = BigInt(Hi);
const L = BigInt.asUintN(32, BigInt(Lo));
return BigInt.asIntN(64, (H << 32n) | L).toString();
}
const Rows = [];
const Files = fs.readdirSync(SrcDir).filter((F) => /^module_\d+\.js$/.test(F)).sort();
for (const F of Files) {
const Module = F.replace(/\.js$/, '');
const S = fs.readFileSync(path.join(SrcDir, F), 'utf8');
const Re = /n7o\(\s*this\.(\w+)\s*,/g;
let M;
while ((M = Re.exec(S))) {
const Slot = M[1];
const Asg = new RegExp('this\\.' + Slot + '\\s*=\\s*new\\s+[\\w$]+').exec(S);
if (!Asg) continue;
const CallStart = S.indexOf('(', Asg.index + Asg[0].length);
const Call = ReadParen(S, CallStart);
const Args = Call.slice(1, -1).split(',').map((X) => X.trim());
if (Args.length !== 2 || !/^-?\d+$/.test(Args[0]) || !/^-?\d+$/.test(Args[1])) continue;
const ModelId = ModelIdOf(Number(Args[1]), Number(Args[0]));
// 注册表达式尾部:取到本行结束,抓 `(<Class>)` 作为模型类
const LineEnd = S.indexOf('\n', M.index);
const Tail = S.slice(M.index, LineEnd < 0 ? S.length : LineEnd);
const ClassMatch = /\(\s*([\w$]+)\s*\)\s*,\s*!?[01]/.exec(Tail);
const ModelClass = ClassMatch ? ClassMatch[1] : null;
const NamesSet = ModelClass ? NameByModuleClass.get(Module + '::' + ModelClass) : null;
let ModelName = null;
if (NamesSet && NamesSet.size) {
const Arr = [...NamesSet];
ModelName = Arr.find((N) => N !== ModelClass) || Arr[0];
}
Rows.push({ ModelId, Module, ModelClass, ModelName });
}
}
const Seen = new Set();
const Unique = [];
for (const R of Rows) {
if (Seen.has(R.ModelId)) continue;
Seen.add(R.ModelId);
Unique.push(R);
}
fs.writeFileSync(
path.join(Names, 'model_registry.json'),
JSON.stringify(
{
Note:
'静态解析的 modelId → 模块 / 模型类 / 语义名。来源:各模块构造函数里的 `ModelReg.n7o(modelId, codec)` ' +
'注册点 + `this.<slot> = new X(lo, hi)` 的 64 位常量;语义名同模块的 ModelClassLocal 反查 codec_fields.json。',
Source: ['src/*.js', 'codec_fields.json'],
Count: Unique.length,
WithName: Unique.filter((R) => R.ModelName).length,
Rows: Unique,
},
null,
1,
),
'utf8',
);
// ---------------------------------------------------------------- Kotlin 表(诊断 + 适配器用)
const KotlinPath = path.resolve(P, '..', 'TankiOffline', 'app', 'src', 'jsMain', 'kotlin', 'App', 'State', 'ModelRegistry.kt');
const Lines = [];
Lines.push('// ModelRegistry.kt —— modelId → 协议模型名(生成物,不要手改)');
Lines.push('//');
Lines.push('// 由 3DTank/tools/gen_model_registry.js 静态解析各模块的 ModelReg 注册点得到:');
Lines.push('// this.<slot> = new X(lo, hi) + n7o(this.<slot>, ... new W(b(ModelClass), ...))');
Lines.push('// 语义名来自 codec_fields.json 里同模块、ModelClassLocal 相同的 codec 的 ModelName。');
Lines.push('package App.State');
Lines.push('');
Lines.push('/** modelId → 协议模型名(未解析出语义名的条目不在表里)。 */');
Lines.push('val ModelNamesByModelId: Map<Long, String> = mapOf(');
for (const R of Unique) {
if (!R.ModelName) continue;
Lines.push(' ' + R.ModelId + 'L to ' + JSON.stringify(R.ModelName) + ',');
}
Lines.push(')');
Lines.push('');
fs.writeFileSync(KotlinPath, Lines.join('\n'), 'utf8');
console.log('Kotlin: ' + KotlinPath);
console.log(
`modelId ${Unique.length} 个(注册点 ${Rows.length} 个),其中 ${Unique.filter((R) => R.ModelName).length} 个解析出语义名。`,
);
@@ -101,6 +101,10 @@ object SessionCheck {
println("文件 $Frames|记录 $Records|回编码一致 $Ok|不一致 $Bad|记录头截断 $HeaderErrors|其它错误 $Errors|别名表=${Session.AliasCount}")
println("路由:已派发 ${Router.Applied}|未覆盖 ${Router.Unmapped}|失败 ${Router.Failed}|用户=${Router.Store.State.User.Uid}|屏幕=${Router.Store.State.Screen.Current}")
val TopModels = Router.UnmappedModels.entries.sortedByDescending { it.value }.take(8)
if (TopModels.isNotEmpty()) {
println("未覆盖协议模型:" + TopModels.joinToString(",") { "${it.key}×${it.value}" })
}
val TopUnmapped = Router.UnmappedIds.entries.sortedByDescending { it.value }.take(6)
if (TopUnmapped.isNotEmpty()) {
println("未覆盖 id:" + TopUnmapped.joinToString(",") { "${it.key}×${it.value}" })
@@ -6,6 +6,7 @@ package App.Session
import App.State.DownlinkActions
import App.State.DownlinkModelActions
import App.State.ModelNamesByModelId
import App.State.ReduceRoot
import App.State.RootState
import Net.Protocol.DecodedRecord
@@ -26,6 +27,9 @@ class SessionRouter(InitialState: RootState = RootState()) {
/** 未覆盖的 id(methodId 或 Pt item modelId)计数,自检时打印头部。 */
val UnmappedIds: MutableMap<Long, Int> = LinkedHashMap()
/** 未覆盖的协议模型名计数(model_registry 能解析出名字的部分)。 */
val UnmappedModels: MutableMap<String, Int> = LinkedHashMap()
/** 已应用动作的类名(调试 / 自检用)。 */
val AppliedNames: MutableList<String> = ArrayList()
@@ -40,6 +44,9 @@ class SessionRouter(InitialState: RootState = RootState()) {
if (MakeModel == null) {
Unmapped++
UnmappedIds[Item.Id] = (UnmappedIds[Item.Id] ?: 0) + 1
ModelNamesByModelId[Item.Id]?.let { Name ->
UnmappedModels[Name] = (UnmappedModels[Name] ?: 0) + 1
}
continue
}
try {
@@ -0,0 +1,371 @@
// ModelRegistry.kt —— modelId → 协议模型名(生成物,不要手改)
//
// 由 3DTank/tools/gen_model_registry.js 静态解析各模块的 ModelReg 注册点得到:
// this.<slot> = new X(lo, hi) + n7o(this.<slot>, ... new W(b(ModelClass), ...))
// 语义名来自 codec_fields.json 里同模块、ModelClassLocal 相同的 codec 的 ModelName。
package App.State
/** modelId → 协议模型名(未解析出语义名的条目不在表里)。 */
val ModelNamesByModelId: Map<Long, String> = mapOf(
3000206000964343740L to "FacebookPaymentCC",
7245225301789542308L to "SonyProductToItemIdMapCC",
7838366943662257567L to "AntiAddictionRealNameValidatorModelCC",
6791702738669939115L to "LoaderBackgroundModelCC",
4065909569861626318L to "ServerHaltEntranceCC",
466296741210741928L to "ExternalEntranceCC",
9117714962311439886L to "InviteEntranceCC",
5457907984000701384L to "NotificationsByCountryModelCC",
513176302374590130L to "CompositePartnerCC",
2474458842977623992L to "RegistrationModelCC",
7300500077035374704L to "EntranceResourcesCC",
6403067749608679876L to "UserNotifierCC",
1850509145998626828L to "UserActionsLoggerCC",
1298753286651761171L to "PremiumNotifierCC",
258682513334072065L to "RankNotifierData",
4255726087158005051L to "UidNotifierData",
3527205014716342329L to "RankLoaderCC",
6627517808336136295L to "UidCheckCC",
216902005816818019L to "SpectatorsModelCC",
2085529474881905981L to "StatisticsModelCC",
2472262160204144219L to "StatisticsDMCC",
787936358514072261L to "StatisticsTeamCC",
871785774630866042L to "ContainerCC",
6768558945605412944L to "ContainerCC",
8115862559097350286L to "ClanFriendsCC",
7076997842038370798L to "ClanMembersCC",
3413041240691998182L to "ClanIncomingCC",
6220257539261493170L to "ContainerCC",
8762499949521628954L to "ClanInfoCC",
6048708024205731750L to "ClanOutgoingCC",
6882547137659234022L to "ClanPermissionsCC",
8495889215182031654L to "LicenseClanUserCC",
7949064601138261608L to "ClanNotifierData",
2547093126916834195L to "ClanEditPriceCC",
6247612331185889342L to "ClanLoadingPanelCC",
2606798949852309286L to "ClanPanelNotificationCC",
6042266992054445914L to "ClanCreateCC",
1115275516484037832L to "ClanUserCC",
2023935033691193766L to "ContainerCC",
5297988375509642470L to "ContainerCC",
4813819753066546054L to "ContainerCC",
649690707811173020L to "ContainerCC",
881620222948704326L to "ContainerCC",
1986821874929333245L to "UserAccountRemovalModelCC",
7588919819099098108L to "BattleInviteCC",
2855626038259597130L to "BattlePassPurchaseNotifierCC",
7805766859473669177L to "ChallengeClientCC",
8677996546985988365L to "StarsInfoCC",
1987602940683756146L to "CoinInfoCC",
3349786357139026014L to "ContractUserModelCC",
6514486185481319524L to "CreatorTagCC",
965113061940997187L to "CreatorTagsCC",
7341286352739641155L to "DebtInfoCC",
3395764563215792356L to "DonationAlertCC",
8464700182634408374L to "UserDroppableGoldSettingsCC",
3503382027414679973L to "TankHasGrenadeCC",
5801057999588514016L to "ResistancesCC",
51703991768325247L to "SaleByShopCC",
7822174537018024954L to "GSWarningInfoModelCC",
3152693668290247629L to "IconsProviderCC",
6726403008449784914L to "KeysInfoCC",
1417398836682569292L to "PaymentCC",
1009501302658881534L to "PaymentLoaderCC",
4748522118519647527L to "PayModeCC",
6820688895043695030L to "AndroidPayCC",
5156898764211343104L to "AppleAppStoreCC",
6144768774251946863L to "BottomDescriptionCC",
8083057704493864984L to "PayGardenPaymentCC",
4905763060352702216L to "PayPalPayModelCC",
7860106430129114440L to "RuStorePayCC",
3158124838791669092L to "PaymentButtonCC",
3620520388804703780L to "PeriodicRewardCC",
7307951074626252633L to "PresentsSettingsCC",
9028066746998427457L to "PaidRenameCC",
3179861497615625536L to "UserEmailCC",
1893408944113965505L to "UserPropertiesCC",
5780017129265868734L to "ProfileVisibilityModelCC",
9006361281849290638L to "UserPushNotificationSettingsModelCC",
5895522515282663537L to "UserAchievementCC",
7105110962241677955L to "MainQuestUserModelCC",
5167916989664044333L to "ReferralEventUserModelCC",
462434031489766566L to "QuestCategoriesModelCC",
6966229709169193455L to "RewardedVideosCC",
2767408225195389970L to "RubyInfoCC",
1456475022890566348L to "RulesUpdateShowingCC",
3189656422709297036L to "ItemsPackageCC",
3714146481313901316L to "ShopCardCC",
5172585086901412996L to "ShopCardDiscountCC",
5817682208733860186L to "ShowcaseViewCC",
1535852183188388854L to "BattlePassPackageCC",
889485403566576664L to "KitBundleViewCC",
4186634155763928467L to "CoinPackageCC",
6484910309342792771L to "ContractShopCC",
2789386002514731022L to "CrystalPackageCC",
7810820263988615290L to "ShopItemAdditionalDescriptionCC",
8458424802385151068L to "ShopDiscountCC",
6744857484209767976L to "EmailRequiredCC",
8853923292505519798L to "RestrictionByPayModeCC",
6091707767266836975L to "ShopItemFeaturingCC",
806128205466208462L to "GoldBoxPackageCC",
6395651505226788750L to "GoodsCC",
7786222713213880898L to "GoodsCC",
7935550480449821024L to "IndemnityCC",
8629995567796005946L to "KeysPackageCC",
2103303438297476110L to "KitPackageCC",
3985896237583754666L to "KitViewResourceCC",
4440355418204561498L to "KitViewResourceLocalizedCC",
8755539534673619516L to "LootBoxPackageCC",
5004566952388327414L to "LootboxAndPaintCC",
7949842549440362353L to "ShopItemOneTimePurchaseCC",
6841476710481576918L to "ShopItemOneTimePurchaseCC",
7881181052304665842L to "PaintPackageCC",
5138794050233567698L to "PremiumPackageCC",
693025797100292228L to "ShopItemCC",
8048067679617995470L to "ShopCategoryCC",
4268132139764766386L to "ShopItemCategoryCC",
6192892501890483066L to "SpecialKitPackageCC",
6899642532024252493L to "SingleItemKitViewCC",
1036461397335537760L to "StarsPackageCC",
2168011188167752629L to "ContextTutorialModelCC",
4782427880403395260L to "LobbyTutorialModelCC",
5256681735304582291L to "TwitchAccountModelCC",
2252704231082045810L to "TwoStepVerificationModelCC",
2080556892932195426L to "UserCountryCC",
1851605205665890036L to "RewardsInfoCC",
6071565290933648049L to "ChatCC",
891137447706578619L to "ClanChatCC",
868364325972433765L to "NewsShowingCC",
6359692933626160397L to "SocialNetworkParametersCC",
7762582768388221832L to "FlagBattleSFXCC",
7970528904804811572L to "ArmsRaceCC",
7401419333842694749L to "BattlefieldCC",
2101100305743734614L to "BillboardCC",
7267982595724632282L to "BillboardImageCC",
5958419804845264849L to "BotNavigationCC",
2464705242400585109L to "FacilitySphericalZoneCC",
5242494537362061802L to "CommonFacilityCC",
8109298281939714429L to "BattleLockingCC",
9172358609541951983L to "MeteorStormCC",
2057320715890332864L to "BattleMineCC",
8980131978880882207L to "BattleStartDelayCC",
8237913720896985151L to "DominationCC",
5385894712778438726L to "BattleChatCC",
6445399806655453890L to "InventoryCC",
3364392936313775902L to "TargetHighlightingCC",
7874327015886119466L to "JuggernautCC",
5123834867188931684L to "KillStreakCC",
3031864034871022835L to "PointBasedBattleCC",
6169263949965533624L to "AssaultCC",
2648029304025111838L to "CaptureTheFlagCC",
2618111250571302204L to "RugbyCC",
2269636304551395302L to "BallExplosionCC",
6141842138930446750L to "StatusEffectBattleCC",
7295738902766942560L to "TeamJuggernautCC",
9114375113924783411L to "BattleTutorialCC",
2145315487377727727L to "BattlefieldBonusesCC",
5215232257096838692L to "BonusRegionsCC",
3339617300033754420L to "GoldBonusCC",
510571369984788727L to "BattleGoldBonusCC",
8966480724474352542L to "BonusCommonCC",
3305376498517733218L to "NotificationBonusCC",
7484749077586587376L to "BonusLightCC",
5968651969329902265L to "ColorAdjustCC",
1661364280719338177L to "DemomanSfxCC",
1475210252818583689L to "AutoSupplyRestrictionCC",
8316165996190533130L to "DroneIndicatorCC",
4553925959338838726L to "CrisisEffectCC",
6424605984954645392L to "TankEffectSFXCC",
8166810800706377715L to "ActiveAfterDeathCC",
5779075235189237790L to "EffectDescriptionCC",
8659306545527654916L to "DurationCC",
3157947224668485277L to "EffectLevelCC",
2078544146946392301L to "GrenadeCC",
9169475278259220023L to "GrenadeCommonSFXCC",
8082047509383246662L to "BazookaExplosionCC",
6729312304988255776L to "FoamBazookaCC",
2046257084008991040L to "MagnetBazookaCC",
2360640997000854496L to "RepairGrenadeCC",
9121776538033375678L to "SmokeBazookaCC",
1219567052273540192L to "TeleportBazookaCC",
3385611214280288146L to "TeslaBazookaCC",
7336962025965257296L to "HeatTrapBazookaCC",
4985274885530276227L to "InventoryItemCC",
2173939047300893281L to "InventorySfxCC",
4693095212037357021L to "BattleMapCC",
1688856467034284073L to "MapBonusLightCC",
4885574251230758729L to "ModerationToolInteropCC",
3746009188563785369L to "ClassicParachuteCC",
7894174029759745197L to "DroneParachuteCC",
4778752313022424015L to "RadarCC",
8889030940127130747L to "StatusEffectCC",
5215458949573069793L to "SuppliesTutorialModelCC",
3719295044981767592L to "HoverChassisCC",
3535248640055401164L to "TrackedChassisCC",
9175894397021160571L to "HullCommonCC",
8517963146836182364L to "TankExplosionCC",
6638615717159906637L to "TankRankUpEffectCC",
7912514999422640843L to "SimpleArmorCC",
3966050316678844327L to "EngineCC",
4875657231924274329L to "BattleGearScoreCC",
7968893209278436962L to "ColorTransformCC",
1090112775751802907L to "FlameThrowingSFXCC",
844040023906032853L to "FreezeSFXCC",
5745114335268581493L to "IsisSFXCC",
3240562023750085679L to "ClassicRailgunShootSFXCC",
2368553937090306741L to "RailgunShootSFXCC",
5257069799854314780L to "RicochetSFXCC",
9094843804380507187L to "ShaftShootSFXCC",
1748249573394295263L to "SmokyShootSFXCC",
6623392760536649465L to "TeslaShootSFXCC",
8191021443726008799L to "ThunderShootSFXCC",
7692437363459179503L to "TwinsShootSFXCC",
6641568549549264883L to "HullSmokeCC",
2638139599268780529L to "AimAssistCC",
7883218652624289568L to "VerticalAnglesCC",
1237976996871886061L to "WeaponCommonCC",
4444006910106229297L to "FlameThrowerCC",
9105939015977236209L to "FreezeCC",
1782954502314814229L to "GaussCC",
3075844226211230705L to "GaussSFXCC",
7068168268219022867L to "IsisCC",
7266201540452328992L to "LaserPointerCC",
1663344340563853103L to "RailgunCC",
2544465990449691855L to "RicochetCC",
8345039896357067195L to "ScorpioCC",
313670832122918648L to "ScorpioSfxCC",
732152133982227177L to "ShaftCC",
7700337090161867199L to "ShotCC",
2172139419072369403L to "SmokyCC",
2235965200289058033L to "SplashCC",
2057487026153364495L to "StreamWeaponCC",
6855550629220038001L to "TerminatorCC",
6210980129845088505L to "TerminatorSFXCC",
573691036321759779L to "TeslaCC",
5194655544597440038L to "GlobeLightningCC",
1092307613749405757L to "ThunderCC",
1130027771466355435L to "CassetteShootingCC",
8212033390179430143L to "TsunamiCC",
5604117679922858821L to "TsunamiShootSFXCC",
2803166101624878775L to "RotatingTurretCC",
8384919755051909877L to "TwinsCC",
6384655869260380731L to "WeaponWeakeningCC",
6642061974307112160L to "ArtilleryCC",
8754295211549969729L to "ArtilleryElevatingBarrelCC",
4499337062875496540L to "ArtillerySfxCC",
7235761383767133268L to "BonkWeaponCC",
7022952987062772048L to "MachineGunCC",
8784137528831277530L to "MachineGunSFXCC",
4045733714401632272L to "RocketLauncherCC",
6596471917520283782L to "RocketLauncherSfxCC",
6528115483341986769L to "ShotGunAimingCC",
770654516236272028L to "ShotgunSFXCC",
5867914731324680416L to "ShotgunShotCC",
171896995500198357L to "TeamLightCC",
6455142242556985012L to "UltimateCC",
2660691061343351669L to "DeferredOverdriveCC",
1500120709087433677L to "AresUltimateCC",
7899544742191273818L to "AresUltimateProjectileCC",
6210079079280471693L to "CrusaderEffectCC",
3907559303616283277L to "CrusaderUltimateCC",
6590506277285284269L to "DictatorUltimateCC",
6668012086939621459L to "HopperUltimateCC",
7214131179703676563L to "HornetUltimateCC",
920233600808088339L to "BattleUltimateRadarCC",
4406836274649365203L to "HunterUltimateCC",
7257138969919985658L to "TankStunCC",
887431150717814637L to "JuggernautUltimateCC",
1997576349992148053L to "MammothUltimateCC",
4658911146867546991L to "PaladinAuraVisualCC",
973781565169577734L to "TankSuperchargeCC",
8738779591519195597L to "TitanUltimateGeneratorCC",
7551602984488625261L to "VikingUltimateCC",
3137250957878113145L to "WaspUltimateBombCC",
4388979890807820236L to "NuclearRechargeCC",
5055746953759097716L to "BossStateCC",
3317051239895575278L to "TankConfigurationCC",
1838248562944554574L to "TankCritCC",
3248199557469599724L to "DamageIndicatorCC",
1767155986856291742L to "TankPointersCC",
5543162332469864498L to "TankInfoCC",
260111248825415414L to "BattleBotControlCC",
2560105521800470759L to "RemoteTankStateUpdatingCC",
7127632667958387441L to "TankResistancesCC",
2104999573658810427L to "TankSpawnerCC",
7163171834328288344L to "SpeedCharacteristicsCC",
2271787261806799336L to "SuicideCC",
2150802556932617880L to "TankCC",
4206032257972775630L to "TurnOverCC",
6589716392600418185L to "AvailableForAllCC",
9168562037264832365L to "PassToShopCC",
3122964582367261689L to "TemperatureCC",
1259328549938381181L to "UpgradeGarageItemCC",
3730185794267514852L to "GaragePreviewModelCC",
2769268442698022653L to "BuyableCC",
2114179554921095892L to "ItemCategoryCC",
120961863156462946L to "CountableItemCC",
7109632754421804521L to "DelayMountCategoryCC",
5952355564848177159L to "DescriptionMediaCC",
7391892068905080676L to "ItemDevicesCC",
7640081207058999117L to "DevicePropertiesCC",
2951667042968033849L to "DiscountCC",
4692610703461978415L to "ProAbonementRankDiscountCC",
1534251830977989099L to "EmissionColorCC",
6111098822553419499L to "BazookaSupplyCC",
1865478986390468300L to "GroupedCC",
3438505192580052999L to "ItemModelCC",
7472019549033825785L to "Item3DCC",
213661725715747381L to "ItemEnabledForPartnerCC",
5219530271535770658L to "GarageKitCC",
4309274349580876968L to "ItemSaleByKitCC",
2494628067134376039L to "ModificationCC",
6430862429652735997L to "Object3DSCC",
1139677084511624062L to "PremiumItemCC",
4245000165576407500L to "ItemPropertiesCC",
658797348514407988L to "ItemRarityCC",
8153652471440648359L to "RelativePropertiesCC",
5724298620794499870L to "MountedResistancesCC",
6628468327090974523L to "ResistanceBackgroundCC",
712090483864327130L to "HullSkinModelCC",
481504601146841174L to "TankPartSkinModelCC",
4234781414353452329L to "TurretSkinModelCC",
3893855999545616334L to "TemporaryItemCC",
4743567393313674375L to "UpgradeParamsCC",
6117306895090150422L to "ItemViewCategoryCC",
5738770490413536673L to "VisibleCC",
4817031001612283794L to "ProtectionSlotsCC",
701801920209410257L to "UserItemFavoriteCC",
2433120830275396692L to "PresentsCC",
4038465370530850950L to "HullEngineTypeCC",
7563487786199453443L to "OverdriveDescriptionCC",
5988756521593027564L to "RelatedResistanceModuleCC",
149643551432886459L to "TurretMechanismCC",
5207857306014573244L to "AvailableSkinsCC",
905970599512839002L to "MountedSkinCC",
834829861153964627L to "MountedSkinCC",
1164458258646872337L to "AvailableShotSkinsCC",
6680653332718076818L to "SkinPreviewCC",
2108103923322474513L to "CaptchaCC",
7175193612424807833L to "ServerHaltCC",
4068618447512888231L to "ColoringCC",
5255782026414758079L to "LobbyLayoutModelCC",
7272122855372520854L to "FriendsCC",
7286757952195114814L to "UserContainerCC",
433350986715773690L to "UserContainerCC",
6666386288157781248L to "UserContainerCC",
6165842138816273510L to "UserContainerCC",
4806152428066355053L to "ContainersInfoCC",
2396069765491056127L to "UserReportsModelCC",
5111180848188020047L to "NotificationEnabledCC",
2913056477936031270L to "BattleInfoCC",
994751080759166914L to "BattleDMInfoCC",
6282101613166902704L to "BattleParamInfoCC",
6652129902375288094L to "TeamBattleInfoCC",
5413550891500581680L to "ClassicBattleSelectModelCC",
8618289906968528240L to "BattleCreateCC",
7185560430911351668L to "FormatBattleOptionsCC",
5412538083071671358L to "MapInfoCC",
104562115846147942L to "MatchmakingGroupCC",
5932347630672640435L to "MatchmakingLayoutCC",
3935107155251354407L to "DescriptionModelCC",
8032192927455575509L to "TimePeriodModelCC",
)