Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of BTCV Company v1.2.2
BepInEx/plugins/Emblem.dll
Decompiled 2 years agousing 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.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Emblem; using Emblem.Components; using Emblem.Managers; using HarmonyLib; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; using UnityEngine.SceneManagement; using UnityEngine.UI; using UnityEngine.Video; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("Emblem")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Emblem")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("e4927ee1-3a47-4f93-8784-804356949316")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] [BepInPlugin("Darkbrewery.Emblem", "Emblem", "1.2.4")] public class EmblemPlugin : BaseUnityPlugin { private UIComponent uiComponent; private HeaderReplacement headerReplacement; private Boardwalk boardwalk; private BackgroundManager backgroundManager; private LoadingText loadingText; private MenuMoodSetter menuMoodSetter; private Harmony harmony; private Configurator configManager; private CustomMediaManager customMediaManager; private SceneManagerHelper sceneManagerHelper; private InterfaceDecorator interfaceDecorator; private VersionStyler versionStyler; private void Awake() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown LogWarden.Initialize(((BaseUnityPlugin)this).Logger); LogWarden.LogInfo("Stirring from darkness..."); try { harmony = new Harmony("com.darkbrewery.emblem.harmony"); configManager = new Configurator(((BaseUnityPlugin)this).Config); customMediaManager = new CustomMediaManager(); uiComponent = new UIComponent(configManager); backgroundManager = new BackgroundManager(configManager, customMediaManager); headerReplacement = new HeaderReplacement(configManager, uiComponent, customMediaManager); boardwalk = new Boardwalk(configManager); loadingText = ((Component)this).gameObject.AddComponent<LoadingText>(); loadingText.Initialize(configManager); menuMoodSetter = new MenuMoodSetter(configManager); versionStyler = new VersionStyler(configManager); interfaceDecorator = new InterfaceDecorator(uiComponent, backgroundManager, headerReplacement, boardwalk, loadingText, menuMoodSetter, versionStyler); sceneManagerHelper = new SceneManagerHelper(interfaceDecorator); harmony.PatchAll(); LogWarden.LogInfo("Successfully deployed, its intent shrouded"); } catch (Exception arg) { LogWarden.LogError($"Error initializing Emblem plugin: {arg}"); } } } public class DelayHelper : MonoBehaviour { public static void StartDelayedAction(float delayInSeconds, Action action) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) new GameObject("DelayHelper").AddComponent<DelayHelper>().DelayedAction(delayInSeconds, action); } private void DelayedAction(float delayInSeconds, Action action) { ((MonoBehaviour)this).StartCoroutine(DelayCoroutine(delayInSeconds, action)); } private IEnumerator DelayCoroutine(float delayInSeconds, Action action) { yield return (object)new WaitForSeconds(delayInSeconds); action?.Invoke(); Object.Destroy((Object)(object)((Component)this).gameObject); } } public class EmblemFolder { private readonly string basePluginsPath; private readonly Dictionary<string, string> fullPathCache = new Dictionary<string, string>(); private readonly Dictionary<string, IEnumerable<string>> validPathsCache = new Dictionary<string, IEnumerable<string>>(); private readonly Lazy<IEnumerable<string>> emblemDirectories; public EmblemFolder() { basePluginsPath = Path.Combine(Paths.BepInExRootPath, "plugins"); emblemDirectories = new Lazy<IEnumerable<string>>(() => FindEmblemDirectories()); } private IEnumerable<string> FindEmblemDirectories() { try { return (from dir in Directory.GetDirectories(basePluginsPath, "*", SearchOption.AllDirectories) where Path.GetFileName(dir).Equals("Emblem", StringComparison.OrdinalIgnoreCase) select dir).ToList(); } catch (Exception ex) { LogWarden.LogError("[EmblemFolder] Error finding Emblem directories: " + ex.Message); return new List<string>(); } } public string FindFullPath(string inputPath) { if (fullPathCache.TryGetValue(inputPath, out var value)) { return value; } string path = ExtractRelativePathFromEmblem(inputPath); string[] directories = Directory.GetDirectories(basePluginsPath, "*", SearchOption.AllDirectories); foreach (string text in directories) { if (text.EndsWith("Emblem", StringComparison.OrdinalIgnoreCase)) { string text2 = Path.Combine(text, path); if (File.Exists(text2) || Directory.Exists(text2)) { fullPathCache[inputPath] = text2; return text2; } } } LogWarden.LogError("[EmblemFolder] Could not find a valid path for: " + inputPath); return null; } public IEnumerable<string> FindAllValidPaths(string inputPathPattern) { if (validPathsCache.TryGetValue(inputPathPattern, out var value)) { return value; } string path = ExtractRelativePathFromEmblem(inputPathPattern); string[] directories = Directory.GetDirectories(basePluginsPath, "*", SearchOption.AllDirectories); List<string> list = new List<string>(); string[] array = directories; foreach (string text in array) { if (text.EndsWith("Emblem", StringComparison.OrdinalIgnoreCase)) { string searchPattern = Path.Combine(text, path); list.AddRange(Directory.GetFiles(text, searchPattern, SearchOption.AllDirectories)); } } validPathsCache[inputPathPattern] = list; return list; } private string ExtractRelativePathFromEmblem(string path) { string[] array = path.Split(new char[2] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries); int num = Array.FindIndex(array, (string segment) => segment.Equals("Emblem", StringComparison.OrdinalIgnoreCase)); if (num != -1 && num < array.Length - 1) { return Path.Combine(array.Skip(num + 1).ToArray()); } return path; } } public class ImageFilters { private readonly Configurator configManager; public ImageFilters(Configurator configManager) { this.configManager = configManager; } public void Blend(string targetImagePath, Color vignetteColor) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00be: 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_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) if (configManager.enableRadiantTaper.Value) { Transform val = PathFinder.Probe(targetImagePath); if ((Object)(object)val == (Object)null) { LogWarden.LogError("ImageFilters.Blend: Image with path '" + targetImagePath + "' not found."); return; } GameObject gameObject = ((Component)val).gameObject; GameObject val2 = new GameObject("VignetteOverlay"); RectTransform val3 = val2.AddComponent<RectTransform>(); ((Transform)val3).SetParent(gameObject.transform, false); Image obj = val2.AddComponent<Image>(); Texture2D val4 = CreateVignetteTexture(((Texture)gameObject.GetComponent<Image>().sprite.texture).width, ((Texture)gameObject.GetComponent<Image>().sprite.texture).height, vignetteColor); obj.sprite = Sprite.Create(val4, new Rect(0f, 0f, (float)((Texture)val4).width, (float)((Texture)val4).height), new Vector2(0.5f, 0.5f)); Rect rect = gameObject.GetComponent<RectTransform>().rect; float width = ((Rect)(ref rect)).width; rect = gameObject.GetComponent<RectTransform>().rect; val3.sizeDelta = new Vector2(width, ((Rect)(ref rect)).height); ((Graphic)obj).raycastTarget = false; } } private Texture2D CreateVignetteTexture(int width, int height, Color vignetteColor) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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) Texture2D val = new Texture2D(width, height, (TextureFormat)4, false); Color val2 = default(Color); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { float distance2 = j; float distance3 = width - j; float distance4 = height - i; float distance5 = i; float num = Mathf.Max(CalculateExponentialBlend(distance2, width), CalculateExponentialBlend(distance3, width)); float num2 = Mathf.Max(CalculateExponentialBlend(distance4, height), CalculateExponentialBlend(distance5, height)); float num3 = Mathf.Max(num, num2); ((Color)(ref val2))..ctor(vignetteColor.r, vignetteColor.g, vignetteColor.b, num3); val.SetPixel(j, i, val2); } } val.Apply(); return val; static float CalculateExponentialBlend(float distance, float totalDistance) { float num4 = 0.97f * totalDistance; if (distance > num4) { return Mathf.Clamp01(Mathf.Pow((distance - num4) / (totalDistance - num4), 2f)); } return 0f; } } } namespace Emblem { public class CRTEffect { private Volume volume; public void SetupVolume(GameObject gameObject) { volume = gameObject.GetComponent<Volume>() ?? gameObject.AddComponent<Volume>(); if ((Object)(object)volume == (Object)null) { LogWarden.LogError("Failed to add or get Volume component on gameObject."); return; } volume.isGlobal = true; volume.priority = 2.1474836E+09f; if ((Object)(object)volume.profile == (Object)null) { volume.profile = ScriptableObject.CreateInstance<VolumeProfile>(); if ((Object)(object)volume.profile == (Object)null) { LogWarden.LogError("Failed to create a new VolumeProfile."); return; } } ((Behaviour)volume).enabled = true; LogWarden.LogInfo("Volume component for CRT effects has been enabled."); SetupCRTEffects(); } private void SetupCRTEffects() { if ((Object)(object)volume.profile == (Object)null) { LogWarden.LogError("VolumeProfile is null in SetupCRTEffects."); return; } ConfigureChromaticAberration(); ConfigureFilmGrain(); ConfigureVignette(); ConfigureLensDistortion(); } private T GetOrAddEffect<T>(bool overrides = true) where T : VolumeComponent, new() { VolumeComponent? obj = volume.profile.components.Find((VolumeComponent x) => x is T); return ((T)(object)((obj is T) ? obj : null)) ?? volume.profile.Add<T>(overrides); } private void ConfigureChromaticAberration() { ChromaticAberration orAddEffect = GetOrAddEffect<ChromaticAberration>(overrides: true); ((VolumeComponent)orAddEffect).active = true; ((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.04f; } private void ConfigureFilmGrain() { FilmGrain orAddEffect = GetOrAddEffect<FilmGrain>(overrides: true); ((VolumeComponent)orAddEffect).active = true; ((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.4f; ((VolumeParameter<FilmGrainLookup>)(object)orAddEffect.type).value = (FilmGrainLookup)2; ((VolumeParameter<float>)(object)orAddEffect.response).value = 0.2f; } private void ConfigureVignette() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) Vignette orAddEffect = GetOrAddEffect<Vignette>(overrides: true); ((VolumeComponent)orAddEffect).active = true; ((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.4f; ((VolumeParameter<Color>)(object)orAddEffect.color).value = Color.black; ((VolumeParameter<Vector2>)(object)orAddEffect.center).value = new Vector2(0.5f, 0.5f); ((VolumeParameter<float>)(object)orAddEffect.roundness).value = 1f; ((VolumeParameter<float>)(object)orAddEffect.smoothness).value = 0.5f; } private void ConfigureLensDistortion() { LensDistortion orAddEffect = GetOrAddEffect<LensDistortion>(overrides: true); ((VolumeComponent)orAddEffect).active = true; ((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.27f; ((VolumeParameter<float>)(object)orAddEffect.scale).value = 1.02f; } } public static class ColorParser { public static Color RGBA(string rgbaString) { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) string[] array = rgbaString.Split(new char[1] { ',' }); if (array.Length != 4) { return Color.white; } float num = Mathf.Clamp01((float)int.Parse(array[0]) / 255f); float num2 = Mathf.Clamp01((float)int.Parse(array[1]) / 255f); float num3 = Mathf.Clamp01((float)int.Parse(array[2]) / 255f); float num4 = Mathf.Clamp01(float.Parse(array[3])); return new Color(num, num2, num3, num4); } public static Color RGB(string rgbString) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) string[] array = rgbString.Split(new char[1] { ',' }); if (array.Length < 3 || array.Length > 4) { return Color.white; } float num = Mathf.Clamp01((float)int.Parse(array[0]) / 255f); float num2 = Mathf.Clamp01((float)int.Parse(array[1]) / 255f); float num3 = Mathf.Clamp01((float)int.Parse(array[2]) / 255f); return new Color(num, num2, num3, 1f); } } public static class LogWarden { private static ManualLogSource loggerInstance; public static void Initialize(ManualLogSource logger) { loggerInstance = logger; } public static void LogError(string message) { ManualLogSource obj = loggerInstance; if (obj != null) { obj.LogError((object)message); } } public static void LogWarning(string message) { ManualLogSource obj = loggerInstance; if (obj != null) { obj.LogWarning((object)message); } } public static void LogInfo(string message) { ManualLogSource obj = loggerInstance; if (obj != null) { obj.LogInfo((object)message); } } } public static class PathFinder { public static Transform Probe(string path) { Transform val = null; string[] array = path.Split(new char[1] { '/' }); foreach (string text in array) { if ((Object)(object)val == (Object)null) { GameObject obj = GameObject.Find(text); val = ((obj != null) ? obj.transform : null); } else { val = val.Find(text); } if ((Object)(object)val == (Object)null) { GameObject[] array2 = Resources.FindObjectsOfTypeAll<GameObject>(); foreach (GameObject val2 in array2) { if (((Object)val2).name == text) { val = val2.transform; break; } } } if ((Object)(object)val == (Object)null) { LogWarden.LogError("Element '" + text + "' not found in path '" + path + "'."); return null; } } return val; } } public class Configurator { public readonly ConfigFile config; public ConfigEntry<bool> enableReplaceMainHeader { get; private set; } public ConfigEntry<string> mainHeaderPath { get; private set; } public ConfigEntry<float> mainHeaderYOffset { get; private set; } public ConfigEntry<int> mainHeaderScale { get; private set; } public ConfigEntry<int> mainHeaderAlpha { get; private set; } public ConfigEntry<bool> enableMainBackground { get; private set; } public ConfigEntry<string> mainBackgroundPath { get; private set; } public ConfigEntry<string> mainBackgroundColor { get; private set; } public ConfigEntry<bool> enableMenuColorChange { get; private set; } public ConfigEntry<string> menuFontColor { get; private set; } public ConfigEntry<string> menuRolloverBGColor { get; private set; } public ConfigEntry<string> menuRolloverFontColor { get; private set; } public ConfigEntry<bool> enableReplaceLoadHeader { get; private set; } public ConfigEntry<string> loadHeaderPath { get; private set; } public ConfigEntry<float> loadHeaderYOffset { get; private set; } public ConfigEntry<int> loadHeaderScale { get; private set; } public ConfigEntry<int> loadHeaderAlpha { get; private set; } public ConfigEntry<bool> loadHeaderStretch { get; private set; } public ConfigEntry<bool> enableLoadBackground { get; private set; } public ConfigEntry<string> loadBackgroundPath { get; private set; } public ConfigEntry<string> loadBackgroundColor { get; private set; } public ConfigEntry<bool> enableLoadingTextChange { get; private set; } public ConfigEntry<string> loadTextString { get; private set; } public ConfigEntry<string> loadTextColor { get; private set; } public ConfigEntry<float> loadTextSize { get; private set; } public ConfigEntry<float> loadTextYOffset { get; private set; } public ConfigEntry<bool> enableReplaceBorder { get; private set; } public ConfigEntry<string> borderColor { get; private set; } public ConfigEntry<float> borderPadding { get; private set; } public ConfigEntry<bool> enableCustomVersion { get; private set; } public ConfigEntry<string> versionTextString { get; private set; } public ConfigEntry<string> versionColor { get; private set; } public ConfigEntry<float> versionFontSize { get; private set; } public ConfigEntry<float> versionYOffset { get; private set; } public ConfigEntry<bool> enableRadiantTaper { get; private set; } public ConfigEntry<bool> enableCRT { get; private set; } public Configurator(ConfigFile config) { this.config = config; Initialize(); } private void Initialize() { enableReplaceMainHeader = BindConfig("1. Main Logo", "Enable", defaultValue: false, "Enable or disable header image replacement."); mainHeaderPath = BindConfig("1. Main Logo", "Path", "Defaults/Header/HeaderWhite.png", "Relative to your /Emblem/ folder: Specify a .png file. A folder will randomly select an image starting with the prefix 'Header'. Leave blank to use nothing."); mainHeaderYOffset = BindConfig("1. Main Logo", "Offset", 20f, "Vertical Y offset percentage from top. Set to -1 for no adjustment."); mainHeaderScale = BindConfig("1. Main Logo", "Scale", 60, "Image scale. This will maintain aspect ratio. 100 for apx original size"); mainHeaderAlpha = BindConfig("1. Main Logo", "Alpha", 80, "Image transparency. 0 for invisible and 100 for completely opaque."); enableMainBackground = BindConfig("2. Main Background", "Enable", defaultValue: true, "Enable or disable the custom main menu background."); mainBackgroundPath = BindConfig("2. Main Background", "Path", "Defaults/Background", "Relative to your /Emblem/ folder: Specify a .png, .mp4. A folder will randomly select an image starting with the prefix 'Background'. Separate multiple mp4 paths with a | to pick one randomly"); mainBackgroundColor = BindConfig("2. Main Background", "Color", "0,0,0", "Background color for Main Menu Screen in RGB format (ex: '0,0,0' for black). No alpha value as this is the bottom layer"); enableMenuColorChange = BindConfig("3. Menu Colors", "Enable", defaultValue: false, "Do you even want to mess with menu colors?"); menuFontColor = BindConfig("3. Menu Colors", "Color", "230,100,65,1", "Color of menu font."); menuRolloverBGColor = BindConfig("3. Menu Colors", "Highlight BG Color", "230,100,65,1", "Background color of a menu items on rollover."); menuRolloverFontColor = BindConfig("3. Menu Colors", "Highlight Font Color", "0,0,0,1", "Font color of menu items on rollover."); enableReplaceLoadHeader = BindConfig("4. Loading Image", "Enable", defaultValue: false, "Enable or disable loading image replacement."); loadHeaderPath = BindConfig("4. Loading Image", "Path", "Defaults/Loading", "Relative to your /Emblem/ folder: Specify a .png file. A folder will randomly select an image starting with the prefix 'Loading'. Leave blank to use nothing"); loadHeaderYOffset = BindConfig("4. Loading Image", "Offset", 50f, "Vertical Y offset percentage from top. Set to -1 for no adjustment."); loadHeaderScale = BindConfig("4. Loading Image", "Scale", 60, "Image scale. This will maintain aspect ratio."); loadHeaderAlpha = BindConfig("4. Loading Image", "Alpha", 100, "Image transparency. 0 for invisible and 100 for completely opaque."); loadHeaderStretch = BindConfig("4. Loading Image", "Stretch", defaultValue: false, "Stretch the loading image to fit the screen vertically. This will override scale and offset"); enableLoadBackground = BindConfig("5. Loading Background", "Enable", defaultValue: false, "Enable or disable the loading screen background."); loadBackgroundPath = BindConfig("5. Loading Background", "Path", "Defaults/Background", "Relative to your /Emblem/ folder: Specify a .png, .mp4. A folder will randomly select an image starting with the prefix 'LoadBackground'. Separate multiple mp4 paths with a | to pick one randomly"); loadBackgroundColor = BindConfig("5. Loading Background", "Color", "0,0,0,1", "Background color for Loading Screen in RGBA format (ex: '255,255,255,1' for white)."); enableLoadingTextChange = BindConfig("6. Loading Text", "Enable", defaultValue: false, "Enable or disable the custom loading text feature."); loadTextString = BindConfig("6. Loading Text", "Text", "Loading...", "Text displayed on the loading screen. Separate multiple texts with '|' to choose one at random"); loadTextColor = BindConfig("6. Loading Text", "Color", "255,139,0,1", "Color of the font in RGBA format (ex: '0,0,0,1' for blue)."); loadTextSize = BindConfig("6. Loading Text", "Font Size", 19.6f, "Size of the font used in the loading text."); loadTextYOffset = BindConfig("6. Loading Text", "Offset", -1f, "Vertical Y offset percentage from top. Set to -1 for no adjustment."); enableReplaceBorder = BindConfig("7. Borders", "Hide", defaultValue: false, "Enable or disable the corner borders."); borderColor = BindConfig("7. Borders", "Color", "115,59,0,1", "The color of the border in RGBA format (ex: '0,255,0,1' for green)."); borderPadding = BindConfig("7. Borders", "Padding", 10f, "How far should the border be from corners of the screen."); enableCustomVersion = BindConfig("8. Version Number", "Enable", defaultValue: false, "Play around in version styling? This will center the text and disable word wrapping"); versionTextString = BindConfig("8. Version Number", "Text", "[ %VERSION% ]", "Format string for the version text. Use %VERSION% for the original string."); versionColor = BindConfig("8. Version Number", "Color", "230,100,65,0.45", "The color of the text in RGBA format (ex: '255,0,0,1' for red).."); versionFontSize = BindConfig("8. Version Number", "Font Size", 16f, "Font size of the version text."); versionYOffset = BindConfig("8. Version Number", "Offset", 95.8f, "Vertical Y offset percentage from top."); enableRadiantTaper = BindConfig("9. Experimental", "Radiant Taper", defaultValue: false, "Use the vignette blending effect on background images?"); enableCRT = BindConfig("9. Experimental", "Retro TV Style", defaultValue: false, "Attempt to make the entire menu scene look like a CRT monitor?"); } private ConfigEntry<T> BindConfig<T>(string section, string key, T defaultValue, string description) { return config.Bind<T>(section, key, defaultValue, description); } } public static class UI { public const string MenuCont = "Canvas/MenuContainer"; public const string LoadScreen = "Canvas/LoadingScreen"; public const string MainBtns = "Canvas/MenuContainer/MainButtons"; public const string MainImg = "Canvas/MenuContainer/MainButtons/HeaderImage"; public const string LoadImg = "Canvas/MenuContainer/LoadingScreen/Image"; public const string CustBgImg = "Canvas/MenuContainer/MainButtons/Background"; public const string LoadTextCont = "Canvas/MenuContainer/LoadingTextContainer"; public const string LoadText = "Canvas/MenuContainer/LoadingTextContainer/LoadingText"; } } namespace Emblem.Managers { public class InterfaceDecorator { private readonly UIComponent uiComponent; private readonly BackgroundManager backgroundManager; private readonly HeaderReplacement headerReplacement; private readonly Boardwalk boardwalk; private readonly LoadingText loadingText; private readonly MenuMoodSetter menuMoodSetter; private readonly VersionStyler versionStyler; public InterfaceDecorator(UIComponent uiComponent, BackgroundManager backgroundManager, HeaderReplacement headerReplacement, Boardwalk boardwalk, LoadingText loadingText, MenuMoodSetter menuMoodSetter, VersionStyler versionStyler) { this.uiComponent = uiComponent; this.backgroundManager = backgroundManager; this.headerReplacement = headerReplacement; this.boardwalk = boardwalk; this.loadingText = loadingText; this.menuMoodSetter = menuMoodSetter; this.versionStyler = versionStyler; } public void ApplyMainMenuCustomizations() { uiComponent.ResetRectTransformProperties(); uiComponent.CreateBackgrounds(); uiComponent.SetVolumeLayerMaskOnAllCameras(-1); backgroundManager.ApplyMainMenuBackground(); backgroundManager.ApplyLoadingBackground(); headerReplacement.ReplaceMainImage(); headerReplacement.ReplaceLoadImage(); uiComponent.SetMainBackgroundColor(); loadingText.ApplyLoadingCustomizations(); menuMoodSetter.HarmonizeMenuHues(); boardwalk.ToggleBorder(); versionStyler.ApplyVersionStyling(); uiComponent.ApplyCRTEffectIfNeeded("Canvas"); DelayHelper.StartDelayedAction(0.3f, menuMoodSetter.HarmonizeMenuHues); } } public class SceneManagerHelper { private readonly InterfaceDecorator interfaceDecorator; public SceneManagerHelper(InterfaceDecorator interfaceDecorator) { this.interfaceDecorator = interfaceDecorator; SceneManager.sceneLoaded += OnSceneLoaded; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if (((Scene)(ref scene)).name == "MainMenu") { LogWarden.LogInfo("[SceneManager] Applying customizations to MainMenu."); interfaceDecorator.ApplyMainMenuCustomizations(); } } public void Unsubscribe() { SceneManager.sceneLoaded -= OnSceneLoaded; } } } namespace Emblem.Components { public class BackgroundManager { private readonly Configurator configManager; private readonly CustomMediaManager customMediaManager; private readonly ImageFilters imageFilters; public BackgroundManager(Configurator configManager, CustomMediaManager customMediaManager) { this.configManager = configManager; this.customMediaManager = customMediaManager; imageFilters = new ImageFilters(configManager); } public void ApplyMainMenuBackground() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (configManager.enableMainBackground.Value) { string value = configManager.mainBackgroundPath.Value; Color backgroundColor = ColorParser.RGB(configManager.mainBackgroundColor.Value); ApplyBackground("MenuContainer", value, "MainVideo", 0, "Background", backgroundColor); } } public void ApplyLoadingBackground() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (configManager.enableLoadBackground.Value) { string value = configManager.loadBackgroundPath.Value; Color backgroundColor = ColorParser.RGB(configManager.loadBackgroundColor.Value); ApplyBackground("LoadingScreen", value, "LoadingVideo", 1, "LoadBackground", backgroundColor); } } private void ApplyBackground(string parentObjectName, string backgroundPath, string videoObjectName, int siblingIndex, string imagePrefix, Color backgroundColor) { //IL_005c: Unknown result type (might be due to invalid IL or missing references) if (!string.IsNullOrEmpty(backgroundPath)) { Transform obj = PathFinder.Probe(parentObjectName); GameObject val = ((obj != null) ? ((Component)obj).gameObject : null); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[CustomBackgroundManager] " + parentObjectName + " not found in the scene."); } else if (backgroundPath.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase)) { HandleVideoBackground(val, backgroundPath, videoObjectName, siblingIndex); } else { HandleImageBackground(val, backgroundPath, siblingIndex, imagePrefix, backgroundColor); } } } private void HandleVideoBackground(GameObject parentObject, string backgroundPath, string videoObjectName, int siblingIndex) { string text = customMediaManager.LoadCustomVideoPath(backgroundPath); if (text != null) { (parentObject.GetComponent<BackgroundVideoManager>() ?? parentObject.AddComponent<BackgroundVideoManager>()).InitializeVideo(parentObject, text, videoObjectName, siblingIndex); } } private void HandleImageBackground(GameObject parentObject, string backgroundPath, int siblingIndex, string imagePrefix, Color backgroundColor) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) Sprite customSprite = customMediaManager.LoadCustomImage(backgroundPath, imagePrefix); CreateBackgroundImage(parentObject.transform, customSprite, siblingIndex, backgroundColor, imagePrefix + "Image"); } private void CreateBackgroundImage(Transform parentTransform, Sprite customSprite, int siblingIndex, Color backgroundColor, string objectName) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)customSprite == (Object)null) { LogWarden.LogError("[CustomBackgroundManager] No custom sprite provided for background image creation."); return; } GameObject val = CreateBackgroundObject(parentTransform, objectName, siblingIndex); Image val2 = SetImageComponent(val, customSprite); AdjustImageToFit(parentTransform, ((Component)val2).GetComponent<RectTransform>(), customSprite); ManageOtherUIElements(parentTransform); imageFilters.Blend(((Object)val).name, backgroundColor); } private GameObject CreateBackgroundObject(Transform parentTransform, string objectName, int siblingIndex) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: 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_0020: Expected O, but got Unknown GameObject val = new GameObject(objectName); val.transform.SetParent(parentTransform, false); val.transform.SetSiblingIndex(siblingIndex); return val; } private Image SetImageComponent(GameObject backgroundImageObject, Sprite customSprite) { Image obj = backgroundImageObject.AddComponent<Image>(); obj.sprite = customSprite; obj.preserveAspect = true; return obj; } private void AdjustImageToFit(Transform parentTransform, RectTransform rectTransform, Sprite customSprite) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0072: 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_007a: 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) rectTransform.anchorMin = new Vector2(0.5f, 0f); rectTransform.anchorMax = new Vector2(0.5f, 1f); rectTransform.pivot = new Vector2(0.5f, 0.5f); Rect rect = ((Component)parentTransform).GetComponent<RectTransform>().rect; float height = ((Rect)(ref rect)).height; Bounds bounds = customSprite.bounds; float num = ((Bounds)(ref bounds)).size.y * customSprite.pixelsPerUnit; float num2 = height / num; bounds = customSprite.bounds; rectTransform.sizeDelta = new Vector2(((Bounds)(ref bounds)).size.x * customSprite.pixelsPerUnit * num2, 0f); } private void ManageOtherUIElements(Transform parentTransform) { Transform val = PathFinder.Probe("MenuContainer/MainButtons/HeaderImage"); if ((Object)(object)val != (Object)null) { val.SetSiblingIndex(1); } } } public class BackgroundVideoManager : MonoBehaviour { private VideoPlayer videoPlayer; public string VideoPath { get; set; } public void InitializeVideo(GameObject targetGameObject, string videoPath, string videoObjectName, int siblingIndex) { VideoPath = videoPath; if ((Object)(object)targetGameObject == (Object)null) { LogWarden.LogError("[Video] Target GameObject not found in the scene."); } else { CreateBackgroundVideo(targetGameObject, videoObjectName, siblingIndex); } } private void CreateBackgroundVideo(GameObject targetGameObject, string videoObjectName, int siblingIndex) { //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Expected O, but got Unknown if (!string.IsNullOrEmpty(VideoPath)) { string text = (VideoPath.StartsWith("file://", StringComparison.OrdinalIgnoreCase) ? VideoPath : ("file://" + VideoPath)); string text2 = text.Replace(Paths.BepInExRootPath, ""); text2 = text2.TrimStart(new char[1] { Path.DirectorySeparatorChar }); LogWarden.LogInfo("[Video] Initializing video with relative path: " + text2); _ = ((Object)targetGameObject).name + "Video"; GameObject val = new GameObject(videoObjectName); val.transform.SetParent(targetGameObject.transform, false); val.transform.SetSiblingIndex(siblingIndex); RawImage rawImage = val.AddComponent<RawImage>(); videoPlayer = val.AddComponent<VideoPlayer>(); AudioSource audioSource = val.AddComponent<AudioSource>(); ConfigureVideoPlayer(text, audioSource, rawImage); AdjustRawImage(rawImage); LogWarden.LogInfo("[Video] Background video added to the scene."); } } private void ConfigureVideoPlayer(string fullPath, AudioSource audioSource, RawImage rawImage) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown videoPlayer.playOnAwake = true; videoPlayer.isLooping = true; videoPlayer.renderMode = (VideoRenderMode)2; videoPlayer.audioOutputMode = (VideoAudioOutputMode)1; videoPlayer.SetTargetAudioSource((ushort)0, audioSource); videoPlayer.source = (VideoSource)1; videoPlayer.url = fullPath; videoPlayer.aspectRatio = (VideoAspectRatio)1; RenderTexture val = new RenderTexture(1920, 1080, 0); videoPlayer.targetTexture = val; rawImage.texture = (Texture)(object)val; videoPlayer.errorReceived += new ErrorEventHandler(OnVideoErrorReceived); videoPlayer.prepareCompleted += new EventHandler(OnVideoPrepared); videoPlayer.Prepare(); } private void AdjustRawImage(RawImage rawImage) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0046: 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) RectTransform component = ((Component)rawImage).GetComponent<RectTransform>(); component.anchorMin = new Vector2(0f, 0f); component.anchorMax = new Vector2(1f, 1f); component.pivot = new Vector2(0.5f, 0.5f); component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; } private void OnVideoErrorReceived(VideoPlayer source, string message) { LogWarden.LogError("Video Error: " + message); } private void OnVideoPrepared(VideoPlayer source) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown source.prepareCompleted -= new EventHandler(OnVideoPrepared); LogWarden.LogInfo("[Video] Prepared and ready to play."); source.Play(); } } public class Boardwalk { private readonly Configurator configManager; public Boardwalk(Configurator configManager) { this.configManager = configManager; } public void ToggleBorder() { foreach (string item in new List<string> { "MainButtons", "LoadingScreen", "LobbyHostSettings", "DeleteFileConfirmation", "NewsPanel", "MenuNotification", "LANWarning", "LobbyList", "CreditsPanel" }) { Transform val = PathFinder.Probe(item); if ((Object)(object)val != (Object)null) { HideOriginalBorder(val); if (item == "MainButtons" && !configManager.enableReplaceBorder.Value) { CreateBorderCopy(val); } } else { LogWarden.LogWarning("[Border] " + item + " not found."); } } } private void HideOriginalBorder(Transform borderTransform) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) Image component = ((Component)borderTransform).GetComponent<Image>(); if ((Object)(object)component != (Object)null) { ((Graphic)component).color = new Color(((Graphic)component).color.r, ((Graphic)component).color.g, ((Graphic)component).color.b, 0f); } else { LogWarden.LogWarning("[Border] No Image component found on " + ((Object)borderTransform).name); } } private void CreateBorderCopy(Transform borderTransform) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) GameObject gameObject = ((Component)borderTransform).gameObject; Image component = gameObject.GetComponent<Image>(); if ((Object)(object)component == (Object)null) { LogWarden.LogWarning("[Border] No Image component found on " + ((Object)borderTransform).name + ". Cannot clone."); return; } GameObject val = new GameObject("Corners"); val.transform.SetParent(gameObject.transform.parent); val.transform.SetSiblingIndex(3); RectTransform rectTransform = ((Graphic)component).rectTransform; RectTransform obj = val.AddComponent<RectTransform>(); ((Transform)obj).localPosition = ((Transform)rectTransform).localPosition; ((Transform)obj).localRotation = ((Transform)rectTransform).localRotation; ((Transform)obj).localScale = ((Transform)rectTransform).localScale; obj.anchorMin = rectTransform.anchorMin; obj.anchorMax = rectTransform.anchorMax; obj.anchoredPosition = rectTransform.anchoredPosition; obj.sizeDelta = rectTransform.sizeDelta; obj.pivot = rectTransform.pivot; float value = configManager.borderPadding.Value; obj.offsetMax = new Vector2(0f - value, 0f - value); obj.offsetMin = new Vector2(value, value); Image obj2 = val.AddComponent<Image>(); obj2.sprite = component.sprite; obj2.type = component.type; obj2.fillCenter = component.fillCenter; ((Graphic)obj2).color = ColorParser.RGBA(configManager.borderColor.Value); obj2.pixelsPerUnitMultiplier = component.pixelsPerUnitMultiplier; ((Graphic)obj2).raycastTarget = false; LogWarden.LogInfo("[Border] " + ((Object)borderTransform).name + " border cloned with padding " + value + " and color set to " + configManager.borderColor.Value + "."); } } public class MenuMoodSetter { private readonly Configurator configManager; private static HashSet<string> loggedMessages = new HashSet<string>(); public MenuMoodSetter(Configurator configManager) { this.configManager = configManager; } public void HarmonizeMenuHues() { //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Expected O, but got Unknown if (!configManager.enableMenuColorChange.Value) { LogWarden.LogInfo("[MoodSetter] Menu color change is disabled."); return; } LogOnce("[MoodSetter] Harmonizing menu hues..."); Transform val = PathFinder.Probe("MainButtons"); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[MoodSetter] MainButtons object not found."); return; } LogOnce("[MoodSetter] MainButtons object found. Processing children..."); LogOnce("[MoodSetter] Painting menu font color: " + configManager.menuFontColor.Value); LogOnce("[MoodSetter] Painting menu rollover font color: " + configManager.menuRolloverFontColor.Value); LogOnce("[MoodSetter] Painting menu rollover background: " + configManager.menuRolloverBGColor.Value); foreach (Transform item in val) { Transform val2 = item; if (!((Object)(object)((Component)val2).GetComponent<Button>() == (Object)null)) { DisableAnimator(val2); SetupEventTriggers(val2); SetTextColor(val2, configManager.menuFontColor.Value); } } } private void LogOnce(string message) { if (!loggedMessages.Contains(message)) { LogWarden.LogInfo(message); loggedMessages.Add(message); } } private void DisableAnimator(Transform buttonTransform) { Animator component = ((Component)buttonTransform).GetComponent<Animator>(); if ((Object)(object)component != (Object)null) { ((Behaviour)component).enabled = false; } } private void SetupEventTriggers(Transform buttonTransform) { EventTrigger orAddComponent = GetOrAddComponent<EventTrigger>(((Component)buttonTransform).gameObject); AddEventTrigger(orAddComponent, (EventTriggerType)0, delegate { OnMouseEnter(buttonTransform); }); AddEventTrigger(orAddComponent, (EventTriggerType)1, delegate { OnMouseExit(buttonTransform); }); AddEventTrigger(orAddComponent, (EventTriggerType)4, delegate { ResetButtonState(buttonTransform); }); } private void OnMouseEnter(Transform buttonTransform) { SetTextColor(buttonTransform, configManager.menuRolloverFontColor.Value); SetSelectionHighlight(buttonTransform, enabled: true, configManager.menuRolloverBGColor.Value); } private void OnMouseExit(Transform buttonTransform) { SetTextColor(buttonTransform, configManager.menuFontColor.Value); SetSelectionHighlight(buttonTransform, enabled: false, ""); } private void ResetButtonState(Transform buttonTransform) { SetTextColor(buttonTransform, configManager.menuFontColor.Value); SetSelectionHighlight(buttonTransform, enabled: false, ""); } private void SetTextColor(Transform buttonTransform, string colorString) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) TMP_Text componentInChildren = ((Component)buttonTransform).GetComponentInChildren<TMP_Text>(); if (!((Object)(object)componentInChildren == (Object)null)) { string text = RemoveColorTags(componentInChildren.text); Color val = ColorParser.RGBA(colorString); string text2 = ColorUtility.ToHtmlStringRGB(new Color(val.r, val.g, val.b)); componentInChildren.text = "<color=#" + text2 + ">" + text + "</color>"; componentInChildren.alpha = val.a; } } private string RemoveColorTags(string text) { return Regex.Replace(text, "<color=#[0-9A-Fa-f]{6,8}>(.*?)</color>", "$1"); } private void SetSelectionHighlight(Transform buttonTransform, bool enabled, string colorString) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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) Transform val = buttonTransform.Find("SelectionHighlight"); Image val2 = default(Image); if (!((Object)(object)val == (Object)null) && ((Component)val).TryGetComponent<Image>(ref val2)) { ((Behaviour)val2).enabled = enabled; if (enabled) { Color color = ColorParser.RGBA(colorString); ((Graphic)val2).color = color; } } } private T GetOrAddComponent<T>(GameObject obj) where T : Component { return obj.GetComponent<T>() ?? obj.AddComponent<T>(); } private void AddEventTrigger(EventTrigger trigger, EventTriggerType type, UnityAction<BaseEventData> action) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown Entry val = new Entry { eventID = type }; ((UnityEvent<BaseEventData>)(object)val.callback).AddListener(action); trigger.triggers.Add(val); } } public class VersionStyler { private Configurator configManager; public VersionStyler(Configurator config) { configManager = config; } public void ApplyVersionStyling() { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) if (!configManager.enableCustomVersion.Value) { LogWarden.LogInfo("[VersionStyler] Custom version styling is disabled."); return; } Transform val = PathFinder.Probe("Canvas/MenuContainer/VersionNum"); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[VersionStyler] Version number GameObject not found."); return; } TextMeshProUGUI val2 = default(TextMeshProUGUI); if (!((Component)val).TryGetComponent<TextMeshProUGUI>(ref val2)) { LogWarden.LogError("[VersionStyler] TextMeshPro component not found on Version number GameObject."); return; } string value = configManager.versionTextString.Value; string text = ((TMP_Text)val2).text; string text2 = value.Replace("%VERSION%", text); Color val3 = ColorParser.RGBA(configManager.versionColor.Value); ((TMP_Text)val2).text = "<color=#" + ColorUtility.ToHtmlStringRGB(val3) + ">" + text2 + "</color>"; ((TMP_Text)val2).alpha = val3.a; ((TMP_Text)val2).fontSize = configManager.versionFontSize.Value; ((TMP_Text)val2).enableWordWrapping = false; ((TMP_Text)val2).alignment = (TextAlignmentOptions)514; float num = 1f - configManager.versionYOffset.Value / 100f; RectTransform component = ((Component)val2).GetComponent<RectTransform>(); component.anchorMin = new Vector2(0.5f, num); component.anchorMax = new Vector2(0.5f, num); component.pivot = new Vector2(0.5f, 0.5f); component.anchoredPosition = new Vector2(0f, 0f); Color val4 = ColorParser.RGBA(configManager.versionColor.Value); float value2 = configManager.versionYOffset.Value; LogWarden.LogInfo("[VersionStyler] Text set to " + ((TMP_Text)val2).text); LogWarden.LogInfo($"[VersionStyler] Applied styling - Color {ColorUtility.ToHtmlStringRGBA(val4)}, Font Size {configManager.versionFontSize.Value}, Y Offset {value2}%"); } } public class CustomMediaManager { private EmblemFolder emblemFolder; public CustomMediaManager() { emblemFolder = new EmblemFolder(); } public string LoadCustomVideoPath(string path) { string text = path; if (path.Contains("|")) { string[] array = path.Split(new char[1] { '|' }); text = array[Random.Range(0, array.Length)]; } string text2 = emblemFolder.FindFullPath(text); if (text2 == null || !text2.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase)) { LogWarden.LogError("[VideoManage] Failed to find video at path: " + text); return null; } if (!Path.IsPathRooted(text2)) { text2 = Path.Combine(Paths.BepInExRootPath, "plugins", text2); LogWarden.LogInfo("[Video] Using absolute path for video: " + text2); } return text2; } public Sprite LoadCustomImage(string path, string imagePrefix) { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) string imagePath = GetImagePath(path, imagePrefix); if (imagePath == null) { LogWarden.LogError("[ImgManage] Failed to find image at path: " + path); return null; } try { byte[] imageBytes = File.ReadAllBytes(imagePath); Texture2D val = LoadTextureFromBytes(imageBytes); if ((Object)(object)val == (Object)null) { return null; } string logPathForBepInEx = GetLogPathForBepInEx(imagePath); LogWarden.LogInfo("[ImgManage] File ripped from " + logPathForBepInEx + "."); return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); } catch (Exception ex) { LogWarden.LogError("[ImgManage] Failed to read image bytes from path: " + imagePath + ". Exception: " + ex.Message); return null; } } private Texture2D LoadTextureFromBytes(byte[] imageBytes) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false); if (!ImageConversion.LoadImage(val, imageBytes, true)) { LogWarden.LogError("[ImgManage] Failed to load image data into texture."); return null; } ((Texture)val).filterMode = (FilterMode)1; ((Texture)val).wrapMode = (TextureWrapMode)1; return val; } private string GetLogPathForBepInEx(string fullPath) { int startIndex = fullPath.IndexOf("BepInEx") + "BepInEx".Length; return fullPath.Substring(startIndex).TrimStart(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); } private string GetImagePath(string path, string imagePrefix = null) { string text = emblemFolder.FindFullPath(path); if (text != null && text.EndsWith(".png", StringComparison.OrdinalIgnoreCase)) { return text; } if (text != null && Directory.Exists(text) && !string.IsNullOrEmpty(imagePrefix)) { return GetRandomPrefixFile(text, imagePrefix, ".png"); } LogWarden.LogError("[ImgManage] Path does not exist or is not a valid PNG file: " + path); return null; } private string GetRandomPrefixFile(string directory, string filePrefix, string extension) { string[] files = Directory.GetFiles(directory, filePrefix + "*.png"); if (files.Length != 0) { return files[new Random().Next(files.Length)]; } return GetRandomPngFile(directory); } private string GetRandomPngFile(string directory) { string[] files = Directory.GetFiles(directory, "*.png"); if (files.Length == 0) { LogWarden.LogError("[ImgManage] No PNG files found in directory " + directory + "."); return null; } return files[new Random().Next(files.Length)]; } } public class HeaderReplacement { private readonly Configurator configManager; private readonly CustomMediaManager customMediaManager; private readonly UIComponent uiComponent; public HeaderReplacement(Configurator configManager, UIComponent uiComponent, CustomMediaManager customMediaManager) { this.configManager = configManager; this.customMediaManager = customMediaManager; this.uiComponent = uiComponent; } public void ReplaceMainImage() { ReplaceImage("Canvas/MenuContainer/MainButtons/HeaderImage", configManager.mainHeaderPath.Value, configManager.enableReplaceMainHeader.Value, isHeader: true); } public void ReplaceLoadImage() { ReplaceImage("Canvas/MenuContainer/LoadingScreen/Image", configManager.loadHeaderPath.Value, configManager.enableReplaceLoadHeader.Value, isHeader: false); } private void ReplaceImage(string uiPath, string imagePath, bool isEnabled, bool isHeader) { if (isEnabled && TryGetImageComponent(uiPath, out var targetImage)) { if (!TryLoadCustomSprite(imagePath, isHeader, out var customSprite)) { HideOriginalImage(targetImage); return; } SetupImage(targetImage, customSprite, isHeader); ApplyImageModifications(targetImage, isHeader, uiPath); LogWarden.LogInfo("[ImgReplace] " + uiPath + " image replaced and resized successfully."); } } private void HideOriginalImage(Image targetImage) { ((Behaviour)targetImage).enabled = false; LogWarden.LogInfo("[ImgReplace] Original image hidden due to missing custom sprite."); } private bool TryGetImageComponent(string uiPath, out Image targetImage) { targetImage = GetImageComponent(uiPath); return (Object)(object)targetImage != (Object)null; } private bool TryLoadCustomSprite(string imagePath, bool isHeader, out Sprite customSprite) { customSprite = null; if (string.IsNullOrWhiteSpace(imagePath)) { LogWarden.LogInfo("[ImgManage] Skipping image load for " + (isHeader ? "header" : "loading") + " due to blank path."); return false; } customSprite = customMediaManager.LoadCustomImage(imagePath, isHeader ? "Header" : "Loading"); if ((Object)(object)customSprite == (Object)null) { LogWarden.LogError("[ImgManage] Failed to find image at path: " + imagePath); } return (Object)(object)customSprite != (Object)null; } private void SetupImage(Image targetImage, Sprite customSprite, bool isHeader) { targetImage.sprite = customSprite; targetImage.preserveAspect = true; ResetImageProperties(((Graphic)targetImage).rectTransform); SetImageTransparency(targetImage, isHeader ? configManager.mainHeaderAlpha.Value : configManager.loadHeaderAlpha.Value, isHeader ? "Header Image" : "Loading Header Image"); } private void ApplyImageModifications(Image targetImage, bool isHeader, string uiPath) { if (isHeader || !configManager.loadHeaderStretch.Value) { SetImageYOffset(((Graphic)targetImage).rectTransform, isHeader ? configManager.mainHeaderYOffset.Value : configManager.loadHeaderYOffset.Value, isHeader); SetImageSize(((Graphic)targetImage).rectTransform, isHeader ? configManager.mainHeaderScale.Value : configManager.loadHeaderScale.Value, targetImage.sprite); } if (!isHeader && configManager.loadHeaderStretch.Value && uiPath == "Canvas/MenuContainer/LoadingScreen/Image") { StretchLoadingImage(((Graphic)targetImage).rectTransform); } } private Image GetImageComponent(string uiPath) { Transform val = PathFinder.Probe(uiPath); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[ImgReplace] Failed to find UI element at path '" + uiPath + "'."); return null; } Image component = ((Component)val).GetComponent<Image>(); if ((Object)(object)component == (Object)null) { LogWarden.LogError("[ImgReplace] Image component not found on UI element at path '" + uiPath + "'."); return null; } return component; } private void ResetImageProperties(RectTransform rectTransform) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) rectTransform.anchorMin = Vector2.zero; rectTransform.anchorMax = Vector2.one; rectTransform.offsetMin = Vector2.zero; rectTransform.offsetMax = Vector2.zero; rectTransform.pivot = new Vector2(0.5f, 0.5f); ((Transform)rectTransform).localScale = Vector3.one; ((Transform)rectTransform).rotation = Quaternion.identity; rectTransform.sizeDelta = Vector2.zero; rectTransform.anchoredPosition = Vector2.zero; rectTransform.anchoredPosition3D = Vector3.zero; ((Transform)rectTransform).localRotation = Quaternion.identity; } public void SetImageTransparency(Image image, int transparencyPercent, string imageName) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)image == (Object)null) { LogWarden.LogError("[UI] Image component not found."); return; } float num = (float)transparencyPercent / 100f; Color color = ((Graphic)image).color; ((Graphic)image).color = new Color(color.r, color.g, color.b, num); LogWarden.LogInfo($"[UI] {imageName} transparency set to {num * 100f}%."); } private void SetImageYOffset(RectTransform rectTransform, float yOffsetPercent, bool isHeader) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_003b: 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) float num = 1f - yOffsetPercent / 100f; rectTransform.anchorMin = new Vector2(0.5f, num); rectTransform.anchorMax = new Vector2(0.5f, num); rectTransform.pivot = new Vector2(0.5f, 0.5f); rectTransform.anchoredPosition = new Vector2(0f, 0f); string arg = (isHeader ? "Header" : "Loading image"); LogWarden.LogInfo($"[UI] {arg} Y offset set to {yOffsetPercent}% from the top."); } private void SetImageSize(RectTransform rectTransform, int scaleValue, Sprite sprite) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) Rect rect = sprite.rect; float width = ((Rect)(ref rect)).width; rect = sprite.rect; float height = ((Rect)(ref rect)).height; float num = (float)scaleValue / 250f; float num2 = width * num; float num3 = height * num; rectTransform.sizeDelta = new Vector2(num2, num3); } public void StretchLoadingImage(RectTransform rectTransform) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)rectTransform == (Object)null) { LogWarden.LogError("[UI] Loading image RectTransform not found."); return; } ((Transform)rectTransform).localScale = Vector3.one; rectTransform.pivot = new Vector2(0.5f, 0.5f); if (configManager.loadHeaderStretch.Value) { rectTransform.anchorMin = new Vector2(0f, 0f); rectTransform.anchorMax = new Vector2(1f, 1f); rectTransform.sizeDelta = Vector2.zero; LogWarden.LogInfo("[UI] Loading image stretched to fill screen vertically."); } } } public class LoadingText : MonoBehaviour { private Configurator configManager; public void Initialize(Configurator configManager) { this.configManager = configManager; } public void ApplyLoadingCustomizations() { RectTransform val = FindLoadingTextContainer(); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[LoadText] LoadingTextContainer not found."); return; } SetSiblingIndex((Transform)(object)val); if (configManager.enableLoadingTextChange.Value) { SetLoadingText(val, configManager.loadTextString.Value); } else { LogWarden.LogInfo("[LoadText] Loading text change is disabled by configuration."); } } private void SetLoadingText(RectTransform loadingTextContainer, string text) { string[] array = text.Split(new char[1] { '|' }); string text2 = array[Random.Range(0, array.Length)]; if (array.Length > 1) { LogWarden.LogInfo($"[LoadText] Found {array.Length} strings."); } if (configManager.enableLoadingTextChange.Value) { SetTextProperties((Transform)(object)loadingTextContainer, text2); } } private RectTransform FindLoadingTextContainer() { Transform val = PathFinder.Probe("Canvas/MenuContainer/LoadingTextContainer"); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[LoadText] Loading text container not found at path: Canvas/MenuContainer/LoadingTextContainer."); return null; } return ((Component)val).GetComponent<RectTransform>(); } private void SetSiblingIndex(Transform loadingTextContainer) { loadingTextContainer.SetSiblingIndex(9); } private void SetTextProperties(Transform loadingTextContainer, string text) { string text2 = "Canvas/MenuContainer/LoadingTextContainer/LoadingText"; Transform val = PathFinder.Probe(((Object)loadingTextContainer).name + "/" + text2); TextMeshProUGUI val2 = default(TextMeshProUGUI); RectTransform loadingTextContainer2 = default(RectTransform); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[LoadText] TMP component not found at path '" + ((Object)loadingTextContainer).name + "/" + text2 + "'."); } else if (!((Component)val).TryGetComponent<TextMeshProUGUI>(ref val2)) { LogWarden.LogError("[LoadText] TMP component not found on object at path '" + ((Object)loadingTextContainer).name + "/" + text2 + "'."); } else if (!((Component)loadingTextContainer).TryGetComponent<RectTransform>(ref loadingTextContainer2)) { LogWarden.LogError("[LoadText] RectTransform component not found on '" + ((Object)loadingTextContainer).name + "'."); } else { AdjustTextContainerAnchors(loadingTextContainer2); ((TMP_Text)val2).text = text; ((TMP_Text)val2).enableWordWrapping = false; ((TMP_Text)val2).fontSize = configManager.loadTextSize.Value; SetTextColor(val2); LogWarden.LogInfo($"[LoadText] Set to: {text} with font size: {configManager.loadTextSize.Value}"); } } private void SetTextColor(TextMeshProUGUI loadingTextTMP) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) try { Color color = ColorParser.RGBA(configManager.loadTextColor.Value); ((Graphic)loadingTextTMP).color = color; LogWarden.LogInfo("[LoadText] Font color set to: " + configManager.loadTextColor.Value); } catch (Exception ex) { LogWarden.LogError("[LoadText] Error setting font color using ColorParser: " + ex.Message); } } private void AdjustTextContainerAnchors(RectTransform loadingTextContainer) { //IL_0045: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) float value = configManager.loadTextYOffset.Value; if (value == -1f) { LogWarden.LogInfo("[LoadText] No vertical adjustment applied."); return; } float num = 1f - value / 100f; num = Mathf.Clamp(num, 0f, 1f); loadingTextContainer.pivot = new Vector2(loadingTextContainer.pivot.x, num); loadingTextContainer.anchorMin = new Vector2(loadingTextContainer.anchorMin.x, num); loadingTextContainer.anchorMax = new Vector2(loadingTextContainer.anchorMax.x, num); Vector2 anchoredPosition = loadingTextContainer.anchoredPosition; loadingTextContainer.anchoredPosition = new Vector2(anchoredPosition.x, 0f); LogWarden.LogInfo($"[LoadText] Vertical position adjusted with Y Offset: {value}"); } } public class UIComponent { private readonly Configurator configManager; public UIComponent(Configurator configManager) { this.configManager = configManager; } public void ResetRectTransformProperties() { //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) List<string> obj = new List<string> { "MainButtons", "LoadingScreen", "LobbyHostSettings", "LobbyList" }; List<string> list = new List<string>(); foreach (string item in obj) { Transform val = PathFinder.Probe(item); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[UI] " + item + " Transform not found."); return; } RectTransform component = ((Component)val).GetComponent<RectTransform>(); if ((Object)(object)component == (Object)null) { LogWarden.LogError("[UI] " + item + " does not have a RectTransform component."); return; } component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; component.pivot = new Vector2(0.5f, 0.5f); component.anchoredPosition = Vector2.zero; component.anchoredPosition3D = Vector3.zero; val.localPosition = Vector3.zero; val.localScale = Vector3.one; list.Add(item); } if (list.Any()) { LogWarden.LogInfo("[UI] De-borking... " + string.Join(", ", list) + "."); } } public void CreateBackgrounds() { CreateLoadingBackground(); (string, string)[] array = new(string, string)[2] { ("MenuContainer/SettingsPanel", "SettingsBackground"), ("MenuContainer/LobbyList", "LobbyBackground") }; for (int i = 0; i < array.Length; i++) { var (path, name) = array[i]; CreateCommonBackground(path, name); } } private void CreateLoadingBackground() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) Color val = ColorParser.RGBA(configManager.loadBackgroundColor.Value); CreateBackground("LoadingScreen", "LoadingBackground", val, val.a); } private void CreateCommonBackground(string path, string name) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) Color black = Color.black; black.a = 0.95f; CreateBackground(path, name, black, black.a); } private void CreateBackground(string path, string name, Color backgroundColor, float alpha) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0045: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) Transform val = PathFinder.Probe(path); if ((Object)(object)val == (Object)null) { LogWarden.LogError("CreateBackgrounds: '" + path + "' Transform not found using PathFinder."); return; } GameObject val2 = new GameObject(name); val2.transform.SetParent(val, false); val2.transform.SetSiblingIndex(0); ((Graphic)val2.AddComponent<Image>()).color = backgroundColor; RectTransform component = val2.GetComponent<RectTransform>(); component.anchorMin = new Vector2(0f, 0f); component.anchorMax = new Vector2(1f, 1f); component.sizeDelta = Vector2.zero; } public void SetMainBackgroundColor() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) Transform val = PathFinder.Probe("Canvas/MenuContainer"); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[UI] Canvas/MenuContainer element not found."); return; } ((Graphic)(((Component)val).GetComponent<Image>() ?? ((Component)val).gameObject.AddComponent<Image>())).color = ColorParser.RGB(configManager.mainBackgroundColor.Value); LogWarden.LogInfo("[UI] Menu container color set to " + configManager.mainBackgroundColor.Value + "."); } public void SetVolumeLayerMaskOnAllCameras(int layerMask) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) Camera[] array = Object.FindObjectsOfType<Camera>(); foreach (Camera val in array) { HDAdditionalCameraData component = ((Component)val).GetComponent<HDAdditionalCameraData>(); if ((Object)(object)component != (Object)null) { component.volumeLayerMask = LayerMask.op_Implicit(layerMask); Debug.Log((object)$"Set volumeLayerMask to {layerMask} on camera {((Object)val).name}"); } } } public void ApplyCRTEffectIfNeeded(string volumeGameObjectName) { Transform val = PathFinder.Probe(volumeGameObjectName); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[UI] " + volumeGameObjectName + " GameObject not found."); return; } GameObject gameObject = ((Component)val).gameObject; if (configManager.enableCRT.Value) { new CRTEffect().SetupVolume(gameObject); } else { LogWarden.LogInfo("[UI] CRT effect is not enabled. Skipping CRT effect setup for " + volumeGameObjectName + "."); } } } }