From 5c32a77179875341fd2de370d926324b4e8b7dcd Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 28 Feb 2016 20:13:14 +0000 Subject: [PATCH] Don't dispose mod packages when returning to mod chooser. --- OpenRA.Game/FileSystem/FileSystem.cs | 41 ++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/OpenRA.Game/FileSystem/FileSystem.cs b/OpenRA.Game/FileSystem/FileSystem.cs index 9c92de38bb..94f92215cb 100644 --- a/OpenRA.Game/FileSystem/FileSystem.cs +++ b/OpenRA.Game/FileSystem/FileSystem.cs @@ -32,6 +32,9 @@ namespace OpenRA.FileSystem readonly Dictionary mountedPackages = new Dictionary(); readonly Dictionary explicitMounts = new Dictionary(); + // Mod packages that should not be disposed + readonly List modPackages = new List(); + Cache> fileIndex = new Cache>(_ => new List()); public IReadOnlyPackage OpenPackage(string filename) @@ -106,18 +109,25 @@ namespace OpenRA.FileSystem if (optional) name = name.Substring(1); - var modPackage = name.StartsWith("$"); - if (modPackage) - name = name.Substring(1); - - Action a = () => Mount(modPackage ? ModMetadata.AllMods[name].Package : OpenPackage(name), explicitName); - if (optional) + try { - try { a(); } - catch { } + IReadOnlyPackage package; + if (name.StartsWith("$")) + { + name = name.Substring(1); + package = ModMetadata.AllMods[name].Package; + modPackages.Add(package); + } + else + package = OpenPackage(name); + + Mount(package, explicitName); + } + catch + { + if (!optional) + throw; } - else - a(); } public void Mount(IReadOnlyPackage package, string explicitName = null) @@ -166,7 +176,11 @@ namespace OpenRA.FileSystem foreach (var key in explicitKeys) explicitMounts.Remove(key); - package.Dispose(); + // Mod packages aren't owned by us, so we shouldn't dispose them + if (modPackages.Contains(package)) + modPackages.Remove(package); + else + package.Dispose(); } else mountedPackages[package] = mountCount; @@ -177,10 +191,13 @@ namespace OpenRA.FileSystem public void UnmountAll() { foreach (var package in mountedPackages.Keys) - package.Dispose(); + if (!modPackages.Contains(package)) + package.Dispose(); mountedPackages.Clear(); explicitMounts.Clear(); + modPackages.Clear(); + fileIndex = new Cache>(_ => new List()); }