2025-02-25 15:15:03 -06:00
|
|
|
using System.Data;
|
2025-01-29 19:14:46 -06:00
|
|
|
using Blitzkit;
|
2025-01-28 12:59:59 -06:00
|
|
|
using BlitzKit.CLI.Models;
|
2025-02-25 15:15:03 -06:00
|
|
|
using CUE4Parse.UE4.Assets.Exports;
|
2025-02-02 00:25:47 -06:00
|
|
|
using CUE4Parse.UE4.Assets.Exports.Engine;
|
|
|
|
|
using CUE4Parse.UE4.Assets.Exports.StaticMesh;
|
2025-02-25 15:15:03 -06:00
|
|
|
using CUE4Parse.UE4.Assets.Objects;
|
2025-01-30 12:49:15 -06:00
|
|
|
using Google.Protobuf.Collections;
|
2025-01-29 19:14:46 -06:00
|
|
|
using Newtonsoft.Json.Linq;
|
2025-01-27 22:17:13 -06:00
|
|
|
|
2025-01-28 12:59:59 -06:00
|
|
|
namespace BlitzKit.CLI.Functions
|
2025-01-26 21:17:25 -06:00
|
|
|
{
|
2025-02-01 21:21:12 -06:00
|
|
|
public class Mangler
|
2025-01-26 21:17:25 -06:00
|
|
|
{
|
2025-02-01 21:21:12 -06:00
|
|
|
readonly Tanks tanks = new();
|
|
|
|
|
readonly BlitzProvider provider = new();
|
2025-01-27 22:17:13 -06:00
|
|
|
|
2025-02-01 21:21:12 -06:00
|
|
|
public void Mangle()
|
|
|
|
|
{
|
|
|
|
|
var nationDirs = provider.RootDirectory.GetDirectory("Blitz/Content/Tanks").Directories;
|
|
|
|
|
|
|
|
|
|
foreach (var nationDir in nationDirs)
|
2025-01-27 22:17:13 -06:00
|
|
|
{
|
2025-01-30 11:31:55 -06:00
|
|
|
if (nationDir.Key == "TankStub")
|
2025-01-27 22:17:13 -06:00
|
|
|
continue;
|
|
|
|
|
|
2025-02-01 21:21:12 -06:00
|
|
|
MangleNation(nationDir.Value);
|
2025-01-27 22:17:13 -06:00
|
|
|
}
|
2025-01-30 12:54:37 -06:00
|
|
|
}
|
2025-01-29 19:14:46 -06:00
|
|
|
|
2025-02-25 15:15:03 -06:00
|
|
|
void MangleNation(VFS nation)
|
2025-01-30 12:54:37 -06:00
|
|
|
{
|
2025-02-01 21:21:12 -06:00
|
|
|
foreach (var tankDir in nation.Directories)
|
2025-01-30 12:54:37 -06:00
|
|
|
{
|
2025-02-25 15:36:34 -06:00
|
|
|
// if (tankDir.Value.Name != "R90_IS_4")
|
|
|
|
|
// continue;
|
2025-01-30 12:54:37 -06:00
|
|
|
|
2025-02-01 21:21:12 -06:00
|
|
|
var tank = MangleTank(tankDir.Value);
|
2025-01-30 12:54:37 -06:00
|
|
|
|
2025-02-01 22:01:06 -06:00
|
|
|
if (tank == null)
|
|
|
|
|
continue;
|
|
|
|
|
|
2025-02-01 21:21:12 -06:00
|
|
|
tanks.Tanks_.Add(tank.Id);
|
|
|
|
|
}
|
2025-01-26 21:17:25 -06:00
|
|
|
}
|
2025-01-30 11:31:55 -06:00
|
|
|
|
2025-02-25 15:15:03 -06:00
|
|
|
Tank? MangleTank(VFS tankDir)
|
2025-02-01 21:21:12 -06:00
|
|
|
{
|
|
|
|
|
var pdaName = $"PDA_{tankDir.Name}";
|
2025-02-25 15:15:03 -06:00
|
|
|
var pda = provider.LoadObject($"{tankDir.Path}/{pdaName}.{pdaName}");
|
|
|
|
|
var hulls = PropertyUtil.Get<UDataTable>(pda, "DT_Hulls");
|
|
|
|
|
UDataTableUtility.TryGetDataTableRow(hulls, "hull", StringComparison.Ordinal, out var hull);
|
|
|
|
|
var hullVisualData = PropertyUtil.Get<UObject>(hull, "VisualData");
|
|
|
|
|
var hullMeshSettings = PropertyUtil.Get<FStructFallback>(hullVisualData, "MeshSettings");
|
|
|
|
|
var hullCollision = PropertyUtil.Get<UStaticMesh>(hullMeshSettings, "CollisionMesh");
|
2025-02-25 15:36:34 -06:00
|
|
|
MonoGltf hullCollisionGltf = new(hullCollision);
|
|
|
|
|
|
|
|
|
|
hullCollisionGltf.Write();
|
2025-02-01 22:01:06 -06:00
|
|
|
|
2025-02-25 15:15:03 -06:00
|
|
|
return new() { Id = "" };
|
2025-02-01 21:21:12 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Dictionary<string, CrewType> CrewTypes = new()
|
2025-01-30 12:49:15 -06:00
|
|
|
{
|
|
|
|
|
{ "EModuleOrTankmen::Commander", CrewType.Commander },
|
|
|
|
|
{ "EModuleOrTankmen::Driver", CrewType.Driver },
|
|
|
|
|
{ "EModuleOrTankmen::Gunner1", CrewType.Gunner1 },
|
|
|
|
|
{ "EModuleOrTankmen::Gunner2", CrewType.Gunner2 },
|
|
|
|
|
{ "EModuleOrTankmen::Loader1", CrewType.Loader1 },
|
|
|
|
|
{ "EModuleOrTankmen::Loader2", CrewType.Loader2 },
|
|
|
|
|
};
|
|
|
|
|
|
2025-02-01 21:21:12 -06:00
|
|
|
void MangleCrewHealth(RepeatedField<CrewHealth> map, JArray array)
|
2025-01-30 12:49:15 -06:00
|
|
|
{
|
|
|
|
|
foreach (var member in array.Cast<JObject>())
|
|
|
|
|
{
|
|
|
|
|
var key = member["Key"]!.Value<string>()!;
|
|
|
|
|
|
|
|
|
|
if (CrewTypes.TryGetValue(key, out var crewType))
|
|
|
|
|
{
|
|
|
|
|
CrewHealth crewHealth = new()
|
|
|
|
|
{
|
|
|
|
|
Type = crewType,
|
|
|
|
|
MaxHealth = member["Value"]!["MaxHealth"]!.Value<float>(),
|
|
|
|
|
};
|
|
|
|
|
map.Add(crewHealth);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw new Exception($"Unrecognized CrewType: {key}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-01 21:21:12 -06:00
|
|
|
ModuleHealth MangleModuleHealth(JObject obj)
|
2025-01-30 11:31:55 -06:00
|
|
|
{
|
|
|
|
|
ModuleHealth moduleHealth = new()
|
|
|
|
|
{
|
|
|
|
|
MaxHealth = obj["MaxHealth"]!.Value<float>(),
|
|
|
|
|
MaxRegenHealth = obj["MaxRegenHealth"]!.Value<float>(),
|
|
|
|
|
HealthRegenPerSec = obj["HealthRegenPerSec"]!.Value<float>(),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (obj.TryGetValue("HysteresisHealth", out var hysteresis))
|
|
|
|
|
{
|
|
|
|
|
moduleHealth.HysteresisHealth = hysteresis.Value<float>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (obj.TryGetValue("HealthBurnPerSec", out var burn))
|
|
|
|
|
{
|
|
|
|
|
moduleHealth.HealthBurnPerSec = burn.Value<float>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return moduleHealth;
|
|
|
|
|
}
|
2025-01-26 21:17:25 -06:00
|
|
|
}
|
|
|
|
|
}
|