Please disclose if any significant portion of your mod was created 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 RadialQuickMessage v1.0.0
RadialQuickMessage.dll
Decompiled a year agousing System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using TMPro; using UnityEngine; using UnityEngine.Events; 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: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("Jor02")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+3b95e8201248fcaf0ffd5c34b191a9d640f43625")] [assembly: AssemblyProduct("RadialQuickMessage")] [assembly: AssemblyTitle("RadialQuickMessage")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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] [Microsoft.CodeAnalysis.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] [Microsoft.CodeAnalysis.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 RadialQuickMessage { public class RadialButton : MonoBehaviour { public string label; public string? message; public RadialContent[]? radialContent; public Image image; } [Serializable] public class RadialContent { public string? Label; public string? Message; public RadialContent[]? Children; } internal class RadialMenuManager : MonoBehaviour { [CompilerGenerated] private sealed class <CenterCursor>d__24 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CenterCursor>d__24(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; Cursor.lockState = (CursorLockMode)1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; Cursor.lockState = (CursorLockMode)0; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public UnityEvent<string?> OnMessageClicked = new UnityEvent<string>(); public float RadialSize = 250f; public float InnerCircleRange = 0.2f; public Color MenuColor = new Color(0f, 0f, 0f, 0.6039216f); public Color HoverColor = new Color(0.25098038f, 28f / 51f, 1f, 1f); public Sprite RadialSprite; public Sprite CenterSprite; public Sprite SeparatorSprite; public TextMeshProUGUI ReferenceLabel; private GameObject outerButtonRoot; private RadialButton radialCenterButton; private RadialButton[] outerButtons = new RadialButton[0]; private int sliceHovered = -1; private RadialContent[] currentContent; private Stack<RadialContent[]> menuStack = new Stack<RadialContent[]>(); private List<string?> selectedMessageStack = new List<string>(); public void Open(RadialContent[] content) { menuStack.Clear(); selectedMessageStack.Clear(); GenerateMenu(content, pushToStack: false); } public void Close() { if ((Object)(object)radialCenterButton != (Object)null) { Object.Destroy((Object)(object)((Component)radialCenterButton).gameObject); } Object.Destroy((Object)(object)outerButtonRoot); } public bool IsOpen() { if (!((Object)(object)radialCenterButton != (Object)null)) { return (Object)(object)outerButtonRoot != (Object)null; } return true; } private void GenerateMenu(RadialContent[] newContent, bool pushToStack = true) { if (Object.op_Implicit((Object)(object)RadialSprite) && Object.op_Implicit((Object)(object)CenterSprite) && Object.op_Implicit((Object)(object)SeparatorSprite)) { ((MonoBehaviour)this).StartCoroutine(CenterCursor()); if (pushToStack && currentContent != null) { menuStack.Push(currentContent); } currentContent = newContent; sliceHovered = -1; if (menuStack.Count > 0) { GenerateCenterButton(); } else if ((Object)(object)radialCenterButton != (Object)null) { Object.Destroy((Object)(object)((Component)radialCenterButton).gameObject); } GenerateRadialSlices(currentContent); Utils.SetLayerRecursively(((Component)this).gameObject, LayerMask.NameToLayer("UI")); } } private void GenerateCenterButton() { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: 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) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)radialCenterButton != (Object)null) { Object.Destroy((Object)(object)((Component)radialCenterButton).gameObject); } GameObject val = new GameObject("Center", new Type[3] { typeof(RectTransform), typeof(Image), typeof(RadialButton) }); val.transform.SetParent(((Component)this).transform, false); val.GetComponent<RectTransform>().sizeDelta = new Vector2(RadialSize, RadialSize); Image component = val.GetComponent<Image>(); component.sprite = CenterSprite; ((Graphic)component).color = MenuColor; RadialButton component2 = val.GetComponent<RadialButton>(); component2.image = component; radialCenterButton = component2; if ((Object)(object)ReferenceLabel != (Object)null) { Transform transform = ((Component)this).transform; RectTransform val2 = (RectTransform)(object)((transform is RectTransform) ? transform : null); Vector2 val3 = Vector2.op_Implicit(((Object)(object)val2 != (Object)null) ? ((Transform)val2).position : ((Component)this).transform.position); TextMeshProUGUI val4 = Object.Instantiate<TextMeshProUGUI>(ReferenceLabel, val.transform); ((TMP_Text)val4).text = "BACK"; ((Behaviour)val4).enabled = true; ((TMP_Text)val4).alignment = (TextAlignmentOptions)514; ((MaskableGraphic)val4).maskable = false; ((TMP_Text)val4).margin = Vector4.zero; RectTransform component3 = ((Component)val4).GetComponent<RectTransform>(); component3.pivot = new Vector2(0.5f, 0.5f); ((Transform)component3).position = Vector2.op_Implicit(val3); ((Transform)component3).rotation = Quaternion.identity; ((Transform)component3).localScale = Vector3.one; ((Component)component3).gameObject.SetActive(true); } } private void GenerateRadialSlices(params RadialContent[] content) { int num = content.Length; if (num <= 0) { RadialQuickMessage.Logger.LogWarning((object)"Number of slices must be greater than 0."); return; } Object.Destroy((Object)(object)outerButtonRoot); Transform parent = CreateSeparatorMasks(num); outerButtons = new RadialButton[num]; for (int i = 0; i < num; i++) { outerButtons[i] = CreateOuterButton(i, num, parent, content[i]); } } private Transform CreateSeparatorMasks(int numberOfSlices) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) Transform val = null; for (int i = 0; i < numberOfSlices; i++) { GameObject val2 = new GameObject($"Separator_{i}", new Type[3] { typeof(RectTransform), typeof(Image), typeof(Mask) }); val2.transform.SetParent(((Object)(object)val == (Object)null) ? ((Component)this).transform : val, false); if (i == 0) { outerButtonRoot = val2; } RectTransform component = val2.GetComponent<RectTransform>(); component.sizeDelta = new Vector2(RadialSize, RadialSize); ((Transform)component).localRotation = Quaternion.Euler(0f, 0f, -360f / (float)numberOfSlices + (float)((numberOfSlices == 2 && i == 0) ? 90 : 0)); Image component2 = val2.GetComponent<Image>(); component2.sprite = SeparatorSprite; val2.GetComponent<Mask>().showMaskGraphic = false; val = val2.transform; } return val; } private RadialButton CreateOuterButton(int index, int totalSlices, Transform parent, RadialContent content) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_01af: 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_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: 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) //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_026a: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject($"Slice_{index}", new Type[3] { typeof(RectTransform), typeof(Image), typeof(RadialButton) }); val.transform.SetParent(parent, false); RectTransform component = val.GetComponent<RectTransform>(); component.sizeDelta = new Vector2(RadialSize, RadialSize); ((Transform)component).localRotation = Quaternion.Euler(0f, 0f, -360f * (float)index / (float)totalSlices); Image component2 = val.GetComponent<Image>(); component2.sprite = RadialSprite; ((Graphic)component2).color = MenuColor; component2.type = (Type)3; component2.fillMethod = (FillMethod)4; component2.fillOrigin = 2; component2.fillAmount = 1f / (float)totalSlices; RadialButton component3 = val.GetComponent<RadialButton>(); component3.image = component2; component3.label = content.Label ?? content.Message ?? "Error"; component3.message = content.Message; component3.radialContent = content.Children; if ((Object)(object)ReferenceLabel != (Object)null) { Transform transform = ((Component)this).transform; RectTransform val2 = (RectTransform)(object)((transform is RectTransform) ? transform : null); Vector2 val3 = Vector2.op_Implicit(((Object)(object)val2 != (Object)null) ? ((Transform)val2).position : ((Component)this).transform.position); float num = RadialSize * 0.35f; float num2 = -360f / (float)totalSlices; float num3 = ((float)index + 0.5f) * num2 + (float)((totalSlices == 2) ? (-180) : 90); float num4 = num3 * (MathF.PI / 180f); Vector2 val4 = default(Vector2); ((Vector2)(ref val4))..ctor(Mathf.Cos(num4), Mathf.Sin(num4)); Vector2 val5 = val3 + val4 * num; TextMeshProUGUI val6 = Object.Instantiate<TextMeshProUGUI>(ReferenceLabel, val.transform); ((TMP_Text)val6).text = (content.Label ?? content.Message ?? "Error").ToUpper(); ((Behaviour)val6).enabled = true; ((TMP_Text)val6).alignment = (TextAlignmentOptions)514; ((MaskableGraphic)val6).maskable = false; ((TMP_Text)val6).margin = Vector4.zero; ((TMP_Text)val6).lineSpacing = -50f; RectTransform component4 = ((Component)val6).GetComponent<RectTransform>(); component4.pivot = new Vector2(0.5f, 0.5f); ((Transform)component4).position = Vector2.op_Implicit(val5); ((Transform)component4).rotation = Quaternion.identity; ((Transform)component4).localScale = Vector3.one; ((Component)component4).gameObject.SetActive(true); } return component3; } [IteratorStateMachine(typeof(<CenterCursor>d__24))] private IEnumerator CenterCursor() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CenterCursor>d__24(0); } private void Update() { //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_002d: 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) //IL_0037: 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_0084: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)radialCenterButton == (Object)null && (Object)(object)outerButtonRoot == (Object)null) { return; } Vector2 val = SemiFunc.UIMousePosToUIPos() - Vector2.op_Implicit(((Component)this).transform.position); float magnitude = ((Vector2)(ref val)).magnitude; if (magnitude > RadialSize * 0.5f) { sliceHovered = -1; UpdateSliceColors(); return; } int num = -1; if (magnitude < RadialSize * InnerCircleRange) { num = 0; } else if (outerButtons.Length != 0) { float num2 = Mathf.Atan2(0f - val.y, val.x) * 57.29578f + (float)((outerButtons.Length == 2) ? 180 : 90); num2 = (num2 + 360f) % 360f; float num3 = 360f / (float)outerButtons.Length; num = Mathf.FloorToInt(num2 / num3) + 1; } if (sliceHovered != num) { sliceHovered = num; if (UpdateSliceColors()) { MenuManager.instance.MenuEffectClick((MenuClickEffectType)4, (MenuPage)null, -1f, -1f, true); } } if (!Input.GetMouseButtonUp(0)) { return; } MenuManager.instance.MenuEffectClick((MenuClickEffectType)1, (MenuPage)null, 1f, 1f, true); RadialButton radialButton = GetRadialButton(sliceHovered); if (sliceHovered == 0) { GoBack(); return; } if (radialButton.radialContent != null && radialButton.radialContent.Length != 0) { selectedMessageStack.Add(radialButton.message); GenerateMenu(radialButton.radialContent); return; } string text = radialButton.message; for (int num4 = selectedMessageStack.Count - 1; num4 >= 0; num4--) { string text2 = selectedMessageStack[num4]; if (!string.IsNullOrEmpty(text2) && text2.Contains("{$}")) { text = text2.Replace("{$}", text); } else if (!string.IsNullOrEmpty(text2)) { text = text2 + text; } } if (OnMessageClicked != null) { OnMessageClicked.Invoke(text); } } private void GoBack() { if (menuStack.Count > 0) { RadialContent[] newContent = menuStack.Pop(); if (selectedMessageStack.Count > 0) { selectedMessageStack.RemoveAt(selectedMessageStack.Count - 1); } GenerateMenu(newContent, pushToStack: false); } } private bool UpdateSliceColors() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_005f: 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) for (int i = 0; i < outerButtons.Length; i++) { if ((Object)(object)outerButtons[i] == (Object)null) { Close(); return false; } Image component = ((Component)outerButtons[i]).GetComponent<Image>(); ((Graphic)component).color = MenuColor; } if ((Object)(object)radialCenterButton != (Object)null) { ((Graphic)radialCenterButton.image).color = MenuColor; } if (sliceHovered != -1) { RadialButton radialButton = GetRadialButton(sliceHovered); if ((Object)(object)radialButton == (Object)null) { return false; } ((Graphic)radialButton.image).color = HoverColor; } return true; } private RadialButton GetRadialButton(int index) { if (outerButtons.Length == 0 || index == 0) { return radialCenterButton; } return outerButtons[index - 1]; } } [BepInPlugin("Jor02.RadialQuickMessage", "RadialQuickMessage", "1.0")] [BepInProcess("REPO.exe")] public class RadialQuickMessage : BaseUnityPlugin { private RadialMenuManager radialMenu; private RadialQuickMessageConfig config; private CursorLockMode prevLockMode; internal static RadialQuickMessage Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } private void Awake() { Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; config = new RadialQuickMessageConfig(this); config.OnContentChanged += OnConfigChanged; Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); } private void OnConfigChanged(RadialContent[] _) { //IL_0011: 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) //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) radialMenu.MenuColor = config.MenuColor.Value; radialMenu.HoverColor = config.HoverColor.Value; } private void Update() { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0097: 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_004f: 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) if (!ChatManager.instance.localPlayerAvatarFetched) { return; } if ((Object)(object)radialMenu != (Object)null) { if (!radialMenu.IsOpen() && UnityInput.Current.GetKey(config.OpenMenuKey.Value)) { prevLockMode = Cursor.lockState; radialMenu.Open(config.Content); } else if (radialMenu.IsOpen()) { SemiFunc.CameraOverrideStopAim(); MenuCursor.instance.Show(); if (!UnityInput.Current.GetKey(config.OpenMenuKey.Value)) { radialMenu.Close(); Cursor.lockState = prevLockMode; } } } else { CreateRadialMenuManager(); } } private void CreateRadialMenuManager() { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)radialMenu != (Object)null) { Object.Destroy((Object)(object)radialMenu); } GameObject val = GameObject.Find("UI/HUD/HUD Canvas/HUD/"); TextMeshProUGUI component = GameObject.Find("UI/HUD/HUD Canvas/HUD/Chat/Chat Text/").GetComponent<TextMeshProUGUI>(); GameObject val2 = new GameObject("RadialMenu", new Type[2] { typeof(RectTransform), typeof(RadialMenuManager) }); val2.transform.SetParent(val.transform, false); val2.transform.SetSiblingIndex(val.transform.childCount - 2); RectTransform component2 = val2.GetComponent<RectTransform>(); component2.anchorMin = new Vector2(0.5f, 0.5f); component2.anchorMax = new Vector2(0.5f, 0.5f); component2.pivot = new Vector2(0.5f, 0.5f); component2.anchoredPosition = Vector2.zero; radialMenu = val2.GetComponent<RadialMenuManager>(); radialMenu.OnMessageClicked.AddListener((UnityAction<string>)RelayMessage); radialMenu.RadialSprite = Utils.CreateSpriteFromBytes(Resources.RadialCircle); radialMenu.CenterSprite = Utils.CreateSpriteFromBytes(Resources.RadialCenter); radialMenu.SeparatorSprite = Utils.CreateSpriteFromBytes(Resources.RadialSeparator); radialMenu.MenuColor = config.MenuColor.Value; radialMenu.HoverColor = config.HoverColor.Value; radialMenu.ReferenceLabel = component; } private void RelayMessage(string? message) { ChatManager.instance.ForceSendMessage(message ?? "Error"); } private void OnDestroy() { config?.Dispose(); } } internal class RadialQuickMessageConfig { private readonly RadialQuickMessage plugin; private readonly ManualLogSource logger; private FileSystemWatcher? contentWatcher; private static readonly JsonSerializerSettings serializerSettings = new JsonSerializerSettings { NullValueHandling = (NullValueHandling)1 }; public string ContentFilePath { get; private set; } public ConfigEntry<KeyCode> OpenMenuKey { get; private set; } public ConfigEntry<Color> MenuColor { get; private set; } public ConfigEntry<Color> HoverColor { get; private set; } public RadialContent[] Content { get; private set; } public event Action<RadialContent[]>? OnContentChanged; public RadialQuickMessageConfig(RadialQuickMessage plugin) { this.plugin = plugin; logger = RadialQuickMessage.Logger; string path = ((BaseUnityPlugin)plugin).Info.Metadata.GUID + ".content.json"; ContentFilePath = Path.Combine(Paths.ConfigPath, path); BindConfig(); LoadRadialContent(); StartWatchingContentFile(); } private void BindConfig() { //IL_0051: 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) OpenMenuKey = ((BaseUnityPlugin)plugin).Config.Bind<KeyCode>("Radial Menu", "Open Menu Key", (KeyCode)102, "Key used to open the radial menu."); MenuColor = ((BaseUnityPlugin)plugin).Config.Bind<Color>("Radial Menu", "Menu Color", new Color(0f, 0f, 0f, 0.6f), "Background color of the radial menu."); HoverColor = ((BaseUnityPlugin)plugin).Config.Bind<Color>("Radial Menu", "Hover Color", new Color(0.25f, 0.55f, 1f, 1f), "Hover color of the radial menu."); OpenMenuKey.SettingChanged += delegate { this.OnContentChanged?.Invoke(Content); }; MenuColor.SettingChanged += delegate { this.OnContentChanged?.Invoke(Content); }; HoverColor.SettingChanged += delegate { this.OnContentChanged?.Invoke(Content); }; } private void LoadRadialContent() { logger.LogInfo((object)("Loading radial content from " + ContentFilePath + ".")); if (!File.Exists(ContentFilePath)) { logger.LogWarning((object)"Radial content file not found. Creating default."); Content = GetDefaultRadialContent(); SaveRadialContent(); return; } try { string text = File.ReadAllText(ContentFilePath); Content = JsonConvert.DeserializeObject<RadialContent[]>(text); } catch (Exception ex) { logger.LogError((object)("Failed to load radial content: " + ex.Message)); Content = GetSyntaxErrorRadialContent(ex.Message); } } private void SaveRadialContent() { try { string contents = JsonConvert.SerializeObject((object)Content, (Formatting)1, serializerSettings); File.WriteAllText(ContentFilePath, contents); logger.LogInfo((object)"Radial content saved successfully."); } catch (Exception ex) { logger.LogError((object)("Failed to save radial content: " + ex.Message)); } } private void StartWatchingContentFile() { string directoryName = Path.GetDirectoryName(ContentFilePath); string fileName = Path.GetFileName(ContentFilePath); contentWatcher = new FileSystemWatcher(directoryName, fileName) { NotifyFilter = (NotifyFilters.FileName | NotifyFilters.Size | NotifyFilters.LastWrite) }; contentWatcher.Changed += delegate { ReloadContentDelayed(); }; contentWatcher.Renamed += delegate { ReloadContentDelayed(); }; contentWatcher.EnableRaisingEvents = true; } private void ReloadContentDelayed() { Task.Delay(200).ContinueWith(delegate { try { LoadRadialContent(); this.OnContentChanged?.Invoke(Content); logger.LogInfo((object)"Radial content reloaded from file."); } catch (Exception ex) { logger.LogError((object)("Error reloading radial content: " + ex.Message)); } }); } private RadialContent[] GetSyntaxErrorRadialContent(string error) { return new RadialContent[2] { new RadialContent { Message = "Syntax Error" }, new RadialContent { Message = "Full Error..", Children = new RadialContent[1] { new RadialContent { Message = error } } } }; } private RadialContent[] GetDefaultRadialContent() { return new RadialContent[7] { new RadialContent { Label = "HI..", Children = new RadialContent[4] { new RadialContent { Message = "Hi" }, new RadialContent { Message = "Hello" }, new RadialContent { Message = "Heya" }, new RadialContent { Message = "Greetings" } } }, new RadialContent { Label = "Reactions..", Children = new RadialContent[5] { new RadialContent { Label = "Thanks", Message = "Thanks!" }, new RadialContent { Message = "LOL" }, new RadialContent { Label = "Haha", Message = "Haha!" }, new RadialContent { Label = "Wow", Message = "Wow!" }, new RadialContent { Message = "LMAO" } } }, new RadialContent { Label = "I spot..", Message = "I spot {$}.", Children = new RadialContent[5] { new RadialContent { Label = "Valuable..", Message = "{$} valuable", Children = new RadialContent[4] { new RadialContent { Message = "Heavy" }, new RadialContent { Message = "Expensive" }, new RadialContent { Message = "Small" }, new RadialContent { Message = "Big" } } }, new RadialContent { Label = "Common..", Children = new RadialContent[6] { new RadialContent { Message = "Animal" }, new RadialContent { Message = "Duck" }, new RadialContent { Message = "Gnome" }, new RadialContent { Message = "Eye" }, new RadialContent { Message = "Skull" }, new RadialContent { Message = "Head" } } }, new RadialContent { Label = "Human-like..", Children = new RadialContent[5] { new RadialContent { Message = "Baby" }, new RadialContent { Message = "Big guy" }, new RadialContent { Message = "Stick lady" }, new RadialContent { Label = "Blind", Message = "Blind guy" }, new RadialContent { Message = "Upscream" } } }, new RadialContent { Label = "Supernatural..", Children = new RadialContent[6] { new RadialContent { Message = "Shadow Child" }, new RadialContent { Message = "Hugger" }, new RadialContent { Message = "Spewer" }, new RadialContent { Label = "Invisible", Message = "Invisible dude" }, new RadialContent { Message = "Laser guy" }, new RadialContent { Message = "Alien" } } }, new RadialContent { Label = "Other..", Children = new RadialContent[2] { new RadialContent { Message = "Frog" }, new RadialContent { Label = "Blowey", Message = "Blowey guy" } } } } }, new RadialContent { Message = "MONSTER" }, new RadialContent { Message = "RUN" }, new RadialContent { Label = "HELP..", Message = "HELP {$}", Children = new RadialContent[4] { new RadialContent { Label = "." }, new RadialContent { Label = "carry", Message = "carry please" }, new RadialContent { Message = "kill" }, new RadialContent { Message = "reach" } } }, new RadialContent { Label = "Bye..", Children = new RadialContent[2] { new RadialContent { Label = "Goodbye", Message = "Goodbye!" }, new RadialContent { Label = "Bye", Message = "Bye!" } } } }; } public void Dispose() { contentWatcher?.Dispose(); } } [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [DebuggerNonUserCode] [CompilerGenerated] internal class Resources { private static ResourceManager resourceMan; private static CultureInfo resourceCulture; [EditorBrowsable(EditorBrowsableState.Advanced)] internal static ResourceManager ResourceManager { get { if (resourceMan == null) { ResourceManager resourceManager = new ResourceManager("RadialQuickMessage.Resources", typeof(Resources).Assembly); resourceMan = resourceManager; } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] internal static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal static byte[] RadialCenter { get { object @object = ResourceManager.GetObject("RadialCenter", resourceCulture); return (byte[])@object; } } internal static byte[] RadialCircle { get { object @object = ResourceManager.GetObject("RadialCircle", resourceCulture); return (byte[])@object; } } internal static byte[] RadialSeparator { get { object @object = ResourceManager.GetObject("RadialSeparator", resourceCulture); return (byte[])@object; } } internal Resources() { } } internal class Utils { public static Sprite CreateSpriteFromBytes(byte[] imageData) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false); ImageConversion.LoadImage(val, imageData); Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height); Vector2 val3 = default(Vector2); ((Vector2)(ref val3))..ctor(0.5f, 0.5f); return Sprite.Create(val, val2, val3); } public static void SetLayerRecursively(GameObject obj, int newLayer) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown obj.layer = newLayer; foreach (Transform item in obj.transform) { Transform val = item; SetLayerRecursively(((Component)val).gameObject, newLayer); } } } }