Merge branch 'main' into data-driven

This commit is contained in:
tresabhi committed 2026-09-23 16:37:39 -05:00
commit 4fc57d7fc1
9 files changed
+22 -22

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
# BlitzKit 1.31.3
This update updates BlitzKit to work with the game's new ID system for game modes.
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "blitzkit", "name": "blitzkit",
"version": "1.31.2", "version": "1.31.3",
"license": "BlitzKit License", "license": "BlitzKit License",
"private": true, "private": true,
"scripts": { "scripts": {
@@ -50,10 +50,11 @@ export abstract class ServerBlitzKitAPI1 extends ServerBlitzKitAPI0 {
async tanks() { async tanks() {
const tankDefinitions = TankDefinitions.create(); const tankDefinitions = TankDefinitions.create();
const gameModeNativeNames: Record<string, number> = {}; const gameModeNativeNames: Record<string, string> = {};
const squadBattleTypeGameModeNativeNameMatches = const squadBattleTypeGameModeNativeNameMatches =
this.squadBattleTypeStyles!.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( 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 = const gameTypeGameModeNativeNameMatches =
this.gameTypeSelectorStyles!.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( 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) { for (const match of squadBattleTypeGameModeNativeNameMatches) {
const id = Number(match[1]); gameModeNativeNames[match[3]] = match[1];
gameModeNativeNames[match[3]] = id;
} }
for (const match of gameTypeGameModeNativeNameMatches) { for (const match of gameTypeGameModeNativeNameMatches) {
@@ -27,9 +27,9 @@ export abstract class ServerBlitzKitAPI9 extends ServerBlitzKitAPI8 {
).available_nations; ).available_nations;
for (const match of this.squadBattleTypeStyles!.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( 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]); const name = this.getString(match[2]);
gameDefinitions.gameModes[id] = { gameDefinitions.gameModes[id] = {
@@ -7,7 +7,7 @@ import "i18n.proto";
message GameDefinitions { message GameDefinitions {
required string version = 1; required string version = 1;
repeated string nations = 2; repeated string nations = 2;
map<uint32, GameMode> gameModes = 3; map<string, GameMode> gameModes = 3;
map<uint32, GameModeRole> roles = 4; map<uint32, GameModeRole> roles = 4;
} }
@@ -11,7 +11,7 @@ message TankDefinitions {
message TankDefinition { message TankDefinition {
required uint32 id = 1; required uint32 id = 1;
required string slug = 2; required string slug = 2;
map<uint32, uint32> roles = 3; map<string, uint32> roles = 3;
required bool fixed_camouflage = 5; required bool fixed_camouflage = 5;
repeated int32 camouflages = 6; repeated int32 camouflages = 6;
repeated int32 ancestors = 7; repeated int32 ancestors = 7;
@@ -42,14 +42,13 @@ const consumableDefinitions = await api.consumables();
const provisionDefinitions = await api.provisions(); const provisionDefinitions = await api.provisions();
const tankDefinitions = await api.tanks(); const tankDefinitions = await api.tanks();
const gameModeRoleSets: Record<number, Set<number>> = {}; const gameModeRoleSets: Record<string, Set<number>> = {};
for (const tankIdString in tankDefinitions.tanks) { for (const tankIdString in tankDefinitions.tanks) {
const gameMode = tankDefinitions.tanks[tankIdString]; const gameMode = tankDefinitions.tanks[tankIdString];
for (const gameModeIdString in gameMode.roles) { for (const gameModeId in gameMode.roles) {
const role = gameMode.roles[gameModeIdString]; const role = gameMode.roles[gameModeId];
const gameModeId = Number(gameModeIdString);
if (gameModeId in gameModeRoleSets) { if (gameModeId in gameModeRoleSets) {
gameModeRoleSets[gameModeId].add(role); gameModeRoleSets[gameModeId].add(role);
@@ -60,7 +59,7 @@ for (const tankIdString in tankDefinitions.tanks) {
} }
const gameModeRoles: { const gameModeRoles: {
gameModeId: number; gameModeId: string;
consumables: number[]; consumables: number[];
provisions: number[]; provisions: number[];
}[] = []; }[] = [];
@@ -69,8 +68,7 @@ const allGameModeConsumables = new Set<number>();
const allGameModeProvisions = new Set<number>(); const allGameModeProvisions = new Set<number>();
for (const gameModeIdString in gameModeRoleSets) { for (const gameModeIdString in gameModeRoleSets) {
const gameModeId = Number(gameModeIdString); const roles = gameModeRoleSets[gameModeIdString];
const roles = gameModeRoleSets[gameModeId];
const consumables = new Set<number>(); const consumables = new Set<number>();
const provisions = new Set<number>(); const provisions = new Set<number>();
@@ -113,7 +111,7 @@ for (const gameModeIdString in gameModeRoleSets) {
} }
gameModeRoles.push({ gameModeRoles.push({
gameModeId: gameModeId, gameModeId: gameModeIdString,
consumables: Array.from(consumables.values()), consumables: Array.from(consumables.values()),
provisions: Array.from(provisions.values()), provisions: Array.from(provisions.values()),
}); });
@@ -21,8 +21,7 @@ export function GameModeSection() {
</Heading> </Heading>
<Flex justify="center" gap="4" wrap="wrap" px="4"> <Flex justify="center" gap="4" wrap="wrap" px="4">
{roles.map(([key, value]) => { {roles.map(([id, value]) => {
const id = Number(key);
const gameMode = gameDefinitions.gameModes[id]; const gameMode = gameDefinitions.gameModes[id];
return ( return (
@@ -17,15 +17,15 @@ export const getStaticPaths = mixStaticPaths(_getStaticPaths, async () => {
const bannerMatches: { name: string; path: string }[] = []; const bannerMatches: { name: string; path: string }[] = [];
for (const match of gameTypeSelectorStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( 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] }); bannerMatches.push({ name: match[1], path: match[2] });
} }
for (const match of squadBattleTypeStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( 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]; const name = match[2];
let path = bannerMatches.find( let path = bannerMatches.find(
(bannerMatch) => bannerMatch.name.toLowerCase() === name.toLowerCase(), (bannerMatch) => bannerMatch.name.toLowerCase() === name.toLowerCase(),