mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-23 19:49:50 +02:00
equipment icons
This commit is contained in:
1 parent
8cf3da12fa
commit
1f690d11c7
7 files changed
+97
-28
No files matched your search
@@ -31,7 +31,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
chunk: [pages, api]
|
chunk: [pages, api, media]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public partial class GameInterface
|
|||||||
public HashSet<string> files;
|
public HashSet<string> files;
|
||||||
public string[] tanksDirectoryNations;
|
public string[] tanksDirectoryNations;
|
||||||
|
|
||||||
public GameInterface(string directory, string map)
|
public GameInterface(string directory, string map, string temp)
|
||||||
{
|
{
|
||||||
provider = new(directory, map);
|
provider = new(directory, map);
|
||||||
|
|
||||||
@@ -39,8 +39,8 @@ public partial class GameInterface
|
|||||||
.Distinct(),
|
.Distinct(),
|
||||||
];
|
];
|
||||||
|
|
||||||
string oodlePath = "temp/oodle.so";
|
string oodlePath = $"{temp}/oodle.so";
|
||||||
OodleHelper.DownloadOodleDll(ref oodlePath);
|
OodleHelper.DownloadOodleDll(ref oodlePath!);
|
||||||
OodleHelper.Initialize(oodlePath);
|
OodleHelper.Initialize(oodlePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,27 +157,9 @@ public partial class GameInterface
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
var path = $"{candidate}.{Path.GetFileNameWithoutExtension(candidate)}";
|
var pda = provider.PDA(candidate);
|
||||||
|
var icon = pda.Get<FSoftObjectPath>("Icon");
|
||||||
|
|
||||||
if (provider.TryLoadPackageObject<UPrimaryDataAsset>(path, out var pda))
|
return provider.Image(icon);
|
||||||
{
|
|
||||||
var icon = pda.Get<FSoftObjectPath>("Icon");
|
|
||||||
var uTexture = icon.Load<UTexture2D>();
|
|
||||||
var cTexture = uTexture.Decode(ETexturePlatform.DesktopMobile);
|
|
||||||
|
|
||||||
if (cTexture is null)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Could not extract icon for {path}");
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
var bitmap = cTexture.ToSkBitmap();
|
|
||||||
var data = bitmap.Encode(SKEncodedImageFormat.Webp, 80);
|
|
||||||
|
|
||||||
return data.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.WriteLine($"Could not load {path} as pda");
|
|
||||||
return [];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,15 @@
|
|||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using CUE4Parse_Conversion.Textures;
|
||||||
using CUE4Parse.Compression;
|
using CUE4Parse.Compression;
|
||||||
using CUE4Parse.FileProvider;
|
using CUE4Parse.FileProvider;
|
||||||
using CUE4Parse.MappingsProvider;
|
using CUE4Parse.MappingsProvider;
|
||||||
|
using CUE4Parse.UE4.Assets.Exports.Texture;
|
||||||
using CUE4Parse.UE4.Exceptions;
|
using CUE4Parse.UE4.Exceptions;
|
||||||
|
using CUE4Parse.UE4.Objects.Engine;
|
||||||
|
using CUE4Parse.UE4.Objects.UObject;
|
||||||
using CUE4Parse.UE4.Versions;
|
using CUE4Parse.UE4.Versions;
|
||||||
using CUE4Parse.Utils;
|
using CUE4Parse.Utils;
|
||||||
|
using SkiaSharp;
|
||||||
|
|
||||||
namespace BlitzKit.Game.Models;
|
namespace BlitzKit.Game.Models;
|
||||||
|
|
||||||
@@ -23,4 +28,32 @@ public class BlitzFileProvider : DefaultFileProvider
|
|||||||
Initialize();
|
Initialize();
|
||||||
Mount();
|
Mount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UPrimaryDataAsset PDA(string path)
|
||||||
|
{
|
||||||
|
var name = Path.GetFileNameWithoutExtension(path);
|
||||||
|
var combined = $"{path}.{name}";
|
||||||
|
return LoadPackageObject<UPrimaryDataAsset>(combined);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] Image(FSoftObjectPath path)
|
||||||
|
{
|
||||||
|
var uTexture = path.Load<UTexture2D>();
|
||||||
|
return Image(uTexture);
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly SKEncodedImageFormat imageFormat = SKEncodedImageFormat.Webp;
|
||||||
|
private readonly int imageQuality = 80;
|
||||||
|
|
||||||
|
public byte[] Image(UTexture2D uTexture)
|
||||||
|
{
|
||||||
|
var cTexture = uTexture.Decode(ETexturePlatform.DesktopMobile);
|
||||||
|
|
||||||
|
ArgumentNullException.ThrowIfNull(cTexture);
|
||||||
|
|
||||||
|
var bitmap = cTexture.ToSkBitmap();
|
||||||
|
var data = bitmap.Encode(imageFormat, imageQuality);
|
||||||
|
|
||||||
|
return data.ToArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,6 @@ import {
|
|||||||
import { chunk } from "lodash-es";
|
import { chunk } from "lodash-es";
|
||||||
import { useMemo } from "react";
|
import { useMemo } from "react";
|
||||||
import { equipmentColumns } from "../../config/equipment";
|
import { equipmentColumns } from "../../config/equipment";
|
||||||
import { catImages } from "../../config/images";
|
|
||||||
import {
|
import {
|
||||||
alternativeLines,
|
alternativeLines,
|
||||||
isAlternativeLine,
|
isAlternativeLine,
|
||||||
@@ -148,6 +147,10 @@ function EquipmentOption({
|
|||||||
columnIndex,
|
columnIndex,
|
||||||
}: EquipmentOptionProps) {
|
}: EquipmentOptionProps) {
|
||||||
const equipmentIndex = rowIndex * equipmentColumns + columnIndex;
|
const equipmentIndex = rowIndex * equipmentColumns + columnIndex;
|
||||||
|
const tank = useProtagonist();
|
||||||
|
const equipment = useEquipment(tank.tank!);
|
||||||
|
const slot = equipment.preset.slots[equipmentIndex];
|
||||||
|
const id = slot.options_catalog_i_ds[optionIndex];
|
||||||
|
|
||||||
const isSelected = Tankopedia.use(
|
const isSelected = Tankopedia.use(
|
||||||
(state) =>
|
(state) =>
|
||||||
@@ -172,7 +175,7 @@ function EquipmentOption({
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<img src={catImages.squareTransparent} />
|
<img src={`/media/equipment/${id}.webp`} />
|
||||||
</Button>
|
</Button>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,11 @@ let _game: GameInterface | null = null;
|
|||||||
|
|
||||||
if (!clientUnmounted) {
|
if (!clientUnmounted) {
|
||||||
const { GameInterface } = await import("@blitzkit/game");
|
const { GameInterface } = await import("@blitzkit/game");
|
||||||
_game = new GameInterface(assertSecret(import.meta.env.PUBLIC_WOTB_CLIENT));
|
_game = new GameInterface(
|
||||||
|
assertSecret(import.meta.env.PUBLIC_WOTB_CLIENT),
|
||||||
|
assertSecret(import.meta.env.WOTB_USMAP),
|
||||||
|
"../../temp",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const game = _game;
|
export const game = _game;
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import type { GetStaticPaths } from "astro";
|
||||||
|
import { isChunkEnabled } from "../../astro/isChunkEnabled";
|
||||||
|
|
||||||
|
export const getStaticPaths = (() => {
|
||||||
|
if (!isChunkEnabled("media")) return [];
|
||||||
|
return [{ params: { media: "media" } }];
|
||||||
|
}) satisfies GetStaticPaths;
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
import type { APIContext } from "astro";
|
||||||
|
import { api } from "../../../api/dynamic";
|
||||||
|
import { notFoundResponse } from "../../../api/responses";
|
||||||
|
import { mixStaticPaths } from "../../../astro/mixStaticPaths";
|
||||||
|
import { game } from "../../../game/game";
|
||||||
|
import { getStaticPaths as _getStaticPaths } from "../_index";
|
||||||
|
|
||||||
|
export const getStaticPaths = mixStaticPaths(_getStaticPaths, () => {
|
||||||
|
return api.metadata
|
||||||
|
.group("EquipmentEntity")
|
||||||
|
.map(({ id }) => ({ params: { id } }));
|
||||||
|
});
|
||||||
|
|
||||||
|
const HACK_nameMap: Record<string, string> = {
|
||||||
|
SystemsFineTuning: "SystemFineTuning",
|
||||||
|
};
|
||||||
|
|
||||||
|
export function GET({ params }: APIContext<never, { id: string }>) {
|
||||||
|
const item = api.metadata.item(params.id);
|
||||||
|
const assetDiscovery = item.BlitzStaticAssetsDiscovery();
|
||||||
|
const names = assetDiscovery.required_tags!.tags.map(
|
||||||
|
(tag) => tag.value.split(".").at(-1)!,
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const name of names) {
|
||||||
|
if (name in HACK_nameMap) {
|
||||||
|
names.push(HACK_nameMap[name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const icon = game!.equipmentIcon(names);
|
||||||
|
|
||||||
|
if (icon.length === 0) {
|
||||||
|
return notFoundResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
const array = new Uint8Array(icon);
|
||||||
|
|
||||||
|
return new Response(array);
|
||||||
|
}
|
||||||
Reference in new issue
Block a user