From d9747c16cc5300283a62fe1a254aec24ad666bb5 Mon Sep 17 00:00:00 2001 From: Lacyway Date: Tue, 18 Jun 2024 19:03:36 +0000 Subject: [PATCH] Add GUI Component to Bundle Loading (!140) This gives users feedback that the game is currently loading bundles, which prevents confusion when a large amount of them are being loaded and the game is "seemingly" infinitely loading. The implementation is very bare bones, feel free to modify it to your liking if you want it to use a more fancy user interface. I went for clarity (black background, white text). With the standard `OnGUI` skin it's very hard to discern the text. Tested on 1440p and 1080p. ![image](/attachments/31a818d6-d101-4e5d-a2c5-541c8b48ba71) Co-authored-by: Lacyway <20912169+Lacyway@users.noreply.github.com> Reviewed-on: https://dev.sp-tarkov.com/SPT/Modules/pulls/140 Co-authored-by: Lacyway Co-committed-by: Lacyway --- project/SPT.Custom/Patches/EasyAssetsPatch.cs | 7 +++ project/SPT.Custom/SPT.Custom.csproj | 2 + project/SPT.Custom/Utils/BundleUtils.cs | 57 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 project/SPT.Custom/Utils/BundleUtils.cs diff --git a/project/SPT.Custom/Patches/EasyAssetsPatch.cs b/project/SPT.Custom/Patches/EasyAssetsPatch.cs index 87f8ae9..090f383 100644 --- a/project/SPT.Custom/Patches/EasyAssetsPatch.cs +++ b/project/SPT.Custom/Patches/EasyAssetsPatch.cs @@ -78,6 +78,9 @@ namespace SPT.Custom.Patches var bundles = (IEasyBundle[])Array.CreateInstance(EasyBundleHelper.Type, bundleNames.Length); + var bundleUtils = BundleUtils.Create(); + bundleUtils.Init(bundleNames.Length); + for (var i = 0; i < bundleNames.Length; i++) { var key = bundleNames[i]; @@ -86,6 +89,8 @@ namespace SPT.Custom.Patches // acquire external bundle if (BundleManager.Bundles.TryGetValue(key, out var bundleInfo)) { + bundleUtils.SetProgress(i, bundleInfo.FileName); + // we need base path without file extension path = BundleManager.GetBundlePath(bundleInfo); @@ -107,6 +112,8 @@ namespace SPT.Custom.Patches }); } + bundleUtils.Dispose(); + // create dependency graph instance.Manifest = manifest; _bundlesField.SetValue(instance, bundles); diff --git a/project/SPT.Custom/SPT.Custom.csproj b/project/SPT.Custom/SPT.Custom.csproj index e503e4c..9640df3 100644 --- a/project/SPT.Custom/SPT.Custom.csproj +++ b/project/SPT.Custom/SPT.Custom.csproj @@ -24,8 +24,10 @@ + + diff --git a/project/SPT.Custom/Utils/BundleUtils.cs b/project/SPT.Custom/Utils/BundleUtils.cs new file mode 100644 index 0000000..b26bfc6 --- /dev/null +++ b/project/SPT.Custom/Utils/BundleUtils.cs @@ -0,0 +1,57 @@ +using UnityEngine; + +namespace SPT.Custom.Utils +{ + public class BundleUtils : MonoBehaviour + { + private GameObject rootObject; + private int current; + private int maximum; + private string bundleName; + private Texture2D bgTexture; + + public static BundleUtils Create() + { + GameObject bundleUtilsObject = new GameObject("BundleUtilsObject"); + BundleUtils bundleUtils = bundleUtilsObject.AddComponent(); + bundleUtils.rootObject = bundleUtilsObject; + bundleUtils.current = 0; + bundleUtils.maximum = 0; + bundleUtils.enabled = true; + bundleUtils.bgTexture = new Texture2D(2, 2); + return bundleUtils; + } + + public void Init(int length) + { + maximum = length; + } + + public void SetProgress(int progress, string fileName) + { + current = progress; + bundleName = fileName; + } + + public void Dispose() + { + Destroy(rootObject); + Destroy(this); + } + + public void OnGUI() + { + GUI.skin.label.alignment = TextAnchor.MiddleCenter; + GUI.skin.window.alignment = TextAnchor.MiddleCenter; + GUI.skin.window.normal.background = bgTexture; + GUI.backgroundColor = Color.black; + GUI.Window(0, new Rect((Screen.width / 2) - 200, (Screen.height / 2) + 200, 500, 80), DrawWindow, "Bundle Loading"); + } + + private void DrawWindow(int windowId) + { + GUI.Label(new Rect(0, 35, 500, 20), $"Loading bundle: {current} / {maximum}"); + GUI.Label(new Rect(0, 50, 500, 20), bundleName); + } + } +}