diff --git a/docs/changelogs/1.31.3.md b/docs/changelogs/1.31.3.md new file mode 100644 index 000000000..faf65aca5 --- /dev/null +++ b/docs/changelogs/1.31.3.md @@ -0,0 +1,3 @@ +# BlitzKit 1.31.3 + +This update updates BlitzKit to work with the game's new ID system for game modes. diff --git a/package.json b/package.json index f9457b0a7..212536f91 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blitzkit", - "version": "1.31.2", + "version": "1.31.3", "license": "BlitzKit License", "private": true, "scripts": { diff --git a/packages/core/src/blitzkit/api/server/1_tanks.ts b/packages/core/src/blitzkit/api/server/1_tanks.ts index b5ced2ef4..c4ab6caeb 100644 --- a/packages/core/src/blitzkit/api/server/1_tanks.ts +++ b/packages/core/src/blitzkit/api/server/1_tanks.ts @@ -50,10 +50,11 @@ export abstract class ServerBlitzKitAPI1 extends ServerBlitzKitAPI0 { async tanks() { const tankDefinitions = TankDefinitions.create(); - const gameModeNativeNames: Record = {}; + const gameModeNativeNames: Record = {}; + const squadBattleTypeGameModeNativeNameMatches = this.squadBattleTypeStyles!.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( - /"(\d+)" -> "(battleType\/([a-zA-Z]+))"/g, + /eGameMode\.(\w+) -> "(battleType\/([a-zA-Z]+))"/g, ); const gameTypeGameModeNativeNameMatches = this.gameTypeSelectorStyles!.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( @@ -61,8 +62,7 @@ export abstract class ServerBlitzKitAPI1 extends ServerBlitzKitAPI0 { ); for (const match of squadBattleTypeGameModeNativeNameMatches) { - const id = Number(match[1]); - gameModeNativeNames[match[3]] = id; + gameModeNativeNames[match[3]] = match[1]; } for (const match of gameTypeGameModeNativeNameMatches) { diff --git a/packages/core/src/blitzkit/api/server/9_game.ts b/packages/core/src/blitzkit/api/server/9_game.ts index 1fba2d073..a045bd5ef 100644 --- a/packages/core/src/blitzkit/api/server/9_game.ts +++ b/packages/core/src/blitzkit/api/server/9_game.ts @@ -27,9 +27,9 @@ export abstract class ServerBlitzKitAPI9 extends ServerBlitzKitAPI8 { ).available_nations; for (const match of this.squadBattleTypeStyles!.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( - /"(\d+)" -> "(battleType\/([a-zA-Z]+))"/g, + /eGameMode\.(\w+) -> "(battleType\/([a-zA-Z]+))"/g, )) { - const id = Number(match[1]); + const id = match[1]; const name = this.getString(match[2]); gameDefinitions.gameModes[id] = { diff --git a/packages/protos/src/blitzkit/game_definitions.proto b/packages/protos/src/blitzkit/game_definitions.proto index 9b7417a74..e612cdc01 100644 --- a/packages/protos/src/blitzkit/game_definitions.proto +++ b/packages/protos/src/blitzkit/game_definitions.proto @@ -7,7 +7,7 @@ import "i18n.proto"; message GameDefinitions { required string version = 1; repeated string nations = 2; - map gameModes = 3; + map gameModes = 3; map roles = 4; } diff --git a/packages/protos/src/blitzkit/tank_definitions.proto b/packages/protos/src/blitzkit/tank_definitions.proto index 475be1259..0c15d59f1 100644 --- a/packages/protos/src/blitzkit/tank_definitions.proto +++ b/packages/protos/src/blitzkit/tank_definitions.proto @@ -11,7 +11,7 @@ message TankDefinitions { message TankDefinition { required uint32 id = 1; required string slug = 2; - map roles = 3; + map roles = 3; required bool fixed_camouflage = 5; repeated int32 camouflages = 6; repeated int32 ancestors = 7; diff --git a/packages/website/src/components/TankSearchFilters/index.tsx b/packages/website/src/components/TankSearchFilters/index.tsx index ab79d4c41..8a993a9fb 100644 --- a/packages/website/src/components/TankSearchFilters/index.tsx +++ b/packages/website/src/components/TankSearchFilters/index.tsx @@ -42,14 +42,13 @@ const consumableDefinitions = await api.consumables(); const provisionDefinitions = await api.provisions(); const tankDefinitions = await api.tanks(); -const gameModeRoleSets: Record> = {}; +const gameModeRoleSets: Record> = {}; for (const tankIdString in tankDefinitions.tanks) { const gameMode = tankDefinitions.tanks[tankIdString]; - for (const gameModeIdString in gameMode.roles) { - const role = gameMode.roles[gameModeIdString]; - const gameModeId = Number(gameModeIdString); + for (const gameModeId in gameMode.roles) { + const role = gameMode.roles[gameModeId]; if (gameModeId in gameModeRoleSets) { gameModeRoleSets[gameModeId].add(role); @@ -60,7 +59,7 @@ for (const tankIdString in tankDefinitions.tanks) { } const gameModeRoles: { - gameModeId: number; + gameModeId: string; consumables: number[]; provisions: number[]; }[] = []; @@ -69,8 +68,7 @@ const allGameModeConsumables = new Set(); const allGameModeProvisions = new Set(); for (const gameModeIdString in gameModeRoleSets) { - const gameModeId = Number(gameModeIdString); - const roles = gameModeRoleSets[gameModeId]; + const roles = gameModeRoleSets[gameModeIdString]; const consumables = new Set(); const provisions = new Set(); @@ -113,7 +111,7 @@ for (const gameModeIdString in gameModeRoleSets) { } gameModeRoles.push({ - gameModeId: gameModeId, + gameModeId: gameModeIdString, consumables: Array.from(consumables.values()), provisions: Array.from(provisions.values()), }); diff --git a/packages/website/src/components/Tankopedia/GameModeSection.tsx b/packages/website/src/components/Tankopedia/GameModeSection.tsx index 56b8bdf13..a095138e5 100644 --- a/packages/website/src/components/Tankopedia/GameModeSection.tsx +++ b/packages/website/src/components/Tankopedia/GameModeSection.tsx @@ -21,8 +21,7 @@ export function GameModeSection() { - {roles.map(([key, value]) => { - const id = Number(key); + {roles.map(([id, value]) => { const gameMode = gameDefinitions.gameModes[id]; return ( diff --git a/packages/website/src/pages/[...chunk_api]/gamemodes/[id]/banner.webp.ts b/packages/website/src/pages/[...chunk_api]/gamemodes/[id]/banner.webp.ts index c8715a3b1..31af83ead 100644 --- a/packages/website/src/pages/[...chunk_api]/gamemodes/[id]/banner.webp.ts +++ b/packages/website/src/pages/[...chunk_api]/gamemodes/[id]/banner.webp.ts @@ -17,15 +17,15 @@ export const getStaticPaths = mixStaticPaths(_getStaticPaths, async () => { const bannerMatches: { name: string; path: string }[] = []; for (const match of gameTypeSelectorStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( - /eGameMode\.([a-zA-Z]+) -> "~res:([^"]+)"/g, + /eGameMode\.(\w+) -> "~res:([^"]+)"/g, )) { bannerMatches.push({ name: match[1], path: match[2] }); } for (const match of squadBattleTypeStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( - /"(\d+)" -> "battleType\/([a-zA-Z]+)"/g, + /eGameMode\.(\w+) -> "battleType\/([a-zA-Z]+)"/g, )) { - const id = Number(match[1]); + const id = match[1]; const name = match[2]; let path = bannerMatches.find( (bannerMatch) => bannerMatch.name.toLowerCase() === name.toLowerCase(),