XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
UTF-8
using Newtonsoft.Json;
using VRage.Game;
using SpaceEngineersBlueprintEditor.GameAssemblyLoader;
using SpaceEngineersBlueprintEditor.SpaceEngineersCore;
using System.Runtime.CompilerServices;

public class Program
{
    private static void Main(string[] args)
    {
        try
        {
            var gameRoot = GameAssemblyLoader.EnsureInitialized();
            ConvertFiles(args, gameRoot);
        }
        catch (Exception ex)
        {
            Environment.ExitCode = 1;
            Console.Write($"Error:{ex.Message}");
        }
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    private static void ConvertFiles(string[] args, string gameRoot)
    {
        Initializer.Initialize(
            Path.Combine(gameRoot, "Content"),
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "SpaceEngineers"));

        if (TryReadOption(args, "--input", out var inputPath) &&
            TryReadOption(args, "--output", out var outputPath))
        {
            ConvertJsonFile(inputPath, outputPath);
            return;
        }

        if (args.Length == 3 && string.Equals(args[0], "--roundtrip", StringComparison.OrdinalIgnoreCase))
        {
            var definitions = SpaceEngineerDefinitions.Load<MyObjectBuilder_Definitions>(args[1]);
            SpaceEngineerDefinitions.Save(args[2], definitions);
            Console.Write("Successful");
            return;
        }

        foreach (var arg in args)
        {
            ConvertJsonFile(arg, $"{arg}.sbc");
        }
    }

    private static void ConvertJsonFile(string inputPath, string outputPath)
    {
        if (!File.Exists(inputPath))
        {
            throw new FileNotFoundException($"File not found: {inputPath}", inputPath);
        }

        var definitions = JsonConvert.DeserializeObject<MyObjectBuilder_Definitions>(
            File.ReadAllText(inputPath),
            new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto })
            ?? throw new InvalidDataException($"File could not be deserialized: {inputPath}");
        SpaceEngineerDefinitions.Save(outputPath, definitions);
        Console.Write("Successful");
    }

    private static bool TryReadOption(string[] args, string option, out string value)
    {
        var index = Array.FindIndex(args, argument =>
            string.Equals(argument, option, StringComparison.OrdinalIgnoreCase));
        if (index >= 0 && index + 1 < args.Length)
        {
            value = args[index + 1];
            return true;
        }

        value = string.Empty;
        return false;
    }
}