From 1733180f2c4a56fd820f97a5f9ceacc8c6e22e08 Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Tue, 22 Sep 2026 14:52:33 -0500 Subject: [PATCH] oh my god this is hideous --- .../src/types/provisionConsumableScript.ts | 261 +++++++++++++++++- packages/protos/src/blitzkit/script.proto | 43 +-- .../definitions/consumables.pb.ts | 2 +- 3 files changed, 270 insertions(+), 36 deletions(-) diff --git a/packages/core/src/types/provisionConsumableScript.ts b/packages/core/src/types/provisionConsumableScript.ts index bcee09d5f..da58fcd01 100644 --- a/packages/core/src/types/provisionConsumableScript.ts +++ b/packages/core/src/types/provisionConsumableScript.ts @@ -1,10 +1,257 @@ -export type ProvisionConsumableScript = { +interface ProvisionConsumableScript { + attribute?: string; + bonusValues?: BonusValuesClass | string; "#text": string; - - cooldown?: number; + piercingFactors?: PiercingFactors; + modulesHealthFactors?: ModulesHealthFactorsClass | string; + rammingAbsorptionPercent?: number | string; + chancesToHit?: ChancesToHitChancesToHit | string; + largeCaliberHighExplosiveDamageFactor?: number; + largeCaliberHighExplosivePiercingFactor?: number; + maxHpBonusPercent?: number; + modules?: string; + visionRadiusPercentageBonus?: Bonus; + activateWhenStillSec?: number; + activateBonusFactor?: number; + bonus?: Bonus; + bonusPercentage?: BonusPercentage; + enginePowerPercentageBonus?: Bonus; + weight?: number; automatic?: boolean; - - bonusValues?: Record; - attributes?: Record; + cooldown?: number; + duration?: number; + enginePowerIncrease?: number; + rotationSpeedFactor?: number; + fwdSpeedLimitBias?: number; + bkwdSpeedLimitBias?: number; + shotDispersionAngleFactor?: number; + aimingTimeFactor?: number; + clipReloadTimeFactor?: number; + gunReloadTimeFactor?: number; + shieldCoef?: number; + minDamageFactor?: number; + maxDamageFactor?: number; shotEffect?: string; -} & Record; + deactivateStates?: number; + activateStates?: number; + contusionChances?: string; + abortVelocity?: number; + distance?: number; + activationDamageFactor?: number; + damageFactor?: number; + startCooldown?: number; + keepSpoted?: boolean; + conflictExtras?: string; + effectExtraName?: string; + clientEffectVariant?: string; + range?: number; + healthFactor?: number; + burstForce?: number; + damageFactors?: string; + flyTime?: number; + distanceOffset?: number; + timeSeconds?: number; + extrasMustBeStopped?: string; + breakTracks?: boolean; + minAngleDegrees?: number; + maxAngleDegrees?: number; + attributes?: { [key: string]: number }; + acceleration?: number; + burstRange?: number; + burstDamagePercent?: number; + projectileSpeed?: number; + healWaveDelay?: number; + healWavesCount?: number; + healFactorPercent?: number; + selfHealReducePercent?: number; + shieldDuration?: number; + targetExtrasMustBeStopped?: string; + maxHealthSelfDamageFactor?: number; + maxHealthDamageFactor?: number; + disableTracksCollisionDamage?: boolean; + maxHealthDamagePercent?: number; + poisonTicks?: number; + poisonTickDelay?: number; + effectDuration?: number; + radius?: number; + attractorMass?: number; + hpStockPercent?: number; + invisibilityInMovingFactor?: number; + maxBonusSources?: number; + sixthSenseDelay?: number; + stopObservingDelayFactor?: number; + revengeDamagePercentage?: number; + timeForComeBack?: number; + simpleMode?: boolean; + respawns?: Respawns; + curseStrength?: number; + curseReduction?: number; + curseHeal?: number; + explodeDamagePercent?: number; + damageReductionPercent?: number; + respawnBoost?: RespawnBoost; + slowDebuff?: SlowDebuff; + maxHealthFactor?: Bonus; + minRammingDamageMaxHealthRatio?: number; + minRammingDamageCooldown?: number; + optDeviceRammingDamageOverride?: number; +} + +interface Bonus { + lightTank: number; + mediumTank: number; + heavyTank: number; + "AT-SPG": number; + SPG?: number; +} + +interface BonusPercentage { + rotationSpeedFactor?: number; + firmGroundPassabilityIncrease?: number; + softGroundPassabilityIncrease?: number; + mediumGroundPassabilityIncrease?: number; +} + +interface BonusValuesClass { + percent?: number; + value?: number; + projectileSpeedFactor?: number; + piercingPenaltyFactor500m?: number; + circularVisionRadiusIncrease?: number; + upperPitchLimitIncrease?: number; + lowerPitchLimitIncrease?: number; + enginePowerIncrease?: number; + gunReloadSpeedIncrease?: number; + damageReductionPercent?: number; + rammingDamageFactor?: number; + sacrificeLoss?: number; + damagePercentBonus?: number; + enginePowerFactor?: number; + maxVelocityFactor?: number; + terrainResistanceFactor?: number; + chassisHealthFactor?: number; + rotationSpeedFactor?: number; + damageReflectionPercent?: number; + enginePowerAbilityFactor?: number; + speedLimitAbilityBonus?: number; + crewLevelIncrease?: number; + factor?: number; + turretRotationSpeedIncrease?: number; + crewChanceToHitFactor?: number; + repairSpeedIncrease?: number; + fireProtectionIncrease?: number; + explosivesHealthIncrease?: number; + fwdSpeedLimitBias?: number; + bkwdSpeedLimitBias?: number; + lifestealFactor?: number; + lifestealRandomFactor?: number; + killHealFactor?: number; + healFactor?: number; + healRandomFactor?: number; + dealingRammingDamageFactor?: number; + gunReloadingBonus?: number; + gunAimingTimeBonus?: number; + visionRadiusBonus?: number; + shotDispersionAngleFactor?: number; + aimingTimeFactor?: number; + timeBetweenShots?: number; + increasedDamageChance?: number; + increaseDamageFactor?: number; + gunReloadFactor?: number; + commonDamageFactor?: number; + speedLimitsFactor?: number; + maxHealthPercentBonus?: number; + maxStaticsDamagePercent?: number; + chancesToHit?: BonusValuesChancesToHit; + modulesMaxHpFactors?: ModulesMaxHPFactors; + modulesMaxRegenHpFactors?: ModulesMaxHPFactors; + item?: BonusValuesItem[]; +} + +interface BonusValuesChancesToHit { + modules: PurpleModules; +} + +interface PurpleModules { + engineHealth: number; + fuelTankHealth: number; + turretRotatorHealth: number; + surveyingDeviceHealth: number[]; + ammoBayHealth: number; +} + +interface BonusValuesItem { + commonDamageFactor: number; + reloadSpeedFactor: number; +} + +interface ModulesMaxHPFactors { + modules: ModulesMaxHPFactorsModules; +} + +interface ModulesMaxHPFactorsModules { + ammoBayHealth: number; +} + +interface ChancesToHitChancesToHit { + crew: number; + modules: FluffyModules; +} + +interface FluffyModules { + engineHealth: number; + ammoBayHealth: number; + commanderHealth: number; + driverHealth: number; + gunner1Health: number; + gunner2Health: number; + loader1Health: number; + loader2Health: number; +} + +interface ModulesHealthFactorsClass { + modules: ModulesHealthFactorsModules; +} + +interface ModulesHealthFactorsModules { + leftTrackHealth: number; + rightTrackHealth: number; + fuelTankHealth: number; + ammoBayHealth: number; +} + +interface PiercingFactors { + ARMOR_PIERCING: number; + HOLLOW_CHARGE: number; + HIGH_EXPLOSIVE: number; + ARMOR_PIERCING_HE: number; + ARMOR_PIERCING_CR: number; +} + +interface RespawnBoost { + duration: number; + enginePowerFactor: number; + speedLimitAbilityBonus: number; +} + +interface Respawns { + respawn: Respawn[]; +} + +interface Respawn { + respawnIndex: number; + bonusDamage: number; + bonusReloadSpeed: number; + bonusMaxSpeed: number; + bonusEnginePower: number; +} + +interface SlowDebuff { + item: SlowDebuffItem[]; +} + +interface SlowDebuffItem { + duration: number; + enginePowerFactor: Bonus; + speedLimitsFactor: Bonus; +} diff --git a/packages/protos/src/blitzkit/script.proto b/packages/protos/src/blitzkit/script.proto index ff7893848..12b941a9d 100644 --- a/packages/protos/src/blitzkit/script.proto +++ b/packages/protos/src/blitzkit/script.proto @@ -13,10 +13,15 @@ import "tank_definitions.proto"; message Script { /** * If #text is "StaticFactorDevice", type will be script.attribute, otherwise - * type will assume the value of #text. + * type will assume the value of #text. Same for "StaticAdditiveDevice". */ string type = 1; + optional bool automatic = 2; + optional float cooldown = 3; + optional float duration = 4; + bool keep_spotted = 5; + /** * Bonus values enjoys Record entries from * script.bonusValues. @@ -25,32 +30,14 @@ message Script { * script object. That is, if an entry on the root script object isn't * "attribute", "bonusValues", "#text", etc., it goes in here. Empty strings * values get omitted. + * + * Values from script.visionRadiusPercentageBonus from type CoatedOptics will + * also be merged into here to be consistent with CamouflageNet. God fucking + * damn it Wargaming. + * + * Same goes for all these: + * - enginePowerPercentageBonus + * - visionRadiusPercentageBonus */ - map bonus_values = 2; - - /** - * I thought piercing_factors distinct enough from bonus_values to separate - * them since the keys here are no longer properties of the tank, but - * specific shell types. The keys will be mapped to BlitzKit's ShellType. - */ - map piercing_factors = 3; - - /** - * Same story here, the keys are different. But this time, the values are - * stored deep in script.modulesHealthFactors.modules. Also, all keys end - * with "Health" for no reason like "leftTrackHealth". That will be trimmed. - */ - map module_health_factors = 4; - - /** - * There's chancesToHit.crew and then there's the mapped chancesToHit.modules - * which I plan to merge under this one, flat object. And, once again, all - * keys end with "health" like "driverHealth" so I will sanitize them. - */ - map chances_to_hit = 5; - - /** - * Most sane entry? - */ - map vision_radius_percentage_bonus = 6; + map values = 2; } \ No newline at end of file diff --git a/packages/website/src/pages/[...chunk_api]/definitions/consumables.pb.ts b/packages/website/src/pages/[...chunk_api]/definitions/consumables.pb.ts index dedb3f8f6..c859cdda6 100644 --- a/packages/website/src/pages/[...chunk_api]/definitions/consumables.pb.ts +++ b/packages/website/src/pages/[...chunk_api]/definitions/consumables.pb.ts @@ -47,7 +47,7 @@ export async function GET() { } } - return Response.json(samples); + return Response.json(Object.values(samples)); const definitions = await api.consumables(); const bytes = ConsumableDefinitions.encode(definitions).finish();