using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using AcesGamingUK.Common; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using TMPro; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("GiveCorrectChange")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("GiveCorrectChange")] [assembly: AssemblyTitle("GiveCorrectChange")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace GiveCorrectChange { [BepInPlugin("com.acesgaminguk.givecorrectchange", "GiveCorrectChange", "1.0.1")] public sealed class Plugin : BaseUnityPlugin { internal static ManualLogSource Log; internal static Harmony Harmony; internal static ConfigEntry Enabled; internal static ConfigEntry Mode; internal static ConfigEntry ManualHotkey; internal static ConfigEntry ShowPrompt; internal static ConfigEntry PromptScale; internal static ConfigEntry PromptColour; internal static ConfigEntry CustomPromptColour; internal static ConfigEntry PanelX; internal static ConfigEntry PanelY; internal static Data_Container? ActiveCashRegister; internal static bool ManualChangePrepared; internal static float ManualPreparedAt; private NativePrompt? _prompt; private void Awake() { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Expected O, but got Unknown //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Expected O, but got Unknown //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02f6: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; Enabled = ((BaseUnityPlugin)this).Config.Bind("# General #", "Enable Mod", true, "Turns Give Correct Change on or off."); Mode = ((BaseUnityPlugin)this).Config.Bind("# General #", "Change Method", ChangeMode.ManualFill, "Manual Fill uses the hotkey. Auto Fill prepares the exact change. Auto Complete finishes cash transactions immediately."); ManualHotkey = ((BaseUnityPlugin)this).Config.Bind("# Controls #", "Give Change Key", new KeyboardShortcut((KeyCode)102, Array.Empty()), "The key used in Manual Fill mode."); ShowPrompt = ((BaseUnityPlugin)this).Config.Bind("# Display #", "Show Prompt", true, "Shows the native Give Change prompt during a cash checkout."); PromptScale = ((BaseUnityPlugin)this).Config.Bind("# Display #", "Prompt Size", 1f, new ConfigDescription("Changes the size of the prompt.", (AcceptableValueBase)(object)new AcceptableValueRange(0.5f, 2f), Array.Empty())); PromptColour = ((BaseUnityPlugin)this).Config.Bind("# Display #", "Prompt Colour", "Game Default", new ConfigDescription("Changes the prompt background colour.", (AcceptableValueBase)(object)new AcceptableValueList(new string[8] { "Game Default", "Purple", "Blue", "Orange", "Green", "Red", "Demo Red", "Custom" }), Array.Empty())); CustomPromptColour = ((BaseUnityPlugin)this).Config.Bind("# Display #", "Custom Prompt Colour", new Color(0.36f, 0.16f, 0.46f, 1f), "Used only when Prompt Colour is set to Custom."); PanelX = ((BaseUnityPlugin)this).Config.Bind("# Display #", "Prompt Position X", 28f, "Saved horizontal position of the prompt."); PanelY = ((BaseUnityPlugin)this).Config.Bind("# Display #", "Prompt Position Y", 340f, "Saved vertical position of the prompt."); _prompt = new NativePrompt((MonoBehaviour)(object)this, ((BaseUnityPlugin)this).Logger, ShowPrompt, PromptScale, PromptColour, CustomPromptColour, PanelX, PanelY, GetPromptText, () => Enabled.Value && Mode.Value == ChangeMode.ManualFill && (Object)(object)ActiveCashRegister != (Object)null, "GiveCorrectChangePrompt"); ManualHotkey.SettingChanged += delegate { _prompt.Refresh(); }; Mode.SettingChanged += delegate { _prompt.Refresh(); }; Enabled.SettingChanged += delegate { _prompt.Refresh(); }; StartupBanner.Write(((BaseUnityPlugin)this).Logger, "Give Correct Change", ((BaseUnityPlugin)this).Info.Metadata.Version.ToString(), "https://github.com/AcesGamingUK/Give-Correct-Change", "Give change key: " + ((object)ManualHotkey.Value/*cast due to .constrained prefix*/).ToString(), "Change method: " + Mode.Value); Harmony = new Harmony("com.acesgaminguk.givecorrectchange"); Harmony.PatchAll(); } private string GetPromptText() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) if (!ManualChangePrepared) { return $"Press {ManualHotkey.Value} to Give Change"; } return "Change Ready - Click Cash Pile"; } private void Update() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) _prompt?.Tick(); if (Enabled.Value && Mode.Value == ChangeMode.ManualFill && !((Object)(object)ActiveCashRegister == (Object)null)) { KeyboardShortcut value = ManualHotkey.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { CorrectChangeHelper.PrepareCorrectChange(ActiveCashRegister, hideManualPrompt: false); _prompt?.Refresh(); } } } private void OnDestroy() { Harmony harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } _prompt?.Destroy(); } } public enum ChangeMode { ManualFill, AutoFill, AutoComplete } internal static class CorrectChangeHelper { private static readonly FieldInfo MoneyToReturnField = AccessTools.Field(typeof(Data_Container), "moneyToReturn"); private static readonly FieldInfo CurrentAmountToReturnField = AccessTools.Field(typeof(Data_Container), "currentAmountToReturn"); private static readonly FieldInfo AllowMoneyReturnField = AccessTools.Field(typeof(Data_Container), "allowMoneyReturn"); internal static bool FieldsReady() { if (MoneyToReturnField != null && CurrentAmountToReturnField != null && AllowMoneyReturnField != null) { return true; } Plugin.Log.LogError((object)"Could not find one or more checkout fields. Game update may have changed Data_Container."); return false; } internal static float GetMoneyToReturn(Data_Container container) { if (!FieldsReady()) { return 0f; } return Mathf.Round((float)MoneyToReturnField.GetValue(container) * 100f) / 100f; } internal static void PrepareCorrectChange(Data_Container container, bool hideManualPrompt) { //IL_0088: Unknown result type (might be due to invalid IL or missing references) try { if (!Plugin.Enabled.Value || !FieldsReady()) { return; } float moneyToReturn = GetMoneyToReturn(container); if (moneyToReturn < 0f) { return; } CurrentAmountToReturnField.SetValue(container, moneyToReturn); AllowMoneyReturnField.SetValue(container, true); Transform val = ((Component)container).transform.Find("CashRegisterCanvas/Container/CurrentAmount"); if (Object.op_Implicit((Object)(object)val)) { TextMeshProUGUI component = ((Component)val).GetComponent(); if (Object.op_Implicit((Object)(object)component)) { ((TMP_Text)component).text = ProductListing.Instance.ConvertFloatToTextPrice(moneyToReturn); ((Graphic)component).color = Color.green; } } Transform val2 = ((Component)container).transform.Find("CashRegister/MoneyGivenBack"); if (Object.op_Implicit((Object)(object)val2)) { ((Component)val2).gameObject.SetActive(true); } if ((Object)(object)Plugin.ActiveCashRegister == (Object)(object)container) { Plugin.ManualChangePrepared = true; Plugin.ManualPreparedAt = Time.realtimeSinceStartup; } if (hideManualPrompt && (Object)(object)Plugin.ActiveCashRegister == (Object)(object)container) { Plugin.ActiveCashRegister = null; } } catch (Exception ex) { Plugin.Log.LogError((object)("Failed to prepare correct change: " + ex)); } } } [HarmonyPatch(typeof(Data_Container), "UserCode_RpcHidePaymentMethod__Int32__Int32")] internal static class DataContainer_RpcHidePaymentMethod_Patch { private static void Postfix(Data_Container __instance, int index, int amountGiven) { if (!Plugin.Enabled.Value || index != 0) { return; } try { if (CorrectChangeHelper.FieldsReady() && !(CorrectChangeHelper.GetMoneyToReturn(__instance) < 0f)) { if (Plugin.Mode.Value == ChangeMode.AutoComplete) { Plugin.ActiveCashRegister = null; Plugin.ManualChangePrepared = false; __instance.CmdReceivePayment(0f); } else if (Plugin.Mode.Value == ChangeMode.AutoFill) { Plugin.ActiveCashRegister = null; Plugin.ManualChangePrepared = false; CorrectChangeHelper.PrepareCorrectChange(__instance, hideManualPrompt: true); } else { Plugin.ManualChangePrepared = false; Plugin.ManualPreparedAt = 0f; Plugin.ActiveCashRegister = __instance; } } } catch (Exception ex) { Plugin.Log.LogError((object)("Failed to set up manual correct change: " + ex)); } } } [HarmonyPatch(typeof(Data_Container), "UserCode_CmdReceivePayment__Single")] internal static class DataContainer_CmdReceivePayment_Patch { private static void Prefix(Data_Container __instance, ref float returnDifference) { if (!Plugin.Enabled.Value) { return; } try { if (Plugin.Mode.Value == ChangeMode.AutoFill || Plugin.Mode.Value == ChangeMode.ManualFill) { float moneyToReturn = CorrectChangeHelper.GetMoneyToReturn(__instance); if (Mathf.Abs(__instance.currentAmountToReturn - moneyToReturn) <= 0.011f) { returnDifference = 0f; } } } catch (Exception ex) { Plugin.Log.LogError((object)("Failed to normalize return difference: " + ex)); } } private static void Postfix(Data_Container __instance) { if ((Object)(object)Plugin.ActiveCashRegister == (Object)(object)__instance) { Plugin.ActiveCashRegister = null; Plugin.ManualChangePrepared = false; Plugin.ManualPreparedAt = 0f; } } } internal static class PluginInfo { public const string Guid = "com.acesgaminguk.givecorrectchange"; public const string Name = "GiveCorrectChange"; public const string DisplayName = "Give Correct Change"; public const string Version = "1.0.1"; public const string Author = "AcesGamingUK"; public const string Website = "https://github.com/AcesGamingUK/Give-Correct-Change"; } } namespace AcesGamingUK.Common { internal static class NativeNotification { internal static void Show(ManualLogSource log, string message, bool important = true) { if ((Object)(object)GameCanvas.Instance == (Object)null) { if (log != null) { log.LogMessage((object)message.Replace("\n", " | ")); } return; } GameObject val = ((important && Object.op_Implicit((Object)(object)GameCanvas.Instance.importantNotificationPrefab)) ? GameCanvas.Instance.importantNotificationPrefab : GameCanvas.Instance.notificationPrefab); Transform val2 = ((important && Object.op_Implicit((Object)(object)GameCanvas.Instance.importantNotificationParentTransform)) ? GameCanvas.Instance.importantNotificationParentTransform : GameCanvas.Instance.notificationParentTransform); if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)val2)) { if (log != null) { log.LogWarning((object)"Could not find the game's notification prefab or parent."); } if (log != null) { log.LogMessage((object)message.Replace("\n", " | ")); } return; } GameObject val3 = Object.Instantiate(val, val2); TextMeshProUGUI val4 = val3.GetComponent(); if (!Object.op_Implicit((Object)(object)val4)) { val4 = val3.GetComponentInChildren(true); } if (Object.op_Implicit((Object)(object)val4)) { ((TMP_Text)val4).text = message; } val3.SetActive(true); } } internal sealed class NativePrompt { private readonly MonoBehaviour _owner; private readonly ManualLogSource _log; private readonly ConfigEntry _showPrompt; private readonly ConfigEntry _scale; private readonly ConfigEntry _colourChoice; private readonly ConfigEntry _customColour; private readonly ConfigEntry _positionX; private readonly ConfigEntry _positionY; private readonly Func _textProvider; private readonly Func _visibleProvider; private readonly string _objectName; private readonly Vector2 _size; private GameObject? _panel; private RectTransform? _panelRect; private TextMeshProUGUI? _panelText; private Image? _panelImage; private Color _originalColour; private bool _dragging; private Vector3 _lastMousePosition; private string _lastText = string.Empty; internal NativePrompt(MonoBehaviour owner, ManualLogSource log, ConfigEntry showPrompt, ConfigEntry scale, ConfigEntry colourChoice, ConfigEntry customColour, ConfigEntry positionX, ConfigEntry positionY, Func textProvider, Func visibleProvider, string objectName, Vector2? size = null) { //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) _owner = owner; _log = log; _showPrompt = showPrompt; _scale = scale; _colourChoice = colourChoice; _customColour = customColour; _positionX = positionX; _positionY = positionY; _textProvider = textProvider; _visibleProvider = visibleProvider; _objectName = objectName; _size = (Vector2)(((??)size) ?? new Vector2(320f, 60f)); _scale.SettingChanged += delegate { ApplyScale(); }; _colourChoice.SettingChanged += delegate { ApplyColour(); }; _customColour.SettingChanged += delegate { ApplyColour(); }; _showPrompt.SettingChanged += delegate { UpdateVisibility(); }; } internal void Tick() { EnsureCreated(); RefreshText(); UpdateVisibility(); HandleDragging(); } internal void Refresh() { EnsureCreated(); RefreshText(force: true); ApplyScale(); ApplyColour(); UpdateVisibility(); } internal void Destroy() { if (Object.op_Implicit((Object)(object)_panel)) { Object.Destroy((Object)(object)_panel); } _panel = null; _panelRect = null; _panelText = null; _panelImage = null; } private void EnsureCreated() { //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: 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_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_012c: 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) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0196: 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) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)_panel) || (Object)(object)GameCanvas.Instance == (Object)null) { return; } Transform val = ((Component)GameCanvas.Instance).transform.Find("InteractableShowInfo/Container/TitleBCK"); if (!Object.op_Implicit((Object)(object)val)) { _log.LogWarning((object)"Could not find native prompt source: InteractableShowInfo/Container/TitleBCK"); return; } GameObject val2 = Object.Instantiate(((Component)val).gameObject, ((Component)GameCanvas.Instance).transform); ((Object)val2).name = _objectName; RectTransform component = val2.GetComponent(); if (!Object.op_Implicit((Object)(object)component)) { _log.LogWarning((object)"Native prompt clone has no RectTransform."); Object.Destroy((Object)(object)val2); return; } _panel = val2; _panelRect = component; component.anchorMin = new Vector2(0f, 1f); component.anchorMax = new Vector2(0f, 1f); component.pivot = new Vector2(0f, 1f); component.sizeDelta = _size; component.anchoredPosition = new Vector2(_positionX.Value, 0f - _positionY.Value); _panelImage = val2.GetComponent(); if (Object.op_Implicit((Object)(object)_panelImage)) { _originalColour = ((Graphic)_panelImage).color; } Transform obj = val2.transform.Find("Title_Text"); _panelText = ((obj != null) ? ((Component)obj).GetComponent() : null); if (!Object.op_Implicit((Object)(object)_panelText)) { _panelText = val2.GetComponentInChildren(true); } TextMeshProUGUI panelText = _panelText; if (panelText != null && Object.op_Implicit((Object)(object)panelText)) { RectTransform rectTransform = ((TMP_Text)panelText).rectTransform; rectTransform.anchorMin = Vector2.zero; rectTransform.anchorMax = Vector2.one; rectTransform.offsetMin = new Vector2(10f, 4f); rectTransform.offsetMax = new Vector2(-10f, -4f); ((TMP_Text)panelText).alignment = (TextAlignmentOptions)514; ((TMP_Text)panelText).textWrappingMode = (TextWrappingModes)0; ((TMP_Text)panelText).enableAutoSizing = true; ((TMP_Text)panelText).fontSizeMin = 12f; ((TMP_Text)panelText).fontSizeMax = 28f; } Graphic[] componentsInChildren = val2.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].raycastTarget = false; } ApplyScale(); ApplyColour(); RefreshText(force: true); UpdateVisibility(); } private void RefreshText(bool force = false) { TextMeshProUGUI panelText = _panelText; if (panelText != null && Object.op_Implicit((Object)(object)panelText)) { string text = _textProvider?.Invoke() ?? string.Empty; if (force || !string.Equals(text, _lastText, StringComparison.Ordinal)) { _lastText = text; ((TMP_Text)panelText).text = text; } } } private void ApplyScale() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) RectTransform panelRect = _panelRect; if (panelRect != null && Object.op_Implicit((Object)(object)panelRect)) { float num = Mathf.Clamp(_scale.Value, 0.5f, 2f); ((Transform)panelRect).localScale = new Vector3(num, num, 1f); } } private void ApplyColour() { //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) Image panelImage = _panelImage; if (panelImage != null && Object.op_Implicit((Object)(object)panelImage)) { byte b = (byte)Mathf.RoundToInt(_originalColour.a * 255f); Image val = panelImage; ((Graphic)val).color = (Color)(_colourChoice.Value switch { "Purple" => new Color(0.36f, 0.16f, 0.46f, _originalColour.a), "Blue" => new Color(0f, 0.69f, 0.94f, _originalColour.a), "Orange" => new Color(0.93f, 0.49f, 0.19f, _originalColour.a), "Green" => new Color(0.18f, 0.65f, 0.31f, _originalColour.a), "Red" => new Color(0.85f, 0.1f, 0.1f, _originalColour.a), "Demo Red" => Color32.op_Implicit(new Color32((byte)64, (byte)2, (byte)2, b)), "Custom" => _customColour.Value, _ => _originalColour, }); } } private void UpdateVisibility() { GameObject panel = _panel; if (panel != null && Object.op_Implicit((Object)(object)panel)) { bool flag = _showPrompt.Value && (_visibleProvider?.Invoke() ?? false); if (panel.activeSelf != flag) { panel.SetActive(flag); } } } private void HandleDragging() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_005e: 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_0078: 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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0096: 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) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: 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_00d3: Unknown result type (might be due to invalid IL or missing references) GameObject panel = _panel; RectTransform panelRect = _panelRect; if (panel == null || panelRect == null || !Object.op_Implicit((Object)(object)panel) || !Object.op_Implicit((Object)(object)panelRect) || !panel.activeInHierarchy || !Cursor.visible) { _dragging = false; return; } if (Input.GetMouseButtonDown(0) && RectTransformUtility.RectangleContainsScreenPoint(panelRect, Vector2.op_Implicit(Input.mousePosition), (Camera)null)) { _dragging = true; _lastMousePosition = Input.mousePosition; } if (_dragging && Input.GetMouseButton(0)) { Vector3 val = Input.mousePosition - _lastMousePosition; _lastMousePosition = Input.mousePosition; panelRect.anchoredPosition += new Vector2(val.x, val.y); _positionX.Value = panelRect.anchoredPosition.x; _positionY.Value = 0f - panelRect.anchoredPosition.y; } if (Input.GetMouseButtonUp(0)) { _dragging = false; } } } internal static class StartupBanner { internal static void Write(ManualLogSource log, string displayName, string version, string website, params string[] details) { log.LogWarning((object)"============================================="); log.LogMessage((object)(displayName + " v" + version + " Initializing...")); log.LogWarning((object)"============================================="); log.LogMessage((object)"Author: AcesGamingUK"); log.LogMessage((object)("GitHub: " + website)); if (details != null) { foreach (string text in details) { if (!string.IsNullOrWhiteSpace(text)) { log.LogMessage((object)text); } } } log.LogWarning((object)"============================================="); log.LogMessage((object)(displayName + " Initialized successfully!")); log.LogWarning((object)"============================================="); } } }