private DataWrapper(string carDirectory) { _carDirectory = carDirectory; _cache = new Dictionary <string, AbstractDataFile>(); var dataAcd = Path.Combine(carDirectory, "data.acd"); if (File.Exists(dataAcd)) { _acd = Acd.FromFile(dataAcd); IsPacked = true; } else { var dataDirectory = Path.Combine(carDirectory, "data"); if (Directory.Exists(dataDirectory)) { _acd = Acd.FromDirectory(dataDirectory); } else { IsEmpty = true; } } }
public static Task <List <string> > TestData(string carDir, double weight) { return(Task.Run(() => { var errors = new List <string>(); try { var acdFile = Path.Combine(carDir, "data.acd"); var acd = File.Exists(acdFile) ? Acd.FromFile(acdFile) : null; var aeroIni = new IniFile(carDir, "aero.ini", acd); if (aeroIni.ContainsKey("DATA")) { errors.Add("acd-obsolete-aero-data"); } if (weight > 0) { var carIni = new IniFile(carDir, "car.ini", acd); if (Math.Abs(weight + 75.0 - carIni["BASIC"].GetDouble("TOTALMASS", 0d)) > 90.0) { errors.Add("acd-invalid-weight"); } } } catch (Exception) { errors.Add("acd-test-error"); } GC.Collect(); return errors; })); }
private void Load() { if (_acd != null || Mode == StorageMode.AcdFile) { // ReSharper disable once AssignNullToNotNullAttribute // with StorageMode.AcdFile, Filename is not null // TODO: sort everything better var acd = _acd ?? Acd.FromFile(Filename); var entry = acd.GetEntry(Name); if (entry != null) { ParseString(entry.ToString()); } else { Clear(); } } else if (Filename != null && File.Exists(Filename)) { ParseString(File.ReadAllText(Filename)); } else { Clear(); } }
public void Refresh([CanBeNull] string localName) { lock (_cache) { if (localName == null) { _cache.Clear(); } else if (_cache.ContainsKey(localName)) { _cache.Remove(localName); } var dataAcd = Path.Combine(_carDirectory, "data.acd"); if (File.Exists(dataAcd)) { if (!IsPacked) { _cache.Clear(); } _acd = Acd.FromFile(dataAcd); IsPacked = true; IsEmpty = false; } else { if (IsPacked) { _cache.Clear(); } IsPacked = false; var dataDirectory = Path.Combine(_carDirectory, "data"); if (Directory.Exists(dataDirectory)) { _acd = Acd.FromDirectory(dataDirectory); IsEmpty = false; } else { IsEmpty = true; } } OnDataChanged(localName); } }
private void UpdateAcd(bool backup) { var acd = _acd; if (acd != null) { if (acd.IsPacked) { acd.SetEntry(Name, Stringify()); acd.Save(_acdFilename); } else { SaveTo(acd.GetFilename(Name), backup); } } else { var filename = Filename; if (filename == null) { throw new Exception("File wasn’t loaded to be saved like this"); } acd = Acd.FromFile(filename); acd.SetEntry(Name, Stringify()); if (File.Exists(filename)) { if (backup) { FileUtils.Recycle(filename); } else { File.Delete(filename); } } acd.Save(filename); } }
protected override void RefreshOverride(string name) { var dataAcd = Path.Combine(ParentDirectory, "data.acd"); if (File.Exists(dataAcd)) { if (!IsPacked) { ClearCache(); } _acd = Acd.FromFile(dataAcd); SetIsPacked(true); SetIsEmpty(false); } else { if (IsPacked) { ClearCache(); } SetIsPacked(false); var dataDirectory = Path.Combine(ParentDirectory, "data"); if (Directory.Exists(dataDirectory)) { _acd = Acd.FromDirectory(dataDirectory); SetIsEmpty(false); } else { SetIsEmpty(true); } } OnDataChanged(name); }
private DataWrapper([NotNull] string carDirectory) { ParentDirectory = carDirectory; var dataAcd = Path.Combine(carDirectory, PackedFileName); if (File.Exists(dataAcd)) { _acd = Acd.FromFile(dataAcd); SetIsPacked(true); } else { var dataDirectory = Path.Combine(carDirectory, UnpackedDirectoryName); if (Directory.Exists(dataDirectory)) { _acd = Acd.FromDirectory(dataDirectory); } else { SetIsEmpty(true); } } }
public string GetHash(string carDir) { var acdFilename = Path.Combine(carDir, "data.acd"); var acdFile = File.Exists(acdFilename) ? Acd.FromFile(acdFilename) : null; var files = new Dictionary <string, IniFile>(); var result = new StringBuilder(); foreach (var rule in _rules) { if (!files.ContainsKey(rule.Filename)) { files[rule.Filename] = new IniFile(carDir, rule.Filename, acdFile); } var file = files[rule.Filename]; if (file[rule.Section].ContainsKey(rule.Property)) { var propertyValue = file[rule.Section].GetPossiblyEmpty(rule.Property)?.Trim(); if (propertyValue == null) { continue; } switch (rule.Type) { case RuleType.Vector2: case RuleType.Vector3: case RuleType.Vector4: { if (propertyValue.Length == 0) { break; } var value = propertyValue.Split(',').Select(x => { double parsed; double.TryParse(x.Trim(), NumberStyles.Any, CultureInfo.InvariantCulture, out parsed); return(parsed); }).ToList(); var len = rule.Type == RuleType.Vector2 ? 2 : rule.Type == RuleType.Vector3 ? 3 : 4; if (value.Count == len) { for (var i = 0; i < len; i++) { if (i > 0) { result.Append(","); } value[i] /= rule.GetDoubleParam(i, rule.GetDoubleParam(0, 1.0)); result.Append(Math.Round(value[i]).ToString("F0")); } } break; } case RuleType.Number: { double parsed; double.TryParse(propertyValue, NumberStyles.Any, CultureInfo.InvariantCulture, out parsed); parsed /= rule.GetDoubleParam(0, 1.0); result.Append(Math.Round(parsed).ToString("F0")); break; } case RuleType.String: { result.Append(propertyValue); break; } } } result.Append("\n"); } return(Convert.ToBase64String(Encoding.UTF8.GetBytes(result.ToString()))); }
public static void CreateFakeCar([NotNull] CarObject source, string fakeCarId, [CanBeNull] Action <Acd> dataPreprocessor) { if (source == null) { throw new ArgumentNullException(nameof(source)); } var sw = Stopwatch.StartNew(); try { var path = Path.Combine(CarsManager.Instance.Directories.GetMainDirectory(), fakeCarId); var directory = new DirectoryInfo(path); if (!directory.Exists) { FileUtils.HardLinkOrCopyRecursive(source.Location, path, (filename, isDirectory) => { if (isDirectory) { return(false); } var relative = FileUtils.GetRelativePath(filename, source.Location).ToLower(); return(Regex.IsMatch(relative, @"^(?:animations\\\w*\.ksanim|skins\\[^\\]+\\(?!preview(?:_original)?\.jpg|ui_skin\.json)|texture\\|[^\\]+\.kn5|body_shadow\.png|tyre_shadow_\d\.png|driver_base_pos\.knh)")); }, true); CarObject.ReplaceSound(source, path); } else { var now = DateTime.Now; if ((now - directory.LastWriteTime).TotalMinutes > 1d) { return; } directory.LastWriteTime = now; } var dataFilename = Path.Combine(source.Location, "data.acd"); Acd acd; if (File.Exists(dataFilename)) { acd = Acd.FromFile(dataFilename); } else { var dataDirectory = Path.Combine(source.Location, "data"); if (Directory.Exists(dataDirectory)) { acd = Acd.FromDirectory(dataDirectory); } else { return; } } dataPreprocessor?.Invoke(acd); acd.Save(Path.Combine(path, "data.acd")); } finally { Logging.Debug($"Time taken to create {fakeCarId}: {sw.Elapsed.TotalMilliseconds:F1} ms"); } }