diff --git a/packages/i18n/strings/en.json b/packages/i18n/strings/en.json index bb37b8166..a4ffec20f 100644 --- a/packages/i18n/strings/en.json +++ b/packages/i18n/strings/en.json @@ -1037,6 +1037,7 @@ }, "meta": { + "free": "Free", "back": "Back", "compare": "Compare", "swap": { @@ -1054,7 +1055,8 @@ "purchase": "Purchase price", "restoration": "Restoration price", "sale": "Sale price", - "research": "Research XP" + "set": "Set", + "price": "Price" }, "tech_tree": { diff --git a/packages/website/src/components/Tankopedia_ue/MetaSection.tsx b/packages/website/src/components/Tankopedia_ue/MetaSection.tsx index 44a708641..8c71fe66b 100644 --- a/packages/website/src/components/Tankopedia_ue/MetaSection.tsx +++ b/packages/website/src/components/Tankopedia_ue/MetaSection.tsx @@ -17,8 +17,21 @@ const NATIONAL_BANNER_POSITION_OVERRIDES: Partial> = { export function MetaSection() { const developerMode = App.useDeferred((state) => state.developerMode, false); const tank = TankopediaEphemeral_ue.use((state) => state.tank); + const set = TankopediaEphemeral_ue.use((state) => state.set); + const catalogueId = TankopediaEphemeral_ue.use((state) => state.catalogueId); const ClassIcon = classIcons_ue[tank.tank_class]; const { locale, strings } = useLocale(); + const reward = set.tank_set_rewards.find( + (reward) => + reward.tank_set_reward_on_level && + reward.tank_set_reward_on_level.reward_list.some( + (rewardOnLevel) => + rewardOnLevel.tank_reward && + rewardOnLevel.tank_reward.tank_catalog_id === catalogueId, + ), + )!; + const price = + reward.tank_set_reward_price?.price_list[0].currency_price!.amount; return ( @@ -148,24 +161,28 @@ export function MetaSection() { /> - {/* TODO: ADD RESEARCH COST */} - {/* {protagonist.research_cost && ( - - - {( - protagonist.research_cost.research_cost_type! - .value as number - ).toLocaleString(locale)} - xp - - - )} */} + + {set.tank_set_ui!.tank_set_displayed_name} + + + + {reward.tank_set_reward_price === undefined ? ( + strings.website.tools.tankopedia.meta.free + ) : ( + <> + {price?.toLocaleString(locale)} + + xp + + )} + + diff --git a/packages/website/src/core/blitz/metadata.ts b/packages/website/src/core/blitz/metadata.ts index 06f3c1424..b7fd2b008 100644 --- a/packages/website/src/core/blitz/metadata.ts +++ b/packages/website/src/core/blitz/metadata.ts @@ -8,5 +8,5 @@ import type { GetPackedMetadataAsyncResponse } from '@blitzkit/closed/src/unreal export const metadata = new MetadataAccessor( await requestAutoProxyClient( 'GetPackedMetadataAsyncRequest', - ).then((packed) => unpackMetadata(packed)), + ).then(unpackMetadata), ); diff --git a/packages/website/src/core/blitz/tankToSet.ts b/packages/website/src/core/blitz/tankToSet.ts new file mode 100644 index 000000000..890c4c459 --- /dev/null +++ b/packages/website/src/core/blitz/tankToSet.ts @@ -0,0 +1,27 @@ +import type { TankSetCatalogComponent } from '@protos/blitz_static_tank_set_component'; +import type { MetadataAccessor } from 'submodules/blitzkit-closed/src'; + +export async function tankToSet(metadata: MetadataAccessor, tank: string) { + for (const [id] of metadata.items) { + if (!id.startsWith('TankSetEntity')) continue; + + const components = await metadata.get(id); + const set = await components.get( + 'tankSetCatalogComponent', + ); + + for (const reward of set.tank_set_rewards) { + if (!reward.tank_set_reward_on_level) continue; + + for (const rewardOnLevel of reward.tank_set_reward_on_level.reward_list) { + if (!rewardOnLevel.tank_reward) continue; + + if (rewardOnLevel.tank_reward.tank_catalog_id === tank) { + return set; + } + } + } + } + + throw new Error(`Tank ${tank} not found in any set`); +} diff --git a/packages/website/src/pages/[...locale]/tanks-ue/[slug]/_index.tsx b/packages/website/src/pages/[...locale]/tanks-ue/[slug]/_index.tsx index dfdfdd078..c908c635f 100644 --- a/packages/website/src/pages/[...locale]/tanks-ue/[slug]/_index.tsx +++ b/packages/website/src/pages/[...locale]/tanks-ue/[slug]/_index.tsx @@ -1,5 +1,6 @@ import type { CompensationComponent } from '@protos/blitz_static_compensation_component'; import { type TankCatalogComponent } from '@protos/blitz_static_tank_component'; +import type { TankSetCatalogComponent } from '@protos/blitz_static_tank_set_component'; import { PageWrapper } from 'packages/website/src/components/PageWrapper'; import { MetaSection } from 'packages/website/src/components/Tankopedia_ue/MetaSection'; import { @@ -12,13 +13,23 @@ import { TankopediaEphemeral_ue } from 'packages/website/src/stores/tankopediaEp interface PageProps extends LocaleAcceptorProps { tank: TankCatalogComponent; compensation: CompensationComponent; + set: TankSetCatalogComponent; + catalogueId: string; } -export function Page({ tank, compensation, localeContext }: PageProps) { +export function Page({ + tank, + compensation, + set, + localeContext, + catalogueId, +}: PageProps) { return ( - + diff --git a/packages/website/src/pages/[...locale]/tanks-ue/[slug]/index.astro b/packages/website/src/pages/[...locale]/tanks-ue/[slug]/index.astro index 7a3bd878d..8e408e95c 100644 --- a/packages/website/src/pages/[...locale]/tanks-ue/[slug]/index.astro +++ b/packages/website/src/pages/[...locale]/tanks-ue/[slug]/index.astro @@ -7,6 +7,7 @@ import type { import { slugify } from '@blitzkit/core'; import locales from '@blitzkit/i18n/locales.json'; import type { GetStaticPaths } from 'astro'; +import { tankToSet } from 'packages/website/src/core/blitz/tankToSet'; import { metadata } from '../../../../core/blitz/metadata'; import BaseLayout from '../../../../layouts/BaseLayout.astro'; import { getStaticPaths as parentGetStaticPaths } from '../index.astro'; @@ -44,6 +45,7 @@ export const getStaticPaths = (async () => { }) satisfies GetStaticPaths; const { item, locale, strings } = Astro.props; +const set = await tankToSet(metadata, item); const tankComponents = await metadata.get(item); const tank = await tankComponents.get( 'tankCatalogComponent', @@ -54,5 +56,12 @@ const compensation = await tankComponents.get( --- - + diff --git a/packages/website/src/stores/tankopediaEphemeral_ue.ts b/packages/website/src/stores/tankopediaEphemeral_ue.ts index 2d1b279fb..76c60ca4a 100644 --- a/packages/website/src/stores/tankopediaEphemeral_ue.ts +++ b/packages/website/src/stores/tankopediaEphemeral_ue.ts @@ -1,5 +1,6 @@ import type { CompensationComponent } from '@protos/blitz_static_compensation_component'; import type { TankCatalogComponent } from '@protos/blitz_static_tank_component'; +import type { TankSetCatalogComponent } from '@protos/blitz_static_tank_set_component'; import { create } from 'zustand'; import { subscribeWithSelector } from 'zustand/middleware'; import { createContextualStore } from '../core/zustand/createContextualStore'; @@ -7,6 +8,8 @@ import { createContextualStore } from '../core/zustand/createContextualStore'; interface TankopediaEphemeral_ue { tank: TankCatalogComponent; compensation: CompensationComponent; + set: TankSetCatalogComponent; + catalogueId: string; } export const TankopediaEphemeral_ue = createContextualStore( diff --git a/submodules/blitzkit-closed b/submodules/blitzkit-closed index 25f8838ba..793d8c9f4 160000 --- a/submodules/blitzkit-closed +++ b/submodules/blitzkit-closed @@ -1 +1 @@ -Subproject commit 25f8838ba5968c437099a01e53c35ade912f1a03 +Subproject commit 793d8c9f4efafb07435be001f4f9fb1a8c5ce422