diff --git a/src/BlitzKit.CLI/Functions/Mangler.cs b/src/BlitzKit.CLI/Functions/Mangler.cs index 3ad1a3be4..5847aece4 100644 --- a/src/BlitzKit.CLI/Functions/Mangler.cs +++ b/src/BlitzKit.CLI/Functions/Mangler.cs @@ -36,6 +36,14 @@ namespace BlitzKit.CLI.Functions { $"{PenetrationGroupNameMapPrefix}::TANK_PART_GUN", "gun" }, }; + private static readonly List CollisionDTs = + [ + "DT_Chassis", + "DT_Hulls", + "DT_Turrets", + "DT_Guns", + ]; + [GeneratedRegex("[^a-z0-9]")] private static partial Regex NonAlphanumericRegex(); @@ -48,7 +56,7 @@ namespace BlitzKit.CLI.Functions readonly BlitzProvider provider = new(args.Contains("--depot")); Locales? locales; readonly Dictionary> strings = []; - readonly AssetUploader assetUploader = new("mangled ue assets"); + readonly AssetUploader assetUploader = new("mangled ue assets") { disabled = false }; public async Task Mangle() { @@ -123,6 +131,9 @@ namespace BlitzKit.CLI.Functions // 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); } @@ -223,7 +234,7 @@ namespace BlitzKit.CLI.Functions slug = MultipleDashesRegex().Replace(slug, "-"); slug = TrailingDashRegex().Replace(slug, ""); - await MangleHull(pda); + await MangleCollision(id, pda); // await MangleIcon(pda); // await MangleArmor(pda); @@ -309,40 +320,34 @@ namespace BlitzKit.CLI.Functions } } - async Task MangleHull(UObject pda) + async Task MangleModuleCollision(string id, UDataTable dt) { - var id = PropertyUtil.Get(pda, "TankId").Text; + foreach (var row in dt.RowMap) + { + var moduleName = row.Key.Text; + var visualData = PropertyUtil.Get(row.Value, "VisualData"); + var meshSettings = PropertyUtil.Get(visualData, "MeshSettings"); - var hullsDt = PropertyUtil.Get(pda, "DT_Hulls"); - var chassisDt = PropertyUtil.Get(pda, "DT_Chassis"); + if (PropertyUtil.TryGet(meshSettings, "CollisionMesh", out var collision)) + { + MonoGltf gltf = new(collision); - UDataTableUtility.TryGetDataTableRow(hullsDt, "hull", StringComparison.Ordinal, out var hull); - UDataTableUtility.TryGetDataTableRow( - chassisDt, - "chassis", - StringComparison.Ordinal, - out var chassis - ); + await assetUploader.Add(new($"tanks/{id}/collision/{moduleName}.glb", gltf.Write())); + } + else + { + PrettyLog.Warn($"No collision mesh found for {id} {moduleName}; skipping..."); + } + ; + } + } - var hullVisualData = PropertyUtil.Get(hull, "VisualData"); - var chassisVisualData = PropertyUtil.Get(chassis, "VisualData"); - - var hullMeshSettings = PropertyUtil.Get(hullVisualData, "MeshSettings"); - var chassisMeshSettings = PropertyUtil.Get( - chassisVisualData, - "MeshSettings" - ); - - var hullCollision = PropertyUtil.Get(hullMeshSettings, "CollisionMesh"); - var chassisCollision = PropertyUtil.Get(chassisMeshSettings, "CollisionMesh"); - - MonoGltf hullCollisionGltf = new(hullCollision); - MonoGltf chassisCollisionGltf = new(chassisCollision); - - await assetUploader.Add(new($"tanks/{id}/collision/hull.glb", hullCollisionGltf.Write())); - await assetUploader.Add( - new($"tanks/{id}/collision/chassis.glb", chassisCollisionGltf.Write()) - ); + async Task MangleCollision(string id, UObject pda) + { + foreach (var name in CollisionDTs) + { + await MangleModuleCollision(id, PropertyUtil.Get(pda, name)); + } } } } diff --git a/src/BlitzKit.CLI/Models/AssetUploader.cs b/src/BlitzKit.CLI/Models/AssetUploader.cs index f3028216d..c74998139 100644 --- a/src/BlitzKit.CLI/Models/AssetUploader.cs +++ b/src/BlitzKit.CLI/Models/AssetUploader.cs @@ -10,6 +10,7 @@ namespace BlitzKit.CLI.Models { public class AssetUploader(string message) { + public required bool disabled; private static readonly int TIME_PER_BLOB = (int)Math.Pow(2, 4) * 10000; private static readonly int TIME_BETWEEN_BLOBS = (int)(60 * 60 * 1000 / 5000 / 0.9); private static readonly int MAX_TREE_SIZE = 7_000_000; // 7MB @@ -30,6 +31,11 @@ namespace BlitzKit.CLI.Models public async Task Add(FileChange change) { + if (disabled) + { + return; + } + var blobPath = $"{repo}/{branch}/{change.Path}"; HttpResponseMessage response = await httpClient.GetAsync( $"https://raw.githubusercontent.com/{blobPath}" @@ -103,8 +109,10 @@ namespace BlitzKit.CLI.Models public async Task Flush() { - if (changes.Count == 0) + if (disabled || changes.Count == 0) + { return; + } var repoRawSplit = repo.Split('/'); var owner = repoRawSplit[0];