From 682f039c6cab1131852e8eddf05676351845014a Mon Sep 17 00:00:00 2001 From: Mark Greene Date: Sun, 1 Nov 2026 14:44:03 +1300 Subject: [PATCH] Fix: Hide unused states of legendary camouflage parts (fixes maus) --- .../blitzkit/api/server/2_camouflageDefinitions.ts | 6 ++---- packages/core/src/types/camouflagesYaml.ts | 12 ++++++++++++ .../[id]/skins/[skin].glb.ts | 5 ++--- .../pages/[...chunk_models_tanks]/[id]/model.glb.ts | 5 ++++- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/core/src/blitzkit/api/server/2_camouflageDefinitions.ts b/packages/core/src/blitzkit/api/server/2_camouflageDefinitions.ts index 4462f1010..88386017f 100644 --- a/packages/core/src/blitzkit/api/server/2_camouflageDefinitions.ts +++ b/packages/core/src/blitzkit/api/server/2_camouflageDefinitions.ts @@ -1,5 +1,6 @@ import { CamouflageDefinitions, + camouflagePreset, Sc2ReadStream, type TankParameters, } from "@blitzkit/core"; @@ -88,10 +89,7 @@ export abstract class ServerBlitzKitAPI2 extends ServerBlitzKitAPI1 { ); const [nation, tankKey] = vehicle.split(":"); - // some unique camos only set the preset for their one tank - const preset = - yamlEntry.preset ?? - yamlEntry.override?.[nation]?.override?.[tankKey]?.preset; + const preset = camouflagePreset(yamlEntry, nation, tankKey); let hasPreset = false; if (preset !== undefined) { diff --git a/packages/core/src/types/camouflagesYaml.ts b/packages/core/src/types/camouflagesYaml.ts index 35d1531ca..5462c945a 100644 --- a/packages/core/src/types/camouflagesYaml.ts +++ b/packages/core/src/types/camouflagesYaml.ts @@ -12,3 +12,15 @@ export type CamouflagesYaml = Record< >; } >; + +// some unique camos only set the preset for their one tank +export function camouflagePreset( + camouflage: CamouflagesYaml[string], + nation: string, + tankKey: string, +) { + return ( + camouflage.preset ?? + camouflage.override?.[nation]?.override?.[tankKey]?.preset + ); +} diff --git a/packages/website/src/pages/[...chunk_models_legendary]/[id]/skins/[skin].glb.ts b/packages/website/src/pages/[...chunk_models_legendary]/[id]/skins/[skin].glb.ts index 00ce9a45d..fc7ea0978 100644 --- a/packages/website/src/pages/[...chunk_models_legendary]/[id]/skins/[skin].glb.ts +++ b/packages/website/src/pages/[...chunk_models_legendary]/[id]/skins/[skin].glb.ts @@ -1,4 +1,5 @@ import { + camouflagePreset, parseHierarchies, Sc2ReadStream, type CamouflagesXml, @@ -73,9 +74,7 @@ export async function GET({ props }: APIContext<{ skin: number }>) { include as { vehicle: { name: string } } ).vehicle.name.split(":"); const { customEntities } = camouflagesYaml[key]; - const preset = - camouflagesYaml[key].preset ?? - camouflagesYaml[key].override?.[nation]?.override?.[tankKey]?.preset; + const preset = camouflagePreset(camouflagesYaml[key], nation, tankKey); const parameters = await vfs.yaml( `Data/3d/Tanks/Parameters/${nation}/${tankKey}.yaml`, ); diff --git a/packages/website/src/pages/[...chunk_models_tanks]/[id]/model.glb.ts b/packages/website/src/pages/[...chunk_models_tanks]/[id]/model.glb.ts index 859f988d6..dbd96721e 100644 --- a/packages/website/src/pages/[...chunk_models_tanks]/[id]/model.glb.ts +++ b/packages/website/src/pages/[...chunk_models_tanks]/[id]/model.glb.ts @@ -209,7 +209,10 @@ export async function extractModel( case "StateSwitcherComponent": node.setExtras({ - state: component[`ssc.state${component["ssc.activeState"]}`], + // a part's scenarios can pick its state as it loads + state: + component[`ssc.state${component["ssc.activeState"]}`] ?? + (isPart ? null : undefined), }); break;