diff --git a/OpenRA.Mods.Common/ModContent.cs b/OpenRA.Mods.Common/ModContent.cs index 306647deec..2950b4e748 100644 --- a/OpenRA.Mods.Common/ModContent.cs +++ b/OpenRA.Mods.Common/ModContent.cs @@ -48,13 +48,18 @@ namespace OpenRA public readonly string RegistryValue; public readonly string Title; - public readonly Dictionary IDFiles; + [FieldLoader.Ignore] public readonly MiniYaml IDFiles; [FieldLoader.Ignore] public readonly List Install; public ModSource(MiniYaml yaml) { Title = yaml.Value; + + var idFiles = yaml.Nodes.FirstOrDefault(n => n.Key == "IDFiles"); + if (idFiles != null) + IDFiles = idFiles.Value; + var installNode = yaml.Nodes.FirstOrDefault(n => n.Key == "Install"); if (installNode != null) Install = installNode.Value.Nodes; diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromDiscLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromDiscLogic.cs index 6579952a74..dfda50c049 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromDiscLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallFromDiscLogic.cs @@ -505,15 +505,34 @@ namespace OpenRA.Mods.Common.Widgets.Logic { try { - foreach (var kv in source.IDFiles) + foreach (var kv in source.IDFiles.Nodes) { var filePath = Path.Combine(path, kv.Key); if (!File.Exists(filePath)) return false; using (var fileStream = File.OpenRead(filePath)) - if (CryptoUtil.SHA1Hash(fileStream) != kv.Value) - return false; + { + var offsetNode = kv.Value.Nodes.FirstOrDefault(n => n.Key == "Offset"); + var lengthNode = kv.Value.Nodes.FirstOrDefault(n => n.Key == "Length"); + if (offsetNode != null || lengthNode != null) + { + var offset = 0L; + if (offsetNode != null) + offset = FieldLoader.GetValue("Offset", offsetNode.Value.Value); + + var length = fileStream.Length - offset; + if (lengthNode != null) + length = FieldLoader.GetValue("Length", lengthNode.Value.Value); + + fileStream.Position = offset; + var data = fileStream.ReadBytes((int)length); + if (CryptoUtil.SHA1Hash(data) != kv.Value.Value) + return false; + } + else if (CryptoUtil.SHA1Hash(fileStream) != kv.Value.Value) + return false; + } } } catch (Exception)