import { memo, useRef } from "react"; import { Group } from "three"; import { correctZYTuple } from "../core/blitz/correctZYTuple"; import { nameToArmorId } from "../core/blitzkit/nameToArmorId"; import { resolveArmor } from "../core/blitzkit/resolveThickness"; import { useArmor } from "../hooks/useArmor"; import { DuelModule, useDuel } from "../hooks/useDuel"; import { ModelTankWrapper } from "./ModelTankWrapper"; import { PrimaryArmorSceneComponent } from "./PrimaryArmorSceneComponent"; export const PrimaryArmorScene = memo(() => { const wrapper = useRef(null); const turretContainer = useRef(null!); const gunContainer = useRef(null!); const tank = useDuel("protagonist", DuelModule.Tank); const track = useDuel("protagonist", DuelModule.Track); const turret = useDuel("protagonist", DuelModule.Turret); const gun = useDuel("protagonist", DuelModule.Gun); const armorGltf = useArmor(tank.id).gltf; const armorNodes = Object.values(armorGltf.nodes); const tankModelDefinition = useTankModelDefinition(); const trackModelDefinition = tankModelDefinition.tracks[track.id]; const turretModelDefinition = tankModelDefinition.turrets[turret.id]; const gunModelDefinition = turretModelDefinition.guns[gun.id]; const hullOrigin = correctZYTuple(trackModelDefinition.origin!); const turretOrigin = correctZYTuple(tankModelDefinition.turret_origin!); const gunOrigin = correctZYTuple(turretModelDefinition.gun_origin!); const isDynamicArmorActive = Duel.use((state) => state.protagonist.consumables.includes(73), ); useTankTransform(track, turret, turretContainer, gunContainer); return ( {armorNodes.map((node) => { const isHull = node.name.startsWith("hull_"); const isVisible = isHull; const armorId = nameToArmorId(node.name); const { spaced, thickness } = resolveArmor( tankModelDefinition.armor!, armorId, ); if ( !isVisible || spaced || thickness === undefined || (isDynamicArmorActive && node.name.includes("state_01")) || (!isDynamicArmorActive && node.name.includes("state_00")) ) return null; return ( ); })} {armorNodes.map((node) => { const isCurrentTurret = node.name.startsWith( `turret_${turretModelDefinition.model_id .toString() .padStart(2, "0")}`, ); const isVisible = isCurrentTurret; const armorId = nameToArmorId(node.name); const { spaced, thickness } = resolveArmor( turretModelDefinition.armor!, armorId, ); if ( !isVisible || spaced || thickness === undefined || (isDynamicArmorActive && node.name.includes("state_01")) || (!isDynamicArmorActive && node.name.includes("state_00")) ) return null; return ( ); })} {armorNodes.map((node) => { const isCurrentGun = node.name.startsWith( `gun_${gunModelDefinition.model_id.toString().padStart(2, "0")}`, ); const isVisible = isCurrentGun; const armorId = nameToArmorId(node.name); const { spaced, thickness } = resolveArmor( gunModelDefinition.armor!, armorId, ); if ( !isVisible || spaced || thickness === undefined || (isDynamicArmorActive && node.name.includes("state_01")) || (!isDynamicArmorActive && node.name.includes("state_00")) ) return null; return ( ); })} ); });