mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 18:57:03 +02:00
feat: mirros
This commit is contained in:
1 parent
cb03a86cce
commit
8087752172
11 files changed
+193
-93
No files matched your search
Vendored
+41
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "build",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"build",
|
||||
"${workspaceFolder}/blitzkit.sln",
|
||||
"/property:GenerateFullPaths=true",
|
||||
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
},
|
||||
{
|
||||
"label": "publish",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"publish",
|
||||
"${workspaceFolder}/blitzkit.sln",
|
||||
"/property:GenerateFullPaths=true",
|
||||
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
},
|
||||
{
|
||||
"label": "watch",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"watch",
|
||||
"run",
|
||||
"--project",
|
||||
"${workspaceFolder}/blitzkit.sln"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
}
|
||||
]
|
||||
}
|
||||
+3
-2
@@ -22,7 +22,6 @@
|
||||
"start:bot": "bun dist/bot/main.js",
|
||||
"dev:docs": "vitepress dev docs",
|
||||
"dev:website": "cd packages/website && bun run dev",
|
||||
"dev:api": "bun --filter=@blitzkit/api run dev",
|
||||
"setup:depotdownloader": "bun --filter=@blitzkit/scripts run setup:depotdownloader",
|
||||
"setup:patches": "bun --filter=@blitzkit/scripts run setup:patches",
|
||||
"start:website": "bun --filter=@blitzkit/website run start",
|
||||
@@ -39,7 +38,9 @@
|
||||
"build:ids": "cd packages/scripts && bun build:ids",
|
||||
"prunestrings": "cd packages/scripts && bun prunestrings",
|
||||
"dev:cli:unpack": "cd src/BlitzKit.CLI && dotnet run unpack \"C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz Playtest\" --no-overwrite",
|
||||
"mangle": "cd src/BlitzKit.CLI && dotnet run mangle"
|
||||
"mangle": "cd src/BlitzKit.CLI && dotnet run mangle",
|
||||
"api": "cd src/BlitzKit.CLI && dotnet run api",
|
||||
"dev:api": "cd src/BlitzKit.CLI && dotnet watch run api"
|
||||
},
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
import { fetchPB, type MessageFns } from '@blitzkit/core';
|
||||
import type { APIRoute } from 'astro';
|
||||
|
||||
export async function blobMirror(url: string) {
|
||||
if (import.meta.env.MODE === 'development') {
|
||||
return Response.redirect(url);
|
||||
@@ -7,3 +10,17 @@ export async function blobMirror(url: string) {
|
||||
return new Response(blob, { headers: response.headers });
|
||||
}
|
||||
}
|
||||
|
||||
export function apiMirror(path: string) {
|
||||
const get: APIRoute = () => blobMirror(`http://localhost:5000${path}`);
|
||||
return get;
|
||||
}
|
||||
|
||||
export function jsonMirror<Type>(path: string, message: MessageFns<Type>) {
|
||||
const get: APIRoute = async () => {
|
||||
return new Response(
|
||||
JSON.stringify(await fetchPB(`http://localhost:5000${path}`, message)),
|
||||
);
|
||||
};
|
||||
return get;
|
||||
}
|
||||
@@ -1,13 +1,10 @@
|
||||
import { fetchTanksFull } from '@blitzkit/core';
|
||||
import type { APIRoute } from 'astro';
|
||||
import { TanksFull } from '@blitzkit/core';
|
||||
import { jsonMirror } from '../../../core/blitzkit/blobMirror';
|
||||
|
||||
/**
|
||||
* Returns meta data similar to tanks/[id].json but for all tanks as an array. There is no guarantee of order.
|
||||
* Identical to tanks/full.pb but in JSON.
|
||||
*
|
||||
* @warning This is a large response. Consider using tanks/[id]/meta.json for individual tanks.
|
||||
* @returns JSON.
|
||||
*/
|
||||
export const GET: APIRoute = async () => {
|
||||
const tanksFull = await fetchTanksFull();
|
||||
return Response.json(tanksFull.tanks);
|
||||
};
|
||||
export const GET = jsonMirror('/tanks/full.pb', TanksFull);
|
||||
@@ -0,0 +1,8 @@
|
||||
import { apiMirror } from '../../../core/blitzkit/blobMirror';
|
||||
|
||||
/**
|
||||
* Returns meta data similar to tanks/[id].json but for all tanks as an array. There is no guarantee of order.
|
||||
*
|
||||
* @proto TanksFull
|
||||
*/
|
||||
export const GET = apiMirror('/tanks/full.pb');
|
||||
@@ -1,12 +1,9 @@
|
||||
import { fetchTanks } from '@blitzkit/core';
|
||||
import type { APIRoute } from 'astro';
|
||||
import { Tanks } from '@blitzkit/core';
|
||||
import { jsonMirror } from '../../../core/blitzkit/blobMirror';
|
||||
|
||||
/**
|
||||
* Returns a list of all tank ids. There is no guarantee of order.
|
||||
* Identical to tanks/list.pb but in JSON.
|
||||
*
|
||||
* @returns JSON.
|
||||
*/
|
||||
export const GET: APIRoute = async () => {
|
||||
const tanks = await fetchTanks();
|
||||
return Response.json(tanks.tanks);
|
||||
};
|
||||
export const GET = jsonMirror('/tanks/list.pb', Tanks);
|
||||
@@ -0,0 +1,8 @@
|
||||
import { apiMirror } from '../../../core/blitzkit/blobMirror';
|
||||
|
||||
/**
|
||||
* Returns a list of all tank ids. There is no guarantee of order.
|
||||
*
|
||||
* @returns JSON.
|
||||
*/
|
||||
export const GET = apiMirror('/tanks/list.pb');
|
||||
@@ -15,6 +15,7 @@
|
||||
<PackageReference Include="DotNet.Glob" Version="3.1.3" />
|
||||
<PackageReference Include="DotNetEnv" Version="3.1.1" />
|
||||
<PackageReference Include="Google.Protobuf" Version="3.29.3" />
|
||||
<FrameworkReference Include="Microsoft.AspNetCore.App" Version="2.2.8" />
|
||||
<PackageReference Include="Octokit" Version="14.0.0" />
|
||||
<PackageReference Include="YamlDotNet" Version="16.3.0" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
using Google.Protobuf;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
|
||||
namespace BlitzKit.CLI.Functions
|
||||
{
|
||||
public class Api(string[] args)
|
||||
{
|
||||
readonly WebApplication app = WebApplication.Create();
|
||||
readonly Mangler mangler = new(args);
|
||||
|
||||
void Map<T>(string path, Func<Task<T>> func)
|
||||
where T : IMessage<T>
|
||||
{
|
||||
app.MapGet(
|
||||
path,
|
||||
async (context) =>
|
||||
{
|
||||
var message = await func();
|
||||
var bytes = message.ToByteArray();
|
||||
|
||||
context.Response.ContentType = "application/octet-stream";
|
||||
await context.Response.Body.WriteAsync(bytes);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public async Task Run()
|
||||
{
|
||||
await mangler.Initialize();
|
||||
|
||||
Map("/tanks/full.pb", mangler.TanksFull);
|
||||
Map("/tanks/list.pb", mangler.Tanks);
|
||||
|
||||
app.Run();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -49,15 +49,71 @@ namespace BlitzKit.CLI.Functions
|
||||
readonly BlitzProvider provider = new(args.Contains("--depot"));
|
||||
Locales? locales;
|
||||
readonly Dictionary<string, Dictionary<string, string>> strings = [];
|
||||
readonly AssetUploader assetUploader = new("mangled ue assets") { enabled = true };
|
||||
|
||||
public async Task Mangle()
|
||||
public async Task<TanksFull> TanksFull()
|
||||
{
|
||||
var dirs = provider.RootDirectory.GetDirectory("Blitz/Content/Tanks").Directories;
|
||||
TanksFull tanksFull = new();
|
||||
|
||||
foreach (var dir in dirs)
|
||||
{
|
||||
if (dir.Key == "TankStub")
|
||||
continue;
|
||||
|
||||
foreach (var tankDir in dir.Value.Directories)
|
||||
{
|
||||
var tank = MangleTank(tankDir.Value);
|
||||
tanksFull.Tanks.Add(tank);
|
||||
}
|
||||
}
|
||||
|
||||
DeduplicateSlugs(tanksFull);
|
||||
|
||||
return tanksFull;
|
||||
}
|
||||
|
||||
Tank MangleTank(VFS tankDir)
|
||||
{
|
||||
var pdaName = $"PDA_{tankDir.Name}";
|
||||
var pda = provider.LoadObject($"{tankDir.Path}/{pdaName}.{pdaName}");
|
||||
|
||||
var id = pda.Get<FName>("TankId").Text;
|
||||
var name = GetString($"TankEntity__{id.ToLowerInvariant()}__Short_Name");
|
||||
var slug = Diacritics.Remove(name.Locales["en"]).ToLower();
|
||||
slug = NonAlphanumericRegex().Replace(slug, "-");
|
||||
slug = MultipleDashesRegex().Replace(slug, "-");
|
||||
slug = TrailingDashRegex().Replace(slug, "");
|
||||
|
||||
Tank tank = new()
|
||||
{
|
||||
Id = id,
|
||||
Name = name,
|
||||
Slug = slug,
|
||||
};
|
||||
|
||||
return tank;
|
||||
}
|
||||
|
||||
public async Task<Tanks> Tanks()
|
||||
{
|
||||
var tanksFull = await TanksFull();
|
||||
Tanks tanks = new();
|
||||
|
||||
foreach (var tank in tanksFull.Tanks)
|
||||
{
|
||||
tanks.Tanks_.Add(tank.Id);
|
||||
}
|
||||
|
||||
return tanks;
|
||||
}
|
||||
|
||||
public async Task Initialize()
|
||||
{
|
||||
await FetchStrings();
|
||||
await MangleNations();
|
||||
await assetUploader.Flush();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
I18n GetString(string name)
|
||||
{
|
||||
I18n i18n = new();
|
||||
@@ -109,42 +165,6 @@ namespace BlitzKit.CLI.Functions
|
||||
}
|
||||
}
|
||||
|
||||
async Task MangleNations()
|
||||
{
|
||||
var dirs = provider.RootDirectory.GetDirectory("Blitz/Content/Tanks").Directories;
|
||||
TanksFull tanksFull = new();
|
||||
|
||||
foreach (var dir in dirs)
|
||||
{
|
||||
if (dir.Key == "TankStub")
|
||||
continue;
|
||||
|
||||
foreach (var tankDir in dir.Value.Directories)
|
||||
{
|
||||
// if (tankDir.Value.Name != "R90_IS_4")
|
||||
// continue;
|
||||
|
||||
// if (tankDir.Value.Name != "R81_IS_8")
|
||||
// continue;
|
||||
|
||||
var tank = await MangleTank(tankDir.Value);
|
||||
tanksFull.Tanks.Add(tank);
|
||||
}
|
||||
}
|
||||
|
||||
DeduplicateSlugs(tanksFull);
|
||||
Tanks tanks = new();
|
||||
|
||||
foreach (var tank in tanksFull.Tanks)
|
||||
{
|
||||
tanks.Tanks_.Add(tank.Id);
|
||||
await assetUploader.Add($"tanks/{tank.Id}/meta.pb", tank.ToByteArray());
|
||||
}
|
||||
|
||||
await assetUploader.Add("definitions/tanks.pb", tanks.ToByteArray());
|
||||
await assetUploader.Add("definitions/tanks-full.pb", tanksFull.ToByteArray());
|
||||
}
|
||||
|
||||
void DeduplicateSlugs(TanksFull tanksFull)
|
||||
{
|
||||
List<string> checkedSlugs = [];
|
||||
@@ -215,33 +235,6 @@ namespace BlitzKit.CLI.Functions
|
||||
}
|
||||
}
|
||||
|
||||
async Task<Tank> MangleTank(VFS tankDir)
|
||||
{
|
||||
var pdaName = $"PDA_{tankDir.Name}";
|
||||
var pda = provider.LoadObject($"{tankDir.Path}/{pdaName}.{pdaName}");
|
||||
|
||||
var id = pda.Get<FName>("TankId").Text;
|
||||
var name = GetString($"TankEntity__{id.ToLowerInvariant()}__Short_Name");
|
||||
var slug = Diacritics.Remove(name.Locales["en"]).ToLower();
|
||||
slug = NonAlphanumericRegex().Replace(slug, "-");
|
||||
slug = MultipleDashesRegex().Replace(slug, "-");
|
||||
slug = TrailingDashRegex().Replace(slug, "");
|
||||
|
||||
await MangleIcon(pda);
|
||||
await MangleArmor(pda);
|
||||
|
||||
Tank tank = new()
|
||||
{
|
||||
Id = id,
|
||||
Name = name,
|
||||
Slug = slug,
|
||||
};
|
||||
|
||||
await MangleModules(tank, pda);
|
||||
|
||||
return tank;
|
||||
}
|
||||
|
||||
async Task MangleArmor(UObject pda)
|
||||
{
|
||||
var id = pda.Get<FName>("TankId").Text;
|
||||
@@ -282,7 +275,7 @@ namespace BlitzKit.CLI.Functions
|
||||
PrettyLog.Warn($"Penetration groups missing for {id}; creating empty list");
|
||||
}
|
||||
|
||||
await assetUploader.Add($"tanks/{id}/armor.pb", tankArmor.ToByteArray());
|
||||
// await assetUploader.Add($"tanks/{id}/armor.pb", tankArmor.ToByteArray());
|
||||
}
|
||||
|
||||
async Task MangleIcon(UObject pda)
|
||||
@@ -292,7 +285,7 @@ namespace BlitzKit.CLI.Functions
|
||||
if (pda.TryGet<UTexture2D>("SmallIcon", out var smallIconTexture))
|
||||
{
|
||||
var smallIcon = BlitzKitExporter.Texture2D(smallIconTexture);
|
||||
await assetUploader.Add($"tanks/{id}/icons/small.png", smallIcon);
|
||||
// await assetUploader.Add($"tanks/{id}/icons/small.png", smallIcon);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -302,7 +295,7 @@ namespace BlitzKit.CLI.Functions
|
||||
if (pda.TryGet<UTexture2D>("BigIcon", out var bigIconTexture))
|
||||
{
|
||||
var bigIcon = BlitzKitExporter.Texture2D(bigIconTexture);
|
||||
await assetUploader.Add($"tanks/{id}/icons/big.png", bigIcon);
|
||||
// await assetUploader.Add($"tanks/{id}/icons/big.png", bigIcon);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -354,9 +347,9 @@ namespace BlitzKit.CLI.Functions
|
||||
{
|
||||
MonoGltf gltf = new(collision);
|
||||
|
||||
await assetUploader.Add(
|
||||
new($"tanks/{tank.Id}/collision/{moduleName}.glb", gltf.Write())
|
||||
);
|
||||
// await assetUploader.Add(
|
||||
// new($"tanks/{tank.Id}/collision/{moduleName}.glb", gltf.Write())
|
||||
// );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -365,7 +358,7 @@ namespace BlitzKit.CLI.Functions
|
||||
}
|
||||
}
|
||||
|
||||
await assetUploader.Add($"tanks/{tank.Id}/model.pb", tankModel.ToByteArray());
|
||||
// await assetUploader.Add($"tanks/{tank.Id}/model.pb", tankModel.ToByteArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,10 +22,10 @@ namespace BlitzKit.CLI
|
||||
break;
|
||||
}
|
||||
|
||||
case "mangle":
|
||||
case "api":
|
||||
{
|
||||
Mangler mangler = new(args);
|
||||
await mangler.Mangle();
|
||||
Api api = new(args);
|
||||
await api.Run();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user