From c45af8e1563cf493899ec212c48670e3b64413f6 Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Sun, 17 May 2026 12:56:23 -0500 Subject: [PATCH] equipment data --- packages/closed | 2 +- .../scripts/src/buildCatalogItemAccessor.ts | 8 +++--- packages/website-ue/src/api/abstract.ts | 2 ++ packages/website-ue/src/api/client.ts | 27 ++++++++++++++----- packages/website-ue/src/api/server.ts | 20 ++++++++++++++ .../components/TankopediaLoadout/index.tsx | 12 ++++----- packages/website-ue/src/hooks/useEquipment.ts | 26 ++++++++---------- .../website-ue/src/pages/api/equipment.pb.ts | 7 +++++ 8 files changed, 70 insertions(+), 34 deletions(-) create mode 100644 packages/website-ue/src/pages/api/equipment.pb.ts diff --git a/packages/closed b/packages/closed index ea13d6f19..c2175a152 160000 --- a/packages/closed +++ b/packages/closed @@ -1 +1 @@ -Subproject commit ea13d6f193d164a1f4c2c6d088b3cdb3205f88a1 +Subproject commit c2175a152073e400f4011f7f6b96fe3392cfe3d0 diff --git a/packages/scripts/src/buildCatalogItemAccessor.ts b/packages/scripts/src/buildCatalogItemAccessor.ts index 5c9006bc1..386401aeb 100644 --- a/packages/scripts/src/buildCatalogItemAccessor.ts +++ b/packages/scripts/src/buildCatalogItemAccessor.ts @@ -7,6 +7,7 @@ const TARGET = "../../packages/closed/src/unreal/catalogItemAccessor.ts"; const componentPattern = /^export interface (\w+Component) {/gm; const componentSuffixPattern = /Component$/; const tsSuffixPattern = /\.ts$/; +const blitzStaticPrefixPattern = /^BlitzStatic/; let imports = ""; let methods = ""; @@ -23,10 +24,9 @@ for (const file of files) { for (const match of matches) { const interfaceName = match[1]; const componentName = interfaceName.split("_").at(-1)!; - - if (componentName.startsWith("BlitzStatic")) continue; - - const fieldName = lowerFirst(componentName); + const fieldName = lowerFirst( + componentName.replace(blitzStaticPrefixPattern, ""), + ); const methodName = componentName.replace(componentSuffixPattern, ""); const importName = file.replace(tsSuffixPattern, ""); diff --git a/packages/website-ue/src/api/abstract.ts b/packages/website-ue/src/api/abstract.ts index de531a3b7..1d7c4d957 100644 --- a/packages/website-ue/src/api/abstract.ts +++ b/packages/website-ue/src/api/abstract.ts @@ -7,6 +7,7 @@ import type { Avatars } from "@protos/avatars"; import type { Background } from "@protos/background"; import type { Backgrounds } from "@protos/backgrounds"; import type { TankUpgradePricePresetComponent } from "@protos/blitz_static_tank_upgrade_price_preset_component"; +import type { Equipment } from "@protos/equipment"; import type { PopularTanks } from "@protos/popular_tanks"; import type { Tank } from "@protos/tank"; import type { TankList } from "@protos/tank_list"; @@ -25,6 +26,7 @@ export abstract class AbstractAPI { ): Promise; abstract tiers(): Promise; + abstract equipment(): Promise; abstract strings(locale: string): Promise; abstract gameStrings(locale: string): Promise>; diff --git a/packages/website-ue/src/api/client.ts b/packages/website-ue/src/api/client.ts index de77198e2..3d088fc18 100644 --- a/packages/website-ue/src/api/client.ts +++ b/packages/website-ue/src/api/client.ts @@ -2,13 +2,16 @@ import { fetchPB } from "@blitzkit/core"; import type { Strings } from "@blitzkit/i18n"; import { Avatars } from "@protos/avatars"; import { TankUpgradePricePresetComponent } from "@protos/blitz_static_tank_upgrade_price_preset_component"; +import { Equipment } from "@protos/equipment"; import { PopularTanks } from "@protos/popular_tanks"; import { TankList } from "@protos/tank_list"; import { Tanks } from "@protos/tanks"; import { Tiers } from "@protos/tiers"; import { AbstractAPI, Cache } from "./abstract"; -const rejected = Promise.reject("Not implemented on client"); +function rejected() { + return Promise.reject("Not implemented on client"); +} export class ClientAPI extends AbstractAPI { get metadata(): never { @@ -49,6 +52,11 @@ export class ClientAPI extends AbstractAPI { return fetchPB("/api/tiers.pb", Tiers); } + @Cache() + equipment() { + return fetchPB("/api/equipment.pb", Equipment); + } + @Cache() async strings(locale: string) { const response = await fetch(`/api/strings/${locale}.json`); @@ -59,7 +67,7 @@ export class ClientAPI extends AbstractAPI { @UnimplementedOnClient gameStrings() { - return rejected; + return rejected(); } @Cache() @@ -72,12 +80,12 @@ export class ClientAPI extends AbstractAPI { @UnimplementedOnClient gameStringGroups() { - return rejected; + return rejected(); } @UnimplementedOnClient avatar() { - return rejected; + return rejected(); } avatars() { @@ -86,17 +94,22 @@ export class ClientAPI extends AbstractAPI { @UnimplementedOnClient avatarList() { - return rejected; + return rejected(); } @UnimplementedOnClient background() { - return rejected; + return rejected(); } @UnimplementedOnClient backgrounds() { - return rejected; + return rejected(); + } + + @UnimplementedOnClient + currencyIcon() { + return rejected(); } } diff --git a/packages/website-ue/src/api/server.ts b/packages/website-ue/src/api/server.ts index 6bf9b2dbc..cd888a95b 100644 --- a/packages/website-ue/src/api/server.ts +++ b/packages/website-ue/src/api/server.ts @@ -5,6 +5,7 @@ import locales from "@blitzkit/i18n/locales.json"; import type { Avatar, DeepPartial } from "@protos/avatar"; import type { Background } from "@protos/background"; import type { RemoteStorageComponent } from "@protos/blitz_static_remote_storage_component"; +import { Equipment } from "@protos/equipment"; import type { PopularTanks } from "@protos/popular_tanks"; import type { Tank } from "@protos/tank"; import type { TankListEntry } from "@protos/tank_list"; @@ -226,6 +227,25 @@ export class ServerAPI extends AbstractAPI { return tiers; } + @Cache() + async equipment() { + const equipment = Equipment.create(); + + for (const item of this.metadata.group("EquipmentPresetEntity")) { + equipment.presets[item.name] = item.EquipmentPreset(); + } + + for (const item of this.metadata.group("EquipmentPricePresetEntity")) { + equipment.prices[item.name] = item.EquipmentPricePreset(); + } + + for (const item of this.metadata.group("EquipmentEntity")) { + equipment.equipments[item.name] = item.BlitzStaticEquipment(); + } + + return equipment; + } + @Cache(true) async strings(locale: string) { const localized = (await globbedStrings[ diff --git a/packages/website-ue/src/components/TankopediaLoadout/index.tsx b/packages/website-ue/src/components/TankopediaLoadout/index.tsx index f8909bcc2..981fc09ef 100644 --- a/packages/website-ue/src/components/TankopediaLoadout/index.tsx +++ b/packages/website-ue/src/components/TankopediaLoadout/index.tsx @@ -10,6 +10,7 @@ import { isAlternativeLine, originalLineName, } from "../../config/alternativeLines"; +import { useEquipment } from "../../hooks/useEquipment"; import { useProtagonist } from "../../hooks/useProtagonist"; import { useStrings } from "../../hooks/useStrings"; import { useUpgradePreset } from "../../hooks/useUpgradePreset"; @@ -34,19 +35,16 @@ export function TankopediaLoadout() { function Equipment() { const strings = useStrings(); const tank = useProtagonist(); - // const equipment = useEquipment( - // tank.tank!.equipment_preset_catalog_id, - // tank.tank!.equipment_price_preset_catalog_id, - // ); + const equipment = useEquipment( + tank.tank!.equipment_preset_catalog_id, + tank.tank!.equipment_price_preset_catalog_id, + ); return (
{strings.tanks.loadout.equipment}
- preset: {tank.tank!.equipment_preset_catalog_id} -
- price: {tank.tank!.equipment_price_preset_catalog_id}
); } diff --git a/packages/website-ue/src/hooks/useEquipment.ts b/packages/website-ue/src/hooks/useEquipment.ts index 5d62d6d02..8b88d0897 100644 --- a/packages/website-ue/src/hooks/useEquipment.ts +++ b/packages/website-ue/src/hooks/useEquipment.ts @@ -1,17 +1,13 @@ -import { api } from "../api/dynamic"; -import { useAwait } from "./useAwait"; - export function useEquipment(presetId: string, priceId: string) { - const [, presetName] = presetId.split("."); - const [, priceName] = priceId.split("."); - const preset = useAwait( - () => api.equipmentPreset(presetId), - `equipment-preset-${presetName}`, - ); - const price = useAwait( - () => api.equipmentPricePreset(priceId), - `equipment-price-${priceName}`, - ); - - return { preset, price }; + // const [, presetName] = presetId.split("."); + // const [, priceName] = priceId.split("."); + // const preset = useAwait( + // () => api.equipmentPreset(presetName), + // `equipment-preset-${presetName}`, + // ); + // const price = useAwait( + // () => api.equipmentPrice(priceName), + // `equipment-price-${priceName}`, + // ); + // return { preset, price }; } diff --git a/packages/website-ue/src/pages/api/equipment.pb.ts b/packages/website-ue/src/pages/api/equipment.pb.ts new file mode 100644 index 000000000..95527883d --- /dev/null +++ b/packages/website-ue/src/pages/api/equipment.pb.ts @@ -0,0 +1,7 @@ +import { Equipment } from "@protos/equipment"; +import { api } from "../../api/dynamic"; + +export async function GET() { + const equipment = await api.equipment(); + return new Response(Equipment.encode(equipment).finish()); +}