using System; using BepInEx; using BepInEx.Unity.IL2CPP; using Reactor.Utilities; using Reactor.Utilities.Extensions; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; using Version = SemanticVersioning.Version; namespace Reactor.Patches; /// /// Shows the reactor version on the main menu. /// public static class ReactorVersionShower { /// /// Gets the text. /// public static TextMeshPro? Text { get; private set; } /// /// Occurs when is updated. /// public static event Action? TextUpdated; private static void SetMainMenuPositionFromAspect(float aspectRatio) { if (Text == null) return; var pos = new Vector3(-1.2287f * aspectRatio + 10.9f, -0.57f, 4.5f); Text.transform.position = pos; } private static readonly ResolutionManager.ResolutionChangedHandler _resolutionChangedHandler = (Action) ((aspectRatio, _, _, _) => { SetMainMenuPositionFromAspect(aspectRatio); }); internal static void Initialize() { SceneManager.add_sceneLoaded((Action) ((scene, _) => { var original = UnityEngine.Object.FindObjectOfType(); if (!original) return; var originalAspectPosition = original.GetComponent(); var originalText = original.GetComponentInChildren(); var gameObject = new GameObject("ReactorVersion"); Text = gameObject.AddComponent(); Text.font = originalText.font; Text.fontMaterial = originalText.fontMaterial; Text.UpdateFontAsset(); Text.overflowMode = TextOverflowModes.Overflow; Text.fontSize = 2; Text.outlineWidth = 0.1f; Text.enableWordWrapping = false; Text.alignment = TextAlignmentOptions.TopLeft; if (scene.name == "MainMenu") { ResolutionManager.add_ResolutionChanged(_resolutionChangedHandler); SetMainMenuPositionFromAspect(Screen.width / (float) Screen.height); } else { ResolutionManager.remove_ResolutionChanged(_resolutionChangedHandler); var aspectPosition = gameObject.AddComponent(); var distanceFromEdge = new Vector3(10.13f, 2.55f, -1); if (originalAspectPosition.Alignment == AspectPosition.EdgeAlignments.LeftTop) { distanceFromEdge.y += 0.2f; } else if (AccountManager.Instance.isActiveAndEnabled) { distanceFromEdge.x += 0.2f; distanceFromEdge.y += 0.575f; } aspectPosition.Alignment = AspectPosition.EdgeAlignments.LeftTop; aspectPosition.DistanceFromEdge = distanceFromEdge; aspectPosition.AdjustPosition(); } UpdateText(); })); } /// /// Updates with reactor version and fires . /// public static void UpdateText() { if (Text == null) return; Text.text = "Reactor " + Version.Parse(ReactorPlugin.Version).WithoutBuild(); Text.text += "\nBepInEx " + Paths.BepInExVersion.WithoutBuild(); Text.text += "\nMods: " + IL2CPPChainloader.Instance.Plugins.Count; var creditsText = ReactorCredits.GetText(ReactorCredits.Location.MainMenu); if (creditsText != null) { Text.text += "\n" + creditsText; } TextUpdated?.Invoke(Text); } }