public void DebugLoadFileShape(string shapeFilePath) { var output = @"G:\NickProd\Farming Simulator 19\Temp"; var gameDirectory = GamePaths.GetGamePath(FarmSimulatorVersion.FarmingSimulator2017); var realtive = Path.GetRelativePath(gameDirectory, shapeFilePath); var shapeFile = new ShapeFile(shapeFilePath); var index = 0; try { shapeFile.ReadKnowTypes() .ForEach((v, i) => index = i); } catch (Exception e) { Console.WriteLine(e); throw; } //shapeFile.ReadRawNamedShape() // .ForEach( // v => // { // var dirOutName = Path.Combine(output, realtive); // if (!Directory.Exists(dirOutName)) // { // Directory.CreateDirectory(dirOutName); // } // File.WriteAllBytes(Path.Combine(dirOutName, $"[{v.Id}]_{FileTools.CleanFileName(v.Name)}.bin"), v.RawData); // }); }
public void ReadAllShapes(FarmSimulatorVersion version) { var hasError = false; var gamePath = GamePaths.GetGamePath(version); if (gamePath == null || !Directory.Exists(gamePath)) { Assert.Inconclusive($"Game path not found: {version}"); } var shapeFiles = Directory.GetFiles(gamePath, $"*{GameConstants.SchapesFileExtension}", SearchOption.AllDirectories); shapeFiles .AsParallel() .WithDegreeOfParallelism(Environment.ProcessorCount) .ForEach( filePath => { try { var container = new FileContainer(filePath); var entities = container.GetEntities(); foreach (var valueTuple in container.ReadRawData(entities)) { using (var stream = new MemoryStream(valueTuple.RawData)) { try { using (var reader = new EndianBinaryReader(stream, container.Endian, true)) { switch (valueTuple.Entity.Type) { case 1: var shape = new Shape(reader, container.Header.Version); break; case 2: var spline = new Spline(reader); break; case 3: var mesh = new NavMesh(reader); break; } } } catch { hasError = true; stream.Seek(0, SeekOrigin.Begin); using (var reader = new EndianBinaryReader(stream, container.Endian)) { SaveErrorShape( version, container.Header.Version, filePath, new RawNamedShapeObject(valueTuple.Entity.Type, reader, container.Endian) ); } } } } } catch (Exception ex) { hasError = true; } } ); Assert.IsFalse(hasError); }
public void ReadAllShapes() { var versions = new[] { FarmSimulatorVersion.FarmingSimulator2013, FarmSimulatorVersion.FarmingSimulator2015, FarmSimulatorVersion.FarmingSimulator2017, FarmSimulatorVersion.FarmingSimulator2019, }; var hasError = false; versions .Select(version => (Version: version, Path: GamePaths.GetGamePath(version))) .Where(v => v.Path != null) .SelectMany( v => { var shapeFiles = Directory.GetFiles(v.Path, $"*{GameConstants.SchapesFileExtension}", SearchOption.AllDirectories); return(shapeFiles.Select(file => (Version: v.Version, FilePath: file))); } ) .AsParallel() .WithDegreeOfParallelism(Environment.ProcessorCount) .ForEach( v => { try { var container = new FileContainer(v.FilePath); var entities = container.GetEntities(); foreach (var valueTuple in container.ReadRawData(entities)) { using (var stream = new MemoryStream(valueTuple.RawData)) { try { using (var reader = new EndianBinaryReader(stream, container.Endian, true)) { switch (valueTuple.Entity.Type) { case 1: var shape = new Shape(reader, container.Header.Version); break; case 2: var spline = new Spline(reader); break; case 3: var mesh = new NavMesh(reader); break; } } } catch { hasError = true; stream.Seek(0, SeekOrigin.Begin); using (var reader = new EndianBinaryReader(stream, container.Endian)) { SaveErrorShape( v.Version, v.FilePath, new RawNamedShapeObject(valueTuple.Entity.Type, reader, container.Endian) ); } } } } } catch (Exception ex) { hasError = true; } } ); Assert.False(hasError); }