Unstable 0.17.4.0

This commit is contained in:
Markus Isberg
2022-03-30 00:08:09 +09:00
parent 2968e23ae8
commit c1b8e5a341
177 changed files with 3388 additions and 1977 deletions
@@ -533,6 +533,9 @@ namespace Barotrauma.Steam
private void PopulateFrameWithItemInfo(Steamworks.Ugc.Item workshopItem, GUIFrame parentFrame)
{
taskCancelSrc = taskCancelSrc.IsCancellationRequested ? new CancellationTokenSource() : taskCancelSrc;
var contentPackage
= ContentPackageManager.WorkshopPackages.FirstOrDefault(p => p.SteamWorkshopId == workshopItem.Id);
var verticalLayout = new GUILayoutGroup(new RectTransform(Vector2.One, parentFrame.RectTransform));
@@ -567,34 +570,74 @@ namespace Barotrauma.Steam
RectTransform rightSideButtonRectT()
=> new RectTransform(Vector2.One, headerLayout.RectTransform, scaleBasis: ScaleBasis.BothHeight);
bool reinstallAction(GUIButton button, object o)
{
TaskPool.Add($"Reinstall{workshopItem.Id}", SteamManager.Workshop.Reinstall(workshopItem), t =>
{
ContentPackageManager.WorkshopPackages.Refresh();
ContentPackageManager.EnabledPackages.RefreshUpdatedMods();
});
return false;
}
var (updateButton, updateSprite) = CreatePaddedButton(
rightSideButtonRectT(),
"GUIUpdateButton",
spriteScale: 0.8f);
updateButton.ToolTip = TextManager.Get("WorkshopItemUpdate");
updateButton.Visible = false;
updateButton.OnClicked = reinstallAction;
if (contentPackage != null)
{
TaskPool.Add(
$"DetermineUpdateRequired{contentPackage.SteamWorkshopId}",
contentPackage.IsUpToDate(),
t =>
{
if (!t.TryGetResult(out bool isUpToDate)) { return; }
updateButton.Visible = !isUpToDate;
});
}
var (reinstallButton, reinstallSprite) = CreatePaddedButton(
rightSideButtonRectT(),
"GUIReloadButton",
spriteScale: 0.8f);
reinstallButton.ToolTip = TextManager.Get("WorkshopItemReinstall");
reinstallButton.OnClicked += (button, o) =>
{
SteamManager.Workshop.Uninstall(workshopItem);
TaskPool.Add($"Reinstall{workshopItem.Id}", SteamManager.Workshop.ForceRedownload(workshopItem), t => { });
return false;
};
reinstallButton.OnClicked = reinstallAction;
var reinstallButtonUpdater = new GUICustomComponent(
new RectTransform(Vector2.Zero, reinstallButton.RectTransform),
onUpdate: (f, component) =>
{
reinstallButton.Visible = workshopItem.IsSubscribed;
reinstallButton.Visible = workshopItem.IsSubscribed || workshopItem.Owner.Id == SteamManager.GetSteamID();
reinstallButton.Enabled = !workshopItem.IsDownloading && !workshopItem.IsDownloadPending &&
!SteamManager.Workshop.IsInstalling(workshopItem);
reinstallSprite.Color = reinstallButton.Enabled
? reinstallSprite.Style.Color
: Color.DimGray;
updateButton.Enabled = reinstallButton.Enabled && contentPackage != null && ContentPackageManager.WorkshopPackages.Contains(contentPackage);
updateSprite.Color = reinstallSprite.Color;
if (contentPackage != null
&& !ContentPackageManager.WorkshopPackages.Contains(contentPackage)
&& ContentPackageManager.WorkshopPackages.Any(p => p.SteamWorkshopId == workshopItem.Id))
{
updateButton.Visible = false;
}
});
CreateSubscribeButton(workshopItem,
rightSideButtonRectT(),
spriteScale: 0.8f);
var padding = new GUIFrame(
new RectTransform((0.15f, 1.0f), headerLayout.RectTransform, scaleBasis: ScaleBasis.BothHeight),
style: null);
var padding = new GUIFrame(new RectTransform((1.0f, 0.015f), verticalLayout.RectTransform), style: null);
padding = new GUIFrame(new RectTransform((1.0f, 0.015f), verticalLayout.RectTransform), style: null);
var horizontalLayout = new GUILayoutGroup(new RectTransform((1.0f, 0.45f), verticalLayout.RectTransform),
isHorizontal: true)
@@ -638,7 +681,7 @@ namespace Barotrauma.Steam
isHorizontal: true,
childAnchor: Anchor.CenterLeft) { Stretch = true };
var starColor = Color.Lerp(
Color.Lerp(Color.Red, Color.Yellow, Math.Min(workshopItem.Score * 2.0f, 1.0f)),
Color.Lerp(Color.White, Color.Yellow, Math.Min(workshopItem.Score * 2.0f, 1.0f)),
Color.Lime, Math.Max(0.0f, (workshopItem.Score - 0.5f) * 2.0f));
for (int i = 0; i < 5; i++)
{
@@ -652,12 +695,23 @@ namespace Barotrauma.Steam
star.SelectedColor = starColor;
}
}
var scoreVoteCountPadding = new GUIFrame(new RectTransform((0.5f, 1.0f), scoreStarContainer.RectTransform, scaleBasis: ScaleBasis.BothHeight),
var scoreTextPadding = new GUIFrame(new RectTransform((0.5f, 1.0f), scoreStarContainer.RectTransform, scaleBasis: ScaleBasis.BothHeight),
style: null);
var scoreTextContainer = new GUIFrame(new RectTransform(Vector2.One, scoreStarContainer.RectTransform),
style: null);
var scoreVoteCount = new GUITextBlock(
new RectTransform(Vector2.One, scoreStarContainer.RectTransform),
new RectTransform((1.0f, 1.5f), scoreTextContainer.RectTransform, Anchor.Center),
TextManager.GetWithVariable("WorkshopItemVotes", "[VoteCount]",
(workshopItem.VotesUp + workshopItem.VotesDown).ToString()), textAlignment: Alignment.CenterLeft)
(workshopItem.VotesUp + workshopItem.VotesDown).ToString()), textAlignment: Alignment.BottomLeft)
{
Padding = Vector4.Zero
};
var subscriptionCount = new GUITextBlock(
new RectTransform((1.0f, 1.5f), scoreTextContainer.RectTransform, Anchor.Center),
TextManager.GetWithVariable("WorkshopItemSubscriptions", "[SubscriptionCount]",
workshopItem.NumUniqueSubscriptions.ToString()), textAlignment: Alignment.TopLeft)
{
Padding = Vector4.Zero
};
@@ -89,23 +89,22 @@ namespace Barotrauma.Steam
return (fileCount, byteCount);
}
private void DeselectPublishedItem()
{
var deselectCarrier = selfModsList.Parent.FindChild(c => c.UserData is ActionCarrier { Id: var id } && id == "deselect");
Action? deselectAction = deselectCarrier.UserData is ActionCarrier { Action: var action }
? action
: null;
deselectAction?.Invoke();
SelectTab(Tab.Publish);
}
private void PopulatePublishTab(ItemOrPackage itemOrPackage, GUIFrame parentFrame)
{
ContentPackageManager.LocalPackages.Refresh();
ContentPackageManager.WorkshopPackages.Refresh();
var deselectCarrier = selfModsList.Parent.FindChild(c => c.UserData is ActionCarrier { Id: var id } && id == "deselect");
Action? deselectAction = deselectCarrier.UserData is ActionCarrier { Action: var action }
? action
: null;
void deselectItem()
{
deselectAction?.Invoke();
SelectTab(Tab.Publish);
}
parentFrame.ClearChildren();
GUILayoutGroup mainLayout = new GUILayoutGroup(new RectTransform(Vector2.One, parentFrame.RectTransform),
childAnchor: Anchor.TopCenter);
@@ -146,7 +145,7 @@ namespace Barotrauma.Steam
{
OnClicked = (button, o) =>
{
deselectItem();
DeselectPublishedItem();
return false;
}
};
@@ -285,7 +284,7 @@ namespace Barotrauma.Steam
RectTransform newButtonRectT()
=> new RectTransform((0.4f, 1.0f), buttonLayout.RectTransform);
var publishItemButton = new GUIButton(newButtonRectT(), TextManager.Get("WorkshopItemPublish"))
var publishItemButton = new GUIButton(newButtonRectT(), TextManager.Get(workshopItem.Id != 0 ? "WorkshopItemUpdate" : "WorkshopItemPublish"))
{
OnClicked = (button, o) =>
{
@@ -333,8 +332,9 @@ namespace Barotrauma.Steam
TaskPool.Add($"Delete{workshopItem.Id}", Steamworks.SteamUGC.DeleteFileAsync(workshopItem.Id),
t =>
{
SteamManager.Workshop.Uninstall(workshopItem);
confirmDeletion.Close();
deselectItem();
DeselectPublishedItem();
});
return false;
};
@@ -364,24 +364,10 @@ namespace Barotrauma.Steam
return false;
};
var coroutineEval = subcoroutine(messageBox.Text, messageBox);
var coroutineEval = subcoroutine(messageBox.Text, messageBox).GetEnumerator();
while (true)
{
bool moveNext = true;
try
{
moveNext = coroutineEval.GetEnumerator().MoveNext();
}
catch (Exception e)
{
DebugConsole.ThrowError($"{e.Message} {e.StackTrace.CleanupStackTrace()}");
messageBox.Close();
}
if (!moveNext)
{
messageBox.Close();
}
var status = coroutineEval.GetEnumerator().Current;
var status = coroutineEval.Current;
if (messageBox.Closed)
{
yield return CoroutineStatus.Success;
@@ -397,6 +383,20 @@ namespace Barotrauma.Steam
{
yield return status;
}
bool moveNext = true;
try
{
moveNext = coroutineEval.MoveNext();
}
catch (Exception e)
{
DebugConsole.ThrowError($"{e.Message} {e.StackTrace.CleanupStackTrace()}");
messageBox.Close();
}
if (!moveNext)
{
messageBox.Close();
}
}
}
@@ -408,26 +408,9 @@ namespace Barotrauma.Steam
{
if (!SteamManager.Workshop.CanBeInstalled(workshopItem))
{
//Must download!
while (!SteamManager.Workshop.CanBeInstalled(workshopItem))
{
bool shouldForceInstall = workshopItem.IsInstalled
&& Directory.Exists(workshopItem.Directory)
&& !SteamManager.Workshop.IsItemDirectoryUpToDate(workshopItem);
shouldForceInstall |= workshopItem is
{ IsDownloading: false, IsDownloadPending: false, IsInstalled: false };
if (shouldForceInstall)
{
SteamManager.Workshop.ForceRedownload(workshopItem);
}
currentStepText.Text = TextManager.GetWithVariable("PublishPopupDownload", "[percentage]", Percentage(workshopItem.DownloadAmount));
yield return new WaitForSeconds(0.5f);
}
}
else
{
SteamManager.Workshop.DownloadModThenEnqueueInstall(workshopItem);
SteamManager.Workshop.NukeDownload(workshopItem);
}
SteamManager.Workshop.DownloadModThenEnqueueInstall(workshopItem);
TaskPool.Add($"Install {workshopItem.Title}",
SteamManager.Workshop.WaitForInstall(workshopItem),
(t) =>
@@ -436,7 +419,9 @@ namespace Barotrauma.Steam
});
while (!ContentPackageManager.WorkshopPackages.Any(p => p.SteamWorkshopId == workshopItem.Id))
{
currentStepText.Text = TextManager.Get("PublishPopupInstall");
currentStepText.Text = SteamManager.Workshop.CanBeInstalled(workshopItem)
? TextManager.Get("PublishPopupInstall")
: TextManager.GetWithVariable("PublishPopupDownload", "[percentage]", Percentage(workshopItem.DownloadAmount));
yield return new WaitForSeconds(0.5f);
}
@@ -457,7 +442,6 @@ namespace Barotrauma.Steam
currentStepText.Text = TextManager.Get("PublishPopupCreateLocal");
yield return new WaitForSeconds(0.5f);
}
PopulatePublishTab(workshopItem, parentFrame);
yield return CoroutineStatus.Success;
@@ -500,7 +484,10 @@ namespace Barotrauma.Steam
editor.SubmitAsync(),
t =>
{
t.TryGetResult(out result);
if (t.TryGetResult(out Steamworks.Ugc.PublishResult publishResult))
{
result = publishResult;
}
resultException = t.Exception?.GetInnermost();
});
currentStepText.Text = TextManager.Get("PublishPopupSubmit");
@@ -523,6 +510,14 @@ namespace Barotrauma.Steam
$"exception was {downloadTask.Exception?.GetInnermost()?.ToString().CleanupStackTrace() ?? "[NULL]"}");
}
ContentPackage? pkgToNuke
= ContentPackageManager.WorkshopPackages.FirstOrDefault(p => p.SteamWorkshopId == resultId);
if (pkgToNuke != null)
{
Directory.Delete(pkgToNuke.Dir, recursive: true);
ContentPackageManager.WorkshopPackages.Refresh();
}
bool installed = false;
TaskPool.Add(
"InstallNewlyPublished",
@@ -537,13 +532,17 @@ namespace Barotrauma.Steam
yield return new WaitForSeconds(0.5f);
}
ContentPackageManager.WorkshopPackages.Refresh();
ContentPackageManager.EnabledPackages.RefreshUpdatedMods();
var localModProject = new ModProject(localPackage)
{
SteamWorkshopId = resultId
};
localModProject.DiscardHashAndInstallTime();
localModProject.Save(localPackage.Path);
ContentPackageManager.ReloadContentPackage(localPackage);
ContentPackageManager.WorkshopPackages.Refresh();
DeselectPublishedItem();
if (result.Value.NeedsWorkshopAgreement)
{
@@ -8,6 +8,7 @@ using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Barotrauma.Extensions;
namespace Barotrauma.Steam
{
@@ -117,7 +118,7 @@ namespace Barotrauma.Steam
if (thumbnailUrl.IsNullOrWhiteSpace()) { return null; }
var client = new RestClient(thumbnailUrl);
var request = new RestRequest(".", Method.GET);
IRestResponse response = await client.ExecuteTaskAsync(request, cancellationToken);
IRestResponse response = await client.ExecuteAsync(request, cancellationToken);
if (response is { StatusCode: System.Net.HttpStatusCode.OK, ResponseStatus: ResponseStatus.Completed })
{
using var dataStream = new System.IO.MemoryStream();
@@ -207,6 +208,11 @@ namespace Barotrauma.Steam
}
string newPath = $"{ContentPackage.LocalModsDir}/{sanitizedName}";
if (File.Exists(newPath) || Directory.Exists(newPath))
{
newPath += $"_{contentPackage.SteamWorkshopId}";
}
if (File.Exists(newPath) || Directory.Exists(newPath))
{
throw new Exception($"{newPath} already exists");
@@ -256,6 +262,18 @@ namespace Barotrauma.Steam
}
}
public static async Task Reinstall(Steamworks.Ugc.Item workshopItem)
{
NukeDownload(workshopItem);
var toUninstall
= ContentPackageManager.WorkshopPackages.Where(p => p.SteamWorkshopId == workshopItem.Id)
.ToHashSet();
toUninstall.Select(p => p.Dir).ForEach(d => Directory.Delete(d));
CrossThread.RequestExecutionOnMainThread(() => ContentPackageManager.WorkshopPackages.Refresh());
DownloadModThenEnqueueInstall(workshopItem);
await WaitForInstall(workshopItem);
}
public static async Task WaitForInstall(Steamworks.Ugc.Item item)
=> await WaitForInstall(item.Id);
@@ -263,6 +281,7 @@ namespace Barotrauma.Steam
{
var installWaiter = new InstallWaiter(item);
while (installWaiter.Waiting) { await Task.Delay(500); }
await Task.Delay(500);
}
public static void OnItemDownloadComplete(ulong id, bool forceInstall = false)
@@ -276,7 +295,8 @@ namespace Barotrauma.Steam
return;
}
else if (CanBeInstalled(id)
&& !ContentPackageManager.WorkshopPackages.Any(p => p.SteamWorkshopId == id))
&& !ContentPackageManager.WorkshopPackages.Any(p => p.SteamWorkshopId == id)
&& !InstallTaskCounter.IsInstalling(id))
{
TaskPool.Add($"InstallItem{id}", InstallMod(id), t => InstallWaiter.StopWaiting(id));
}
@@ -31,6 +31,7 @@ namespace Barotrauma.Steam
private readonly GUIListBox enabledRegularModsList;
private readonly GUIListBox disabledRegularModsList;
private readonly Action<ItemOrPackage> onInstalledInfoButtonHit;
private readonly GUITextBox modsListFilter;
private CancellationTokenSource taskCancelSrc = new CancellationTokenSource();
private readonly HashSet<SteamManager.Workshop.ItemThumbnail> itemThumbnails = new HashSet<SteamManager.Workshop.ItemThumbnail>();
@@ -47,7 +48,12 @@ namespace Barotrauma.Steam
contentFrame = new GUIFrame(new RectTransform((1.0f, 0.95f), mainLayout.RectTransform), style: null);
CreateInstalledModsTab(out enabledCoreDropdown, out enabledRegularModsList, out disabledRegularModsList, out onInstalledInfoButtonHit);
CreateInstalledModsTab(
out enabledCoreDropdown,
out enabledRegularModsList,
out disabledRegularModsList,
out onInstalledInfoButtonHit,
out modsListFilter);
CreatePopularModsTab(out popularModsList);
CreatePublishTab(out selfModsList);
@@ -176,7 +182,8 @@ namespace Barotrauma.Steam
out GUIDropDown enabledCoreDropdown,
out GUIListBox enabledRegularModsList,
out GUIListBox disabledRegularModsList,
out Action<ItemOrPackage> onInstalledInfoButtonHit)
out Action<ItemOrPackage> onInstalledInfoButtonHit,
out GUITextBox modsListFilter)
{
GUIFrame content = CreateNewContentFrame(Tab.InstalledMods);
@@ -287,7 +294,7 @@ namespace Barotrauma.Steam
var searchRectT = NewItemRectT(mainLayout, heightScale: 1.0f);
searchRectT.RelativeSize = (0.5f, searchRectT.RelativeSize.Y);
var searchHolder = new GUIFrame(searchRectT, style: null);
var searchBox = new GUITextBox(new RectTransform(Vector2.One, searchHolder.RectTransform), "");
var searchBox = new GUITextBox(new RectTransform(Vector2.One, searchHolder.RectTransform), "", createClearButton: true);
var searchTitle = new GUITextBlock(new RectTransform(Vector2.One, searchHolder.RectTransform) {Anchor = Anchor.TopLeft},
textColor: Color.DarkGray * 0.6f,
text: TextManager.Get("Search") + "...",
@@ -300,12 +307,10 @@ namespace Barotrauma.Steam
searchBox.OnTextChanged += (sender, str) =>
{
enabledModsList.Content.Children.Concat(disabledModsList.Content.Children)
.ForEach(c => c.Visible = str.IsNullOrWhiteSpace()
|| (c.UserData is ContentPackage p
&& p.Name.Contains(str, StringComparison.OrdinalIgnoreCase)));
UpdateModListItemVisibility();
return true;
};
modsListFilter = searchBox;
new GUICustomComponent(new RectTransform(Vector2.Zero, content.RectTransform),
onUpdate: (f, component) =>
@@ -320,6 +325,15 @@ namespace Barotrauma.Steam
});
}
private void UpdateModListItemVisibility()
{
string str = modsListFilter.Text;
enabledRegularModsList.Content.Children.Concat(disabledRegularModsList.Content.Children)
.ForEach(c => c.Visible = str.IsNullOrWhiteSpace()
|| (c.UserData is ContentPackage p
&& p.Name.Contains(str, StringComparison.OrdinalIgnoreCase)));
}
private void PopulateInstalledModLists()
{
ContentPackageManager.UpdateContentPackageList();
@@ -344,15 +358,21 @@ namespace Barotrauma.Steam
RelativeSpacing = 0.02f
};
var dragIndicator = new GUIButton(new RectTransform((0.1f, 0.5f), frameContent.RectTransform, scaleBasis: ScaleBasis.BothHeight),
var dragIndicator = new GUIButton(new RectTransform((0.5f, 0.5f), frameContent.RectTransform, scaleBasis: ScaleBasis.BothHeight),
style: "GUIDragIndicator")
{
CanBeFocused = false
};
var modNameScissor
= new GUIScissorComponent(new RectTransform((0.8f, 1.0f), frameContent.RectTransform));
var modName = new GUITextBlock(new RectTransform(Vector2.One, modNameScissor.Content.RectTransform), text: mod.Name);
var modNameScissor = new GUIScissorComponent(new RectTransform((0.8f, 1.0f), frameContent.RectTransform))
{
CanBeFocused = false
};
var modName = new GUITextBlock(new RectTransform(Vector2.One, modNameScissor.Content.RectTransform),
text: mod.Name)
{
CanBeFocused = false
};
if (ContentPackageManager.LocalPackages.Contains(mod))
{
var editButton = new GUIButton(new RectTransform(Vector2.One, frameContent.RectTransform, scaleBasis: ScaleBasis.Smallest), "",
@@ -418,6 +438,8 @@ namespace Barotrauma.Steam
if (ContentPackageManager.EnabledPackages.Regular.Contains(mod)) { continue; }
addRegularModToList(mod, disabledRegularModsList);
}
UpdateModListItemVisibility();
}
private void CreatePopularModsTab(out GUIListBox popularModsList)