using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using HarmonyLib; using UnityEngine; using UnityEngine.Audio; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("BalrondImmersiveLoading")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("BalrondImmersiveLoading")] [assembly: AssemblyCopyright("Copyright © 2022")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("cde312a0-cf19-4264-8616-e1c74774beed")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace BalrondImmersiveLoading; [BepInPlugin("balrond.astafaraios.immersiveloading", "BalrondImmersiveLoading", "1.0.2")] public class BalrondImmersiveLoading : BaseUnityPlugin { [HarmonyPatch(typeof(Player), "OnSpawned")] private static class Player_OnSpawned_Patch { private static void Postfix() { LoadingMusicService.Stop("balrond_immersive_loading_main", immediate: false); } } [HarmonyPatch(typeof(Hud), "UpdateBlackScreen")] private static class Hud_UpdateBlackScreen_Patch { private static void Prefix(bool ___m_haveSetupLoadScreen, ref bool __state) { __state = !___m_haveSetupLoadScreen; } private static void Postfix(Hud __instance, bool ___m_haveSetupLoadScreen, bool __state) { if ((Object)(object)__instance == (Object)null || !LoadingBackgroundService.HasAny() || !__state || !___m_haveSetupLoadScreen) { return; } Image loadingImage = __instance.m_loadingImage; if ((Object)(object)loadingImage == (Object)null) { return; } Transform val = (((Object)(object)__instance.m_loadingProgress != (Object)null) ? __instance.m_loadingProgress.transform : null); Image topFadeTemplate = null; Image bottomFadeTemplate = null; if ((Object)(object)val != (Object)null) { Transform val2 = val.Find("TopFade"); if ((Object)(object)val2 != (Object)null) { topFadeTemplate = ((Component)val2).GetComponent(); } Transform val3 = val.Find("BottomFade"); if ((Object)(object)val3 != (Object)null) { bottomFadeTemplate = ((Component)val3).GetComponent(); } } LoadingBackgroundService.AttachToExistingImage("balrond_immersive_loading_main", loadingImage, topFadeTemplate, bottomFadeTemplate); } } public const string PluginGUID = "balrond.astafaraios.immersiveloading"; public const string PluginName = "BalrondImmersiveLoading"; public const string PluginVersion = "1.0.2"; private const string BundleResourceName = "balrondimmersiveloading"; private const string AssetBasePath = "Assets/Custom/BalrondImmersiveLoading/"; private readonly Harmony harmony = new Harmony("balrond.astafaraios.immersiveloading"); private AssetBundle assetBundle; private GameObject backgroundMusic; private readonly List loadingTextures = new List(); private void Awake() { LoadAssetBundle(); LoadBackgrounds(); LoadingBackgroundService.Initialize(1.2f, 3f, enableSlideshow: true, avoidImmediateRepeat: true, 0.08f); LoadingBackgroundService.SetTextures(loadingTextures); LoadBackgroundMusic(); LoadingMusicService.Initialize(0.5f, 1f, 1f); LoadingMusicService.SetPrefab(backgroundMusic); harmony.PatchAll(); } private void OnDestroy() { harmony.UnpatchSelf(); } private void LoadAssetBundle() { assetBundle = GetAssetBundleFromResources("balrondimmersiveloading"); if ((Object)(object)assetBundle == (Object)null) { Debug.LogError((object)"[BalrondImmersiveLoading] Failed to load asset bundle from embedded resources: balrondimmersiveloading"); } else { Debug.Log((object)"[BalrondImmersiveLoading] Asset bundle loaded: balrondimmersiveloading"); } } private void LoadBackgroundMusic() { if ((Object)(object)assetBundle == (Object)null) { Debug.LogError((object)"[BalrondImmersiveLoading] Cannot load background music because asset bundle is null."); return; } string text = "Assets/Custom/BalrondImmersiveLoading/Audio/BackgroundMusic.prefab"; backgroundMusic = assetBundle.LoadAsset(text); if ((Object)(object)backgroundMusic == (Object)null) { Debug.LogWarning((object)("[BalrondImmersiveLoading] Could not find background music prefab: " + text)); } else { Debug.Log((object)("[BalrondImmersiveLoading] Background music prefab loaded: " + text)); } } private void LoadBackgrounds() { loadingTextures.Clear(); if ((Object)(object)assetBundle == (Object)null) { Debug.LogError((object)"[BalrondImmersiveLoading] Cannot load backgrounds because asset bundle is null."); return; } string text = "Assets/Custom/BalrondImmersiveLoading/Backgrounds/"; string[] array = new string[31] { "mats-minnhagen-apple-release.jpg", "mats-minnhagen-ashlands-encounter.jpg", "mats-minnhagen-ashlands-fortress.jpg", "mats-minnhagen-ashlands-ruins.jpg", "mats-minnhagen-ashlands-ship.jpg", "mats-minnhagen-bog-witch.jpg", "mats-minnhagen-mistletoe.jpg", "mats-minnhagen-the-battle.jpg", "mats-minnhagen-valheim-base.jpg", "mats-minnhagen-valheim-dragons.jpg", "mats-minnhagen-valheim-gjall.jpg", "mats-minnhagen-valheim-halloween.jpg", "mats-minnhagen-valheim-halloween2.jpg", "mats-minnhagen-valheim-hildir.jpg", "mats-minnhagen-valheim-midsummer.jpg", "mats-minnhagen-valheim-mistlands.jpg", "mats-minnhagen-valheim-misunderstanding.jpg", "mats-minnhagen-valheim-seeker.jpg", "mats-minnhagen-valheim-serpent.jpg", "mats-minnhagen-valheim-valborg.jpg", "mats-minnhagen-valheim-valentine.jpg", "mats-minnhagen-valheim-xbox.jpg", "mats-minnhagen-valheim-yule.jpg", "mats-minnhagen-bearwithme.jpg", "mats-minnhagen-borealis.jpg", "mats-minnhagen-feast-table.jpg", "mats-minnhagen-forest-battle.jpg", "mats-minnhagen-guten-morgen.jpg", "mats-minnhagen-neck-lake.jpg", "mats-minnhagen-training.jpg", "mats-minnhagen-winterslip-release.jpg" }; string[] array2 = array; foreach (string text2 in array2) { string text3 = text + text2; Texture2D val = assetBundle.LoadAsset(text3); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("[BalrondImmersiveLoading] Could not find background texture: " + text3)); } else { loadingTextures.Add(val); } } Debug.Log((object)("[BalrondImmersiveLoading] Loaded background textures: " + loadingTextures.Count)); } private static AssetBundle GetAssetBundleFromResources(string filename) { Assembly executingAssembly = Assembly.GetExecutingAssembly(); string text = executingAssembly.GetManifestResourceNames().SingleOrDefault((string str) => str.EndsWith(filename)); if (string.IsNullOrEmpty(text)) { Debug.LogError((object)("[BalrondImmersiveLoading] Embedded resource not found: " + filename)); return null; } using Stream stream = executingAssembly.GetManifestResourceStream(text); if (stream == null) { Debug.LogError((object)("[BalrondImmersiveLoading] Embedded resource stream is null: " + text)); return null; } return AssetBundle.LoadFromStream(stream); } } public static class LoadingBackgroundService { private sealed class CoroutineHost : MonoBehaviour { } private sealed class Slot { public string Key; public Image Front; public Image Back; public Image LeftFade; public Image RightFade; public CoroutineHost Host; public Coroutine Routine; public bool Running; public int LastIndex = -1; } private static readonly List _textures = new List(); private static readonly List _sprites = new List(); private static readonly Dictionary _slots = new Dictionary(); private static bool _initialized; public static float FadeDuration { get; private set; } = 1f; public static float HoldDuration { get; private set; } = 3f; public static bool EnableSlideshow { get; private set; } = true; public static bool AvoidImmediateRepeat { get; private set; } = true; public static float SideFadeWidthPercent { get; private set; } = 0.12f; public static float SideFadeEdgeOffset { get; private set; } = 350f; public static void Initialize(float fadeDuration = 1f, float holdDuration = 3f, bool enableSlideshow = true, bool avoidImmediateRepeat = true, float sideFadeWidthPercent = 0.12f, float sideFadeEdgeOffset = 350f) { FadeDuration = Mathf.Max(0.01f, fadeDuration); HoldDuration = Mathf.Max(0.01f, holdDuration); EnableSlideshow = enableSlideshow; AvoidImmediateRepeat = avoidImmediateRepeat; SideFadeWidthPercent = Mathf.Clamp(sideFadeWidthPercent, 0.01f, 0.45f); SideFadeEdgeOffset = sideFadeEdgeOffset; _initialized = true; } public static bool HasAny() { return _initialized && _sprites.Count > 0; } public static void SetTextures(List textures) { //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) EnsureInitialized(); RemoveAll(); ClearSprites(); _textures.Clear(); if (textures == null || textures.Count == 0) { return; } for (int i = 0; i < textures.Count; i++) { Texture2D val = textures[i]; if (!((Object)(object)val == (Object)null)) { _textures.Add(val); Sprite item = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f); _sprites.Add(item); } } } public static void AddTextures(List textures) { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) EnsureInitialized(); if (textures == null || textures.Count == 0) { return; } for (int i = 0; i < textures.Count; i++) { Texture2D val = textures[i]; if (!((Object)(object)val == (Object)null)) { _textures.Add(val); Sprite item = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f); _sprites.Add(item); } } } public static void AttachToExistingImage(string key, Image target, Image topFadeTemplate = null, Image bottomFadeTemplate = null) { //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Expected O, but got Unknown EnsureInitialized(); if (string.IsNullOrEmpty(key) || (Object)(object)target == (Object)null || !HasAny()) { return; } Remove(key); Transform parent = ((Component)target).transform.parent; if ((Object)(object)parent == (Object)null) { return; } GameObject val = Object.Instantiate(((Component)target).gameObject, parent); ((Object)val).name = ((Object)((Component)target).gameObject).name + "_CustomLoading_Back"; Image component = val.GetComponent(); if ((Object)(object)component == (Object)null) { Object.Destroy((Object)(object)val); return; } CopyRectTransform(((Graphic)target).rectTransform, ((Graphic)component).rectTransform); CopyImageVisualSettings(target, component); NormalizeManagedImage(component); ((Component)component).transform.SetSiblingIndex(((Component)target).transform.GetSiblingIndex() + 1); Image val2 = null; Image val3 = null; if ((Object)(object)topFadeTemplate != (Object)null || (Object)(object)bottomFadeTemplate != (Object)null) { Image fadeTemplate = (((Object)(object)topFadeTemplate != (Object)null) ? topFadeTemplate : bottomFadeTemplate); Image fadeTemplate2 = (((Object)(object)bottomFadeTemplate != (Object)null) ? bottomFadeTemplate : topFadeTemplate); val2 = CreateSideFade(target, fadeTemplate, isLeft: true); val3 = CreateSideFade(target, fadeTemplate2, isLeft: false); if ((Object)(object)val2 != (Object)null) { ((Component)val2).transform.SetSiblingIndex(((Component)component).transform.GetSiblingIndex() + 1); } if ((Object)(object)val3 != (Object)null) { int siblingIndex = (((Object)(object)val2 != (Object)null) ? (((Component)val2).transform.GetSiblingIndex() + 1) : (((Component)component).transform.GetSiblingIndex() + 1)); ((Component)val3).transform.SetSiblingIndex(siblingIndex); } } GameObject val4 = new GameObject("CustomLoadingCoroutineHost_" + key, new Type[1] { typeof(RectTransform) }); val4.transform.SetParent(parent, false); RectTransform component2 = val4.GetComponent(); CopyRectTransform(((Graphic)target).rectTransform, component2); int siblingIndex2 = ((Component)component).transform.GetSiblingIndex() + 1; if ((Object)(object)val3 != (Object)null) { siblingIndex2 = ((Component)val3).transform.GetSiblingIndex() + 1; } else if ((Object)(object)val2 != (Object)null) { siblingIndex2 = ((Component)val2).transform.GetSiblingIndex() + 1; } val4.transform.SetSiblingIndex(siblingIndex2); CoroutineHost coroutineHost = val4.AddComponent(); LoadingMusicService.Play(key, val4.transform); int pickedIndex; Sprite randomSprite = GetRandomSprite(-1, out pickedIndex); if ((Object)(object)randomSprite == (Object)null) { Object.Destroy((Object)(object)val); if ((Object)(object)val2 != (Object)null) { Object.Destroy((Object)(object)((Component)val2).gameObject); } if ((Object)(object)val3 != (Object)null) { Object.Destroy((Object)(object)((Component)val3).gameObject); } Object.Destroy((Object)(object)val4); return; } ApplySpriteToImage(target, randomSprite); SetAlpha(target, 1f); component.sprite = null; SetAlpha(component, 0f); Slot slot = new Slot { Key = key, Front = target, Back = component, LeftFade = val2, RightFade = val3, Host = coroutineHost, Running = true, LastIndex = pickedIndex }; _slots[key] = slot; if (EnableSlideshow && _sprites.Count > 1) { slot.Routine = ((MonoBehaviour)coroutineHost).StartCoroutine(SlideshowLoop(slot)); } } public static void Remove(string key) { if (!string.IsNullOrEmpty(key) && _slots.TryGetValue(key, out var value)) { value.Running = false; LoadingMusicService.Stop(key, immediate: false); if ((Object)(object)value.Host != (Object)null && value.Routine != null) { ((MonoBehaviour)value.Host).StopCoroutine(value.Routine); } if ((Object)(object)value.Back != (Object)null) { Object.Destroy((Object)(object)((Component)value.Back).gameObject); } if ((Object)(object)value.LeftFade != (Object)null) { Object.Destroy((Object)(object)((Component)value.LeftFade).gameObject); } if ((Object)(object)value.RightFade != (Object)null) { Object.Destroy((Object)(object)((Component)value.RightFade).gameObject); } if ((Object)(object)value.Host != (Object)null) { Object.Destroy((Object)(object)((Component)value.Host).gameObject); } _slots.Remove(key); } } public static void RemoveAll() { List list = new List(_slots.Keys); for (int i = 0; i < list.Count; i++) { Remove(list[i]); } } public static void Shutdown() { RemoveAll(); ClearSprites(); _textures.Clear(); _initialized = false; LoadingMusicService.StopAll(immediate: true); } private static IEnumerator SlideshowLoop(Slot slot) { while (slot?.Running ?? false) { yield return (object)new WaitForSeconds(HoldDuration); if (!slot.Running || (Object)(object)slot.Front == (Object)null || (Object)(object)slot.Back == (Object)null) { break; } int newIndex; Sprite next = GetRandomSprite(slot.LastIndex, out newIndex); if (!((Object)(object)next == (Object)null)) { ApplySpriteToImage(slot.Back, next); SetAlpha(slot.Back, 0f); yield return Fade(slot.Front, slot.Back, slot); if (!slot.Running) { break; } Image temp = slot.Front; slot.Front = slot.Back; slot.Back = temp; slot.Back.sprite = null; SetAlpha(slot.Back, 0f); SetAlpha(slot.Front, 1f); slot.LastIndex = newIndex; } } } private static IEnumerator Fade(Image from, Image to, Slot slot) { float time = 0f; SetAlpha(from, 1f); SetAlpha(to, 0f); while (time < FadeDuration) { if (slot == null || !slot.Running || (Object)(object)from == (Object)null || (Object)(object)to == (Object)null) { yield break; } time += Time.deltaTime; float t = Mathf.Clamp01(time / FadeDuration); SetAlpha(from, 1f - t); SetAlpha(to, t); yield return null; } SetAlpha(from, 0f); SetAlpha(to, 1f); } private static Image CreateSideFade(Image target, Image fadeTemplate, bool isLeft) { //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)target == (Object)null || (Object)(object)fadeTemplate == (Object)null) { return null; } Transform parent = ((Component)target).transform.parent; if ((Object)(object)parent == (Object)null) { return null; } GameObject val = Object.Instantiate(((Component)fadeTemplate).gameObject, parent); ((Object)val).name = (isLeft ? "CustomLoading_LeftFade" : "CustomLoading_RightFade"); Image component = val.GetComponent(); if ((Object)(object)component == (Object)null) { Object.Destroy((Object)(object)val); return null; } RectTransform rectTransform = ((Graphic)target).rectTransform; RectTransform rectTransform2 = ((Graphic)component).rectTransform; component.sprite = fadeTemplate.sprite; ((Graphic)component).material = ((Graphic)fadeTemplate).material; ((Graphic)component).color = ((Graphic)fadeTemplate).color; component.type = fadeTemplate.type; component.preserveAspect = false; ((MaskableGraphic)component).maskable = ((MaskableGraphic)fadeTemplate).maskable; ((Graphic)component).raycastTarget = false; ((Behaviour)component).enabled = true; float width = GetWidth(rectTransform); float height = GetHeight(rectTransform); Vector2 displayedSpriteSize = GetDisplayedSpriteSize(target, width, height); float x = displayedSpriteSize.x; float y = displayedSpriteSize.y; float num = Mathf.Max(1f, x * SideFadeWidthPercent); ((Transform)rectTransform2).SetParent(parent, false); rectTransform2.anchorMin = rectTransform.anchorMin; rectTransform2.anchorMax = rectTransform.anchorMax; rectTransform2.pivot = new Vector2(0.5f, 0.5f); ((Transform)rectTransform2).localScale = Vector3.one; ((Transform)rectTransform2).localRotation = Quaternion.identity; rectTransform2.sizeDelta = new Vector2(num, y); float num2 = x * 0.5f; float num3 = Mathf.Max(2f, num * 0.08f); float sideFadeEdgeOffset = SideFadeEdgeOffset; float num4 = (isLeft ? (rectTransform.anchoredPosition.x - num2 + num * 0.5f + num3 - sideFadeEdgeOffset) : (rectTransform.anchoredPosition.x + num2 - num * 0.5f - num3 + sideFadeEdgeOffset)); rectTransform2.anchoredPosition = new Vector2(num4, rectTransform.anchoredPosition.y); ((Transform)rectTransform2).localEulerAngles = new Vector3(0f, 0f, isLeft ? 90f : (-90f)); return component; } private static Vector2 GetDisplayedSpriteSize(Image image, float rectWidth, float rectHeight) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)image == (Object)null) { return new Vector2(rectWidth, rectHeight); } if ((Object)(object)image.sprite == (Object)null) { return new Vector2(rectWidth, rectHeight); } if (!image.preserveAspect) { return new Vector2(rectWidth, rectHeight); } Rect rect = image.sprite.rect; if (((Rect)(ref rect)).width <= 0f || ((Rect)(ref rect)).height <= 0f) { return new Vector2(rectWidth, rectHeight); } float num = ((Rect)(ref rect)).width / ((Rect)(ref rect)).height; float num2 = rectWidth / rectHeight; if (num > num2) { float num3 = rectWidth / num; return new Vector2(rectWidth, num3); } float num4 = rectHeight * num; return new Vector2(num4, rectHeight); } private static void ApplySpriteToImage(Image image, Sprite sprite) { if (!((Object)(object)image == (Object)null)) { image.sprite = sprite; image.type = (Type)0; image.preserveAspect = true; ((Behaviour)image).enabled = true; } } private static void NormalizeManagedImage(Image image) { if (!((Object)(object)image == (Object)null)) { image.type = (Type)0; image.preserveAspect = true; ((Graphic)image).raycastTarget = false; ((Behaviour)image).enabled = true; ((Graphic)image).material = null; } } private static void NormalizeFadeImage(Image image) { if (!((Object)(object)image == (Object)null)) { ((Graphic)image).raycastTarget = false; ((Behaviour)image).enabled = true; } } private static void CopyImageVisualSettings(Image source, Image target) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)source == (Object)null) && !((Object)(object)target == (Object)null)) { target.type = source.type; target.preserveAspect = source.preserveAspect; ((Graphic)target).material = ((Graphic)source).material; ((Graphic)target).color = ((Graphic)source).color; ((Graphic)target).raycastTarget = false; ((MaskableGraphic)target).maskable = ((MaskableGraphic)source).maskable; target.sprite = source.sprite; } } private static void CopyRectTransform(RectTransform source, RectTransform target) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)source == (Object)null) && !((Object)(object)target == (Object)null)) { target.anchorMin = source.anchorMin; target.anchorMax = source.anchorMax; target.anchoredPosition = source.anchoredPosition; target.sizeDelta = source.sizeDelta; target.pivot = source.pivot; ((Transform)target).localScale = ((Transform)source).localScale; ((Transform)target).localRotation = ((Transform)source).localRotation; target.offsetMin = source.offsetMin; target.offsetMax = source.offsetMax; } } private static void SetAlpha(Image image, float alpha) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)image == (Object)null)) { Color color = ((Graphic)image).color; color.a = alpha; ((Graphic)image).color = color; } } private static Sprite GetRandomSprite(int lastIndex, out int pickedIndex) { pickedIndex = -1; if (_sprites.Count == 0) { return null; } if (_sprites.Count == 1) { pickedIndex = 0; return _sprites[0]; } int num = Random.Range(0, _sprites.Count); if (AvoidImmediateRepeat) { int num2 = 0; while (num == lastIndex && num2 < 20) { num = Random.Range(0, _sprites.Count); num2++; } } pickedIndex = num; return _sprites[num]; } private static float GetWidth(RectTransform rect) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)rect == (Object)null) { return 0f; } Rect rect2 = rect.rect; float width = ((Rect)(ref rect2)).width; if (width > 0f) { return width; } width = rect.sizeDelta.x; if (width > 0f) { return width; } return 1920f; } private static float GetHeight(RectTransform rect) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)rect == (Object)null) { return 0f; } Rect rect2 = rect.rect; float height = ((Rect)(ref rect2)).height; if (height > 0f) { return height; } height = rect.sizeDelta.y; if (height > 0f) { return height; } return 1080f; } private static void EnsureInitialized() { if (!_initialized) { Initialize(); } } private static void ClearSprites() { for (int i = 0; i < _sprites.Count; i++) { if ((Object)(object)_sprites[i] != (Object)null) { Object.Destroy((Object)(object)_sprites[i]); } } _sprites.Clear(); } } public static class LoadingMusicService { private sealed class CoroutineHost : MonoBehaviour { } private sealed class MusicSlot { public string Key; public GameObject Instance; public AudioSource Source; public CoroutineHost Host; public Coroutine FadeRoutine; public float LocalVolume; } private static readonly Dictionary _slots = new Dictionary(); private static GameObject _backgroundMusicPrefab; public static float TargetVolume { get; private set; } = 0.5f; public static float FadeInDuration { get; private set; } = 1.5f; public static float FadeOutDuration { get; private set; } = 2f; public static bool UseValheimMusicMixer { get; private set; } = true; public static void Initialize(float targetVolume = 0.5f, float fadeInDuration = 1.5f, float fadeOutDuration = 2f, bool useValheimMusicMixer = true) { TargetVolume = Mathf.Clamp01(targetVolume); FadeInDuration = Mathf.Max(0.01f, fadeInDuration); FadeOutDuration = Mathf.Max(0.01f, fadeOutDuration); UseValheimMusicMixer = useValheimMusicMixer; } public static void SetPrefab(GameObject backgroundMusicPrefab) { _backgroundMusicPrefab = backgroundMusicPrefab; } public static void Play(string key, Transform parent) { if (string.IsNullOrEmpty(key) || (Object)(object)_backgroundMusicPrefab == (Object)null || (Object)(object)parent == (Object)null) { return; } Stop(key, immediate: true); GameObject val = Object.Instantiate(_backgroundMusicPrefab, parent, false); ((Object)val).name = "Balrond_LoadingMusic_" + key; val.SetActive(true); AudioSource val2 = val.GetComponent(); if ((Object)(object)val2 == (Object)null) { val2 = val.GetComponentInChildren(true); } if ((Object)(object)val2 == (Object)null || (Object)(object)val2.clip == (Object)null) { Object.Destroy((Object)(object)val); return; } ConfigureAudioSource(val2); CoroutineHost coroutineHost = val.GetComponent(); if ((Object)(object)coroutineHost == (Object)null) { coroutineHost = val.AddComponent(); } MusicSlot musicSlot = new MusicSlot { Key = key, Instance = val, Source = val2, Host = coroutineHost, LocalVolume = 0f }; _slots[key] = musicSlot; val2.volume = 0f; val2.Play(); musicSlot.FadeRoutine = ((MonoBehaviour)coroutineHost).StartCoroutine(FadeSlotVolume(musicSlot, 0f, TargetVolume, FadeInDuration)); } public static void Stop(string key, bool immediate) { //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Expected O, but got Unknown if (string.IsNullOrEmpty(key) || !_slots.TryGetValue(key, out var value)) { return; } _slots.Remove(key); if (value != null && !((Object)(object)value.Instance == (Object)null)) { if ((Object)(object)value.Host != (Object)null && value.FadeRoutine != null) { ((MonoBehaviour)value.Host).StopCoroutine(value.FadeRoutine); } if (immediate || (Object)(object)value.Source == (Object)null) { Object.Destroy((Object)(object)value.Instance); return; } GameObject val = new GameObject("Balrond_LoadingMusic_FadeOutHost"); CoroutineHost coroutineHost = val.AddComponent(); value.Instance.transform.SetParent(val.transform, true); ((MonoBehaviour)coroutineHost).StartCoroutine(FadeOutAndDestroy(value.Instance, value.Source, val, value.LocalVolume)); } } public static void StopAll(bool immediate) { List list = new List(_slots.Keys); for (int i = 0; i < list.Count; i++) { Stop(list[i], immediate); } } public static void RefreshVolumes() { foreach (MusicSlot value in _slots.Values) { if (value != null && (Object)(object)value.Source != (Object)null) { value.Source.volume = GetFinalVolume(value.LocalVolume); } } } private static void ConfigureAudioSource(AudioSource source) { if ((Object)(object)source == (Object)null) { return; } source.playOnAwake = false; source.loop = true; source.spatialBlend = 0f; source.priority = 0; source.bypassReverbZones = true; if (UseValheimMusicMixer) { AudioMixerGroup valheimMusicMixer = GetValheimMusicMixer(); if ((Object)(object)valheimMusicMixer != (Object)null) { source.outputAudioMixerGroup = valheimMusicMixer; } } } private static IEnumerator FadeSlotVolume(MusicSlot slot, float from, float to, float duration) { if (slot == null || (Object)(object)slot.Source == (Object)null) { yield break; } float time = 0f; slot.LocalVolume = from; slot.Source.volume = GetFinalVolume(from); while (time < duration) { if (slot == null || (Object)(object)slot.Source == (Object)null) { yield break; } time += Time.unscaledDeltaTime; float t = Mathf.Clamp01(time / duration); slot.LocalVolume = Mathf.Lerp(from, to, t); slot.Source.volume = GetFinalVolume(slot.LocalVolume); yield return null; } if ((Object)(object)slot.Source != (Object)null) { slot.LocalVolume = to; slot.Source.volume = GetFinalVolume(to); } } private static IEnumerator FadeOutAndDestroy(GameObject instance, AudioSource source, GameObject hostObject, float startLocalVolume) { if ((Object)(object)source == (Object)null) { if ((Object)(object)instance != (Object)null) { Object.Destroy((Object)(object)instance); } if ((Object)(object)hostObject != (Object)null) { Object.Destroy((Object)(object)hostObject); } yield break; } float time = 0f; while (time < FadeOutDuration) { if ((Object)(object)source == (Object)null) { yield break; } time += Time.unscaledDeltaTime; float t = Mathf.Clamp01(time / FadeOutDuration); float localVolume = Mathf.Lerp(startLocalVolume, 0f, t); source.volume = GetFinalVolume(localVolume); yield return null; } if ((Object)(object)source != (Object)null) { source.Stop(); } if ((Object)(object)instance != (Object)null) { Object.Destroy((Object)(object)instance); } if ((Object)(object)hostObject != (Object)null) { Object.Destroy((Object)(object)hostObject); } } private static AudioMixerGroup GetValheimMusicMixer() { if ((Object)(object)MusicMan.instance == (Object)null) { return null; } return MusicMan.instance.m_musicMixer; } private static float GetFinalVolume(float localVolume) { return Mathf.Clamp01(localVolume) * MusicMan.m_masterMusicVolume; } }