mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 10:47:04 +02:00
feat: some things
This commit is contained in:
1 parent
292f7aeac0
commit
ac1323a463
14 files changed
+149
-19
No files matched your search
@@ -4,3 +4,6 @@
|
||||
[submodule "submodules/CUE4Parse"]
|
||||
path = submodules/CUE4Parse
|
||||
url = https://github.com/FabianFG/CUE4Parse
|
||||
[submodule "submodules/UAssetAPI"]
|
||||
path = submodules/UAssetAPI
|
||||
url = https://github.com/atenfyr/UAssetAPI
|
||||
Vendored
+2
@@ -144,6 +144,7 @@
|
||||
"playerachievements",
|
||||
"playerinfo",
|
||||
"playform",
|
||||
"Playtest",
|
||||
"pngjs",
|
||||
"POSITIVEX",
|
||||
"POSITIVEY",
|
||||
@@ -197,6 +198,7 @@
|
||||
"TYPELESS",
|
||||
"uasset",
|
||||
"ubjson",
|
||||
"uexp",
|
||||
"Unicum",
|
||||
"UNLOCALIZED",
|
||||
"UNORM",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"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",
|
||||
"mangle2": "cd src/BlitzKit.CLI && dotnet run mangle2",
|
||||
"api": "cd src/BlitzKit.CLI && dotnet run api",
|
||||
"dev:api": "cd src/BlitzKit.CLI && dotnet watch run api"
|
||||
},
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../../submodules/CUE4Parse/CUE4Parse-Conversion/CUE4Parse-Conversion.csproj" />
|
||||
<ProjectReference Include="../../submodules/CUE4Parse/CUE4Parse/CUE4Parse.csproj" />
|
||||
<ProjectReference Include="../../submodules/UAssetAPI/UAssetAPI/UAssetAPI.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -218,7 +218,7 @@ namespace BlitzKit.CLI.Functions
|
||||
async Task<Tank> MangleTank(VFS tankDir)
|
||||
{
|
||||
var pdaName = $"PDA_{tankDir.Name}";
|
||||
var pda = provider.LoadObject($"{tankDir.Path}/{pdaName}.{pdaName}");
|
||||
var pda = provider.LoadPackageObject($"{tankDir.Path}/{pdaName}.{pdaName}");
|
||||
|
||||
var id = pda.Get<FName>("TankId").Text;
|
||||
var name = GetString($"TankEntity__{id.ToLowerInvariant()}__Short_Name");
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
using BlitzKit.CLI.Models;
|
||||
using UAssetAPI;
|
||||
using UAssetAPI.ExportTypes;
|
||||
using UAssetAPI.PropertyTypes.Objects;
|
||||
using UAssetAPI.UnrealTypes;
|
||||
using UAssetAPI.Unversioned;
|
||||
|
||||
namespace BlitzKit.CLI.Functions
|
||||
{
|
||||
public partial class Mangler2(string[] args)
|
||||
{
|
||||
readonly BlitzProvider2 provider = new();
|
||||
|
||||
public void Mangle()
|
||||
{
|
||||
var assetPath = "Blitz/Content/Tanks/USSR/R45_IS_7/PDA_R45_IS_7";
|
||||
|
||||
Console.WriteLine(provider.Asset(assetPath));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -28,11 +28,12 @@ namespace BlitzKit.CLI.Functions
|
||||
DefaultFileProvider provider0 = new(
|
||||
directory: new DirectoryInfo(pak0Path),
|
||||
searchOption: SearchOption.TopDirectoryOnly,
|
||||
versions: new(EGame.GAME_UE5_3)
|
||||
versions: new(EGame.GAME_UE5_3),
|
||||
pathComparer: StringComparer.OrdinalIgnoreCase
|
||||
);
|
||||
provider0.Initialize();
|
||||
provider0.Mount();
|
||||
provider0.TryFindGameFile("Blitz/Config/DefaultDlc.ini", out var defaultDlcGameFile);
|
||||
provider0.TryGetGameFile("Blitz/Config/DefaultDlc.ini", out var defaultDlcGameFile);
|
||||
|
||||
if (defaultDlcGameFile is not FPakEntry)
|
||||
throw new Exception("Failed to find DefaultDlc.ini");
|
||||
|
||||
@@ -21,7 +21,8 @@ namespace BlitzKit.CLI.Models
|
||||
directory: new DirectoryInfo(depot ? DEPOT_CONTAINERS_PATH : LOCAL_BUNDLED_CONTAINERS_PATH),
|
||||
extraDirectories: depot ? [] : [new(LOCAL_DLC_CONTAINERS_PATH)],
|
||||
searchOption: SearchOption.TopDirectoryOnly,
|
||||
versions: new(EGame.GAME_UE5_3)
|
||||
versions: new(EGame.GAME_UE5_3),
|
||||
pathComparer: StringComparer.OrdinalIgnoreCase
|
||||
)
|
||||
{
|
||||
RootDirectory = new()
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
using System.Text.Json;
|
||||
using Org.BouncyCastle.Tls.Crypto.Impl.BC;
|
||||
using UAssetAPI;
|
||||
using UAssetAPI.UnrealTypes;
|
||||
using UAssetAPI.Unversioned;
|
||||
|
||||
namespace BlitzKit.CLI.Models
|
||||
{
|
||||
public class BlitzProvider2 : IDisposable
|
||||
{
|
||||
readonly EngineVersion Version = EngineVersion.VER_UE5_3;
|
||||
|
||||
readonly string BUNDLED_CONTAINERS_DIR = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
|
||||
"Steam",
|
||||
"steamapps",
|
||||
"common",
|
||||
"World of Tanks Blitz Playtest",
|
||||
"Blitz",
|
||||
"Content",
|
||||
"Paks"
|
||||
);
|
||||
readonly string DLC_CONTAINERS_DIR = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
|
||||
"Blitz",
|
||||
"Saved",
|
||||
"PersistentDownloadDir",
|
||||
"Dlc",
|
||||
"PakCache"
|
||||
);
|
||||
readonly Usmap Map = new("../../submodules/blitzkit-closed/blitz.usmap");
|
||||
|
||||
readonly Dictionary<string, (PakReader Reader, Stream Stream)> FileMap = [];
|
||||
readonly List<PakReader> Readers = [];
|
||||
|
||||
public BlitzProvider2()
|
||||
{
|
||||
var containers = new List<string>(
|
||||
Directory.GetFiles(BUNDLED_CONTAINERS_DIR, "*.pak", SearchOption.TopDirectoryOnly)
|
||||
);
|
||||
|
||||
var localManifest =
|
||||
JsonSerializer.Deserialize<LocalManifest>(
|
||||
File.ReadAllText(Path.Combine(DLC_CONTAINERS_DIR, "LocalManifest.json"))
|
||||
) ?? throw new Exception("Failed to deserialize LocalManifest.json");
|
||||
|
||||
containers.AddRange(
|
||||
localManifest.PakFiles.Keys.Select(file => Path.Combine(DLC_CONTAINERS_DIR, file))
|
||||
);
|
||||
|
||||
foreach (string container in containers)
|
||||
{
|
||||
using var stream = File.OpenRead(container);
|
||||
var reader =
|
||||
new PakBuilder().Reader(stream) ?? throw new Exception("Failed to create PakReader");
|
||||
|
||||
Readers.Add(reader);
|
||||
|
||||
foreach (var file in reader.Files())
|
||||
{
|
||||
FileMap[file] = (reader, stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public UAsset Asset(string path)
|
||||
{
|
||||
var assetPath = $"{path}.uasset";
|
||||
var expPath = $"{path}.uexp";
|
||||
|
||||
var (reader, stream) = FileMap[assetPath];
|
||||
|
||||
byte[] assetBytes = reader.Get(stream, assetPath);
|
||||
byte[] uexpBytes = reader.Get(stream, expPath);
|
||||
|
||||
MemoryStream assetStream = new([.. assetBytes, .. uexpBytes]);
|
||||
AssetBinaryReader assetReader = new(assetStream);
|
||||
|
||||
return new(assetReader, Version, Map);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
foreach (var reader in Readers)
|
||||
{
|
||||
reader.Dispose();
|
||||
}
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -254,14 +254,14 @@ namespace BlitzKit.CLI.Models
|
||||
int[] indices
|
||||
)
|
||||
{
|
||||
var uvs1 = new List<Vector2>() { vert1.UV };
|
||||
var uvs2 = new List<Vector2>() { vert2.UV };
|
||||
var uvs3 = new List<Vector2>() { vert3.UV };
|
||||
var uvs1 = new List<Vector2>() { (Vector2)vert1.UV };
|
||||
var uvs2 = new List<Vector2>() { (Vector2)vert2.UV };
|
||||
var uvs3 = new List<Vector2>() { (Vector2)vert3.UV };
|
||||
foreach (var uv in uvs)
|
||||
{
|
||||
uvs1.Add(uv[indices[0]]);
|
||||
uvs2.Add(uv[indices[1]]);
|
||||
uvs3.Add(uv[indices[2]]);
|
||||
uvs1.Add((Vector2)uv[indices[0]]);
|
||||
uvs2.Add((Vector2)uv[indices[1]]);
|
||||
uvs3.Add((Vector2)uv[indices[2]]);
|
||||
}
|
||||
|
||||
return (uvs1, uvs2, uvs3);
|
||||
|
||||
@@ -16,16 +16,23 @@ namespace BlitzKit.CLI
|
||||
|
||||
switch (args[0])
|
||||
{
|
||||
case "unpack":
|
||||
{
|
||||
await Unpacker.Unpack(args);
|
||||
break;
|
||||
}
|
||||
// case "unpack":
|
||||
// {
|
||||
// await Unpacker.Unpack(args);
|
||||
// break;
|
||||
// }
|
||||
|
||||
case "mangle":
|
||||
// case "mangle":
|
||||
// {
|
||||
// Mangler mangler = new(args);
|
||||
// await mangler.Mangle();
|
||||
// break;
|
||||
// }
|
||||
|
||||
case "mangle2":
|
||||
{
|
||||
Mangler mangler = new(args);
|
||||
await mangler.Mangle();
|
||||
Mangler2 mangler2 = new(args);
|
||||
mangler2.Mangle();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
+1
-1
Submodule submodules/CUE4Parse updated: 624e07c8c3...920dc16822.
Submodule
+1
Submodule submodules/UAssetAPI added at c380bf3d6d.
Reference in new issue
Block a user