diff --git a/Barotrauma/BarotraumaClient/Source/Networking/SteamManager.cs b/Barotrauma/BarotraumaClient/Source/Networking/SteamManager.cs index 4b27e024c..a7e1a484b 100644 --- a/Barotrauma/BarotraumaClient/Source/Networking/SteamManager.cs +++ b/Barotrauma/BarotraumaClient/Source/Networking/SteamManager.cs @@ -594,8 +594,15 @@ namespace Barotrauma.Steam } SaveUtil.ClearFolder(WorkshopItemStagingFolder); - Directory.Delete(WorkshopItemStagingFolder); File.Delete(PreviewImageName); + try + { + Directory.Delete(WorkshopItemStagingFolder); + } + catch (Exception e) + { + DebugConsole.ThrowError("Failed to delete Workshop item staging folder.", e); + } yield return CoroutineStatus.Success; } @@ -927,28 +934,50 @@ namespace Barotrauma.Steam { if (instance == null || !instance.isInitialized) { return false; } - bool itemsUpdated = false; - foreach (ulong subscribedItemId in instance.client.Workshop.GetSubscribedItemIds()) + bool? itemsUpdated = null; + bool timedOut = false; + var query = instance.client.Workshop.CreateQuery(); + query.FileId = new List(instance.client.Workshop.GetSubscribedItemIds()); + query.UploaderAppId = AppID; + query.Run(); + query.OnResult = (Workshop.Query q) => { - //TODO: fix this, GetItem doesn't query item.Modified - var item = instance.client.Workshop.GetItem(subscribedItemId); - if (item.Installed && CheckWorkshopItemEnabled(item) && !CheckWorkshopItemUpToDate(item)) + if (timedOut) { return; } + itemsUpdated = false; + foreach (var item in q.Items) { - if (!UpdateWorkshopItem(item, out string errorMsg)) + if (item.Installed && CheckWorkshopItemEnabled(item) && !CheckWorkshopItemUpToDate(item)) { - DebugConsole.ThrowError(errorMsg); - new GUIMessageBox( - TextManager.Get("Error"), - TextManager.GetWithVariables("WorkshopItemUpdateFailed", new string[2] { "[itemname]", "[errormessage]" }, new string[2] { item.Title, errorMsg })); - } - else - { - new GUIMessageBox("", TextManager.GetWithVariable("WorkshopItemUpdated", "[itemname]", item.Title)); - itemsUpdated = true; + if (!UpdateWorkshopItem(item, out string errorMsg)) + { + DebugConsole.ThrowError(errorMsg); + new GUIMessageBox( + TextManager.Get("Error"), + TextManager.GetWithVariables("WorkshopItemUpdateFailed", new string[2] { "[itemname]", "[errormessage]" }, new string[2] { item.Title, errorMsg })); + } + else + { + new GUIMessageBox("", TextManager.GetWithVariable("WorkshopItemUpdated", "[itemname]", item.Title)); + itemsUpdated = true; + } } } + }; + + DateTime timeOut = DateTime.Now + new TimeSpan(0, 0, 10); + while (!itemsUpdated.HasValue) + { + if (DateTime.Now > timeOut) + { + itemsUpdated = false; + timedOut = true; + break; + } + instance.client.Update(); + System.Threading.Thread.Sleep(10); } - return itemsUpdated; + + return itemsUpdated.Value; } public static bool UpdateWorkshopItem(Workshop.Item item, out string errorMsg) diff --git a/Barotrauma/BarotraumaClient/Source/Screens/SteamWorkshopScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/SteamWorkshopScreen.cs index ce5b54c2d..a6a6d84e0 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/SteamWorkshopScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/SteamWorkshopScreen.cs @@ -1081,6 +1081,7 @@ namespace Barotrauma { InitialDirectory = Path.GetFullPath(SteamManager.WorkshopItemStagingFolder), Title = TextManager.Get("workshopitemaddfiles"), + Multiselect = true }; if (ofd.ShowDialog() == DialogResult.OK) { @@ -1228,7 +1229,7 @@ namespace Barotrauma private void OnAddFilesSelected(string[] fileNames) { if (fileNames == null) { return; } - for(int i = 0; i < fileNames.Length; i++) + for (int i = 0; i < fileNames.Length; i++) { string file = fileNames[i]; if (string.IsNullOrEmpty(file)) { continue; } @@ -1258,6 +1259,7 @@ namespace Barotrauma itemContentPackage.AddFile(filePathRelativeToStagingFolder, ContentType.None); } } + itemContentPackage.Save(itemContentPackage.Path); RefreshCreateItemFileList(); } @@ -1331,6 +1333,7 @@ namespace Barotrauma OnClicked = (btn, userdata) => { itemContentPackage.RemoveFile(contentFile); + itemContentPackage.Save(itemContentPackage.Path); RefreshCreateItemFileList(); return true; } @@ -1346,7 +1349,7 @@ namespace Barotrauma { if (itemContentPackage == null || itemEditor == null) return; - SteamManager.StartPublishItem(itemContentPackage, itemEditor); + SteamManager.StartPublishItem(itemContentPackage, itemEditor); CoroutineManager.StartCoroutine(WaitForPublish(itemEditor), "WaitForPublish"); } diff --git a/Barotrauma/BarotraumaShared/Source/Utils/SaveUtil.cs b/Barotrauma/BarotraumaShared/Source/Utils/SaveUtil.cs index acbe640cb..23c9465fa 100644 --- a/Barotrauma/BarotraumaShared/Source/Utils/SaveUtil.cs +++ b/Barotrauma/BarotraumaShared/Source/Utils/SaveUtil.cs @@ -378,8 +378,6 @@ namespace Barotrauma Thread.Sleep(250); } } - - return true; } @@ -470,7 +468,20 @@ namespace Barotrauma foreach (DirectoryInfo di in dir.GetDirectories()) { ClearFolder(di.FullName, ignoredFileNames); - di.Delete(); + int maxRetries = 4; + for (int i = 0; i <= maxRetries; i++) + { + try + { + di.Delete(); + break; + } + catch (IOException) + { + if (i >= maxRetries) { throw; } + Thread.Sleep(250); + } + } } } }